در این مقاله در مورد راه اندازی TLS و SRTP صحبت میکنیم. پشتیبانی از پروتکل SRTP از استریسک 1.8 و همچنین TLS از استریسک 1.6 به بعد اضافه شد.
هدف در این پست امن کردن تماس ها میباشد. این آموزش را با استفاده از سافت فون Blink که سافت فون sip ساپورت بوده و برای سیستم عامل های Linux, Windows و Mac قابل استفاده میباشد.
در این پست تمامی دستورات باید تحت یوزر root اجرا شود (sudo , su)
بخش اول (TLS)
پروتکل TLS یا Transport Layer Security در حقیقت برای سیگنالینگ تماس (Call Signaling) عملیات encryption را فراهم میآورد. این یک شیوه عملی است که جلوگیری میکند از اینکه کاربران غیر از کاربر استریسک بدانند شما در حال تماس با چه شخصی هستید. راه اندازی پروتکل TLS بین سرور استریسک و یک کلاینت SIP شامل موارد زیر میباشد.
ایجاد Keys
ابتدا پوشه ای برای قرار دادن key های خود ایجاد میکنیم.
سپس از اسکریپت "ast_tls_cert" در دایرکتوری source استریسک در مسیر "/usr/src/asterisk-11.21.2/contrib/scripts" استفاده کنید و یک مجوز certificate self-signed و همچنین یک asterisk certificate ایجاد کنید.
آپشن های دستور بالا :
1 - از شما خواسته میشود تا برای/etc/asterisk/keys/ca.key یک پسورد وارد کنید که باید پسوردی انتخاب کنید که بعدا آن را به خاطر بیاورید.
2 - فایل/etc/asterisk/keys/ca.crt ایجاد خواهد شد.
3 - مجددا از شما خواسته میشود که پسورد وارد کنید و سپس فایل /etc/asterisk/keys/asterisk.key ایجاد خواهد شد.
4 - فایل /etc/asterisk/keys/asterisk.crt به صورت اتوماتیک ایجاد میشود.
5 - برای بار سوم از شما خواسته میشود تا پسورد را وارد کنید و فایل /etc/asterisk/keys/asterisk.pem ایجاد خواهد شد که ترکیبی از فایل های asterisk.key و asterisk.crt میباشد.
سپس برای دیوایس sip مان یک certificate کلاینت ایجاد میکنیم.
1- از شما پسوردی از قبل را میخواهد تا فایل /etc/asterisk/keys/ca.key را unlock کند.
اکنون پوشه key ها را بررسی کنید تا همه فایل های ایجاد شده در آن را ببینید. شما باید فایل های زیر را داشته باشید.
سپس فایل های malcolm.pem و ca.crt را در کامپیوتری که سافت فون blink روی آن در حال اجراست کپی کنید.
نکته : .p12 Client Certificates
اگر کلاینت شما به جای سرتیفیکیت بالا فایل certificate .p12 را بخواهد شما میتوانید با استفاده از openssl همانند دستور زیر آن را ایجاد کنید.
تنظیمات chan-pjsip در استریسک
اکنون تنظیمات مربوط به درایور channel در pjsip استریسک را به منظور استفاده از TLS کانفیگ میکنیم.
در فایل کانفیگ pjsip.conf شما باید یک TLS-capable transport را فعال کنید. که مثالی از آن شبیه به زیر خواهد بود.
به گزینه های protocol, cert_file, priv_key_file و method دقت کنید. در اینجا ما از پروتکل TLS استفاده میکنیم همچنین فایل های key که قبلا ایجاد کردیم را به جای cert_file و priv_key_file قرار میدهیم همچنین برای method از TLSv1 استفاده میکنیم.
سپس باید یک endpoint با پشتیبانی TLS ایجاد کنیم که همانند مثال زیر صورت میگیرد.
به آپشن media_encryption برای endpoint توجه کنید. در این مورد ما یک endpoint را تنظیم کردیم که از encription SDES برای RTP استفاده خواهد کرد.
شما ممکن است وسوسه شوید که گزینه transport=transport-tls را به endpoint اضافه کنید اما در ورژن های pjproject (حداقل در 2.4.5) این گزینه مشکل ایجاد خواهد کرد مانند Connection refused در یکسری مواقع. اجازه دهید pjproject خودش بخش transport را انجام دهد و اگر همچنان مشکلاتی وجود داشت گزینه rewrite_contact = yes را در تنظیمات endpoint تعریف کنید.
تنظیمات chan_sip در استریسک
اگر از chan_sip استفاده میکنید باید از بخش های زیر کمک بگیرید.
در فایل کانفیگ sip.conf موارد زیر را تعریف کنید.
در این قسمت ما پشتیبانی tls را فعال میکنیم و آن را به ipv4 wildcard لوکال مان bind میکنیم. (پورت دیفالت 5061 برای tls)
همچنین برای فایل certificate tls فایلی که در مراحل بالا ایجاد کردیم را تعریف میکنیم و مجوز certificate را برابر با مجوزی که قبلا ایجاد کردیم قرار میدهیم.
گزینه TLS Ciphers (رمز گذاری tls) برابر با ALL تعریف شده که به شدت امنیت آن بالاست.
برای گزینه TLS client method مقدار TLSv1 را تعریف کردیم که برای RFC ها و همچنین برای اکثر کلاینت ها مناسب است و ترجیح داده میشود.
سپس شما باید یک sip peer در استریسک تعریف کنید که از TLS به عنوان transport type استفاده میکند. در زیر مثالی از آن را مشاهده میکنید.
به گزینه transport توجه کنید. درایور sip channel در استریسک سه type را پشتیبانی میکند :
از آنجایی که ما سعی در کانفیگ tls داریم برای این مقدار tls را تعریف میکنیم. همچنین میتوانیم لیستی از چندین transport type پشتیبانی شده برای peer استفاده کنیم که با جدا کردن آنها توسط کاما در کانفیگ بالا صورت میگیرد.
تنظیم یک کلاینت SIP با TLS-enable برای صحبت با Asterisk
سپس شروع به تنظیم blink خواهیم کرد.
ابتدا یک اکانت جدید اضافه میکنیم.
سپس نیاز داریم تا تنظیمات اکانت را تغییر دهیم و تحت تنظیمات SIP باید Outbound Proxy تعریف کنیم تا به پورت TLS و همچنین Transport type موجود روی سرور استریسک مان متصل شود. در اینجا سرور استریسک ما روی پورت 5061 و همچنین روی هاست 10.24.13.233 میباشد.
اکنون باید تنظیمات اکانت TLS را به سمت Certificate کلاینت (malcolm.pem) که قبلا به کامپیوترمان کپی کردیم هدایت کنیم.
سپس تنظیمات سرور TLS را به فایل ca.crt که قبلا به کامپیوتر ما کپی کردیم هدایت میکنیم.
و در آخر با کلیک روی close خواهید دید که blink با موفقیت در استریسک ریجیستر میشود.
با توجه به log level کنسول استریسک تان باید چیزی شبیه به لاگ زیر مشاهده کنید.
دقت کنید که ما روی پورت 5061 (پورت TLS) ریجیستر شدیم.
اکنون از سافت فون تان یک تماس برقرار کنید باید یک باکس امنیتی کوچک (به شکل یک فقل) در پنجره تماس blink تان مشاهده کنید که نشان میدهد این تماس با استفاده از signaling امن (TLS) برقرار شده است.
مشکلات با بررسی سرور
اگر هاست یا ip که شما برای نام مشترک مورد نظر در certificate تان استفاده کردید با سرور تان match نباشد، هنگامی که کلاینت تان در حال تماس با استریسک میباشد شما دچار مشکل خواهید شد. مطمئن شوید که کلاینت به گونه ای config نشده باشد که سرور را با cert (سرتیفیکیت) بررسی کند.
زمانی که از استریسک یا کلاینت دیگر با blink تماس گرفته میشود شما ممکن است با error شبیه به زیر در کنسول استریسک رو به رو شوید.
این سناریور برعکس مورد ذکر شده در بالاست. جایی که استریسک به عنوان کلاینت عمل میکند و به صورت پیش فرض تلاش میکند تا سرور مقصد را با توجه به cert بررسی کند.
شما برای جلوگیری از این که استریسک تلاش به بررسی سرور نماید، میتوانید در sip.conf گزینه tlsdontverifyserver=yes را تعریف کنید.
بخش دوم SRTP
اکنون با فعال کردن TLS سیگنالینگ ما امن شده است در نتیجه هیچ کسی نمیتواند بفهمد که ما در حال زنگ زدن به کدام داخلی روی pbx هستیم. اما مدیای ما هنوز امن نمیباشد در نتیجه یک نفر میتواند مکالمات RTP (مدیا) را از طریق سیم snoop (شنود) کند. برای رفع این مشکل همانند زیر عمل کنید.
پشتیبانی از SRTP توسط Libsrtp فراهم میگردد. libsrtp باید روی سیستم و قبل از کامپایل استریسک نصب شود. در غیر اینصورت شما پیغام زیر را مشاهده خواهید کرد.
اگر پیغام بالا را در کنسول استریسک تان مشاهده کردید libsrtp (و development headers) را نصب کنید و سپس استریسک را دوباره نصب نمایید. (./configure; make; make install)
با تکمیل مراحل بالا به فایل sip.conf و قسمت مربوط به peer مورد نظر برمیگردیم و یک خط جدید encryption به آن اضافه میکنیم همانند زیر.
سپس در blink تعریف میکنیم که از SRTP هم استفاده کند.
تنظیمات sip استریسک را reload کنید. (sip reload) سپس یک تماس برقرار کنید. همانطور که میبینید یک box به شکل قفل در مقابل قسمت مربوط به مدیا اضافه شده است.
همانطور که دیدی تماس ها را با استفاده از TLS (سیگنالینگ) و SRTP (مدیا) امن کردیم.
هدف در این پست امن کردن تماس ها میباشد. این آموزش را با استفاده از سافت فون Blink که سافت فون sip ساپورت بوده و برای سیستم عامل های Linux, Windows و Mac قابل استفاده میباشد.
در این پست تمامی دستورات باید تحت یوزر root اجرا شود (sudo , su)
بخش اول (TLS)
پروتکل TLS یا Transport Layer Security در حقیقت برای سیگنالینگ تماس (Call Signaling) عملیات encryption را فراهم میآورد. این یک شیوه عملی است که جلوگیری میکند از اینکه کاربران غیر از کاربر استریسک بدانند شما در حال تماس با چه شخصی هستید. راه اندازی پروتکل TLS بین سرور استریسک و یک کلاینت SIP شامل موارد زیر میباشد.
- ایجاد فایل های Key
- تغییر کانفیگ SIP در Asterisk به منظور فعال سازی TLS
- ایجاد یک داخلی SIP که امکان TLS برای آن فراهم شده
- تغییرات در کلاینت SIP به منظور برقراری ارتباط با Asterisk از طریق TLS
ایجاد Keys
ابتدا پوشه ای برای قرار دادن key های خود ایجاد میکنیم.
کد PHP:
mkdir /etc/asterisk/keys
کد PHP:
./ast_tls_cert -C pbx.mycompany.com -O "My Super Company" -d /etc/asterisk/keys
آپشن های دستور بالا :
- آپشن -C : برای مشخص کردن host یا نام DNS یا IP Address ما مورد استفاده قرار میگیرد.
- آپشن -O : نام سازمانی مان را مشخص میکند.
- آپشن -d : برای مشخص کردن مسیر قرار گرفتن key ها مورد استفاده قرار میگیرد.
1 - از شما خواسته میشود تا برای/etc/asterisk/keys/ca.key یک پسورد وارد کنید که باید پسوردی انتخاب کنید که بعدا آن را به خاطر بیاورید.
2 - فایل/etc/asterisk/keys/ca.crt ایجاد خواهد شد.
3 - مجددا از شما خواسته میشود که پسورد وارد کنید و سپس فایل /etc/asterisk/keys/asterisk.key ایجاد خواهد شد.
4 - فایل /etc/asterisk/keys/asterisk.crt به صورت اتوماتیک ایجاد میشود.
5 - برای بار سوم از شما خواسته میشود تا پسورد را وارد کنید و فایل /etc/asterisk/keys/asterisk.pem ایجاد خواهد شد که ترکیبی از فایل های asterisk.key و asterisk.crt میباشد.
سپس برای دیوایس sip مان یک certificate کلاینت ایجاد میکنیم.
کد PHP:
./ast_tls_cert -m client -c /etc/asterisk/keys/ca.crt -k /etc/asterisk/keys/ca.key -C phone1.mycompany.com -O "My Super Company" -d /etc/asterisk/keys -o malcolm
- آپشن -m client : به اسکریپت میگوید که نیاز به یک client certificate داریم و نه یک server certificate
- آپشن "-c /etc/asterisk/keys/ca.crt": مشخص کننده مجوز certificate (برای خودمان) است که از آن استفاده میکنیم.
- آپشن "-k /etc/asterisk/keys/ca.key" : برای مجوز certificate تعریف شده در بالا key فراهم میکند.
- آپشن -C : از آنجایی که این بار میخواهیم برای یک کلاینت تعریف کنیم از این آپشن برای مشخص کردن hostname یا ip address سیپ فون مان (sip phone) استفاده میکنیم.
- آپشن -O : نام سازمانی مان را مشخص میکند.
- آپشن -d : پوشه برای قرار گرفتن فایل های key را مشخص مینماید.
- آپشن -o : نام فایل key میباشد که میخواهیم ایجاد شود.
1- از شما پسوردی از قبل را میخواهد تا فایل /etc/asterisk/keys/ca.key را unlock کند.
اکنون پوشه key ها را بررسی کنید تا همه فایل های ایجاد شده در آن را ببینید. شما باید فایل های زیر را داشته باشید.
کد PHP:
asterisk.crt
asterisk.csr
asterisk.key
asterisk.pem
malcolm.crt
malcolm.csr
malcolm.key
malcolm.pem
ca.cfg
ca.crt
ca.key
tmp.cfg
نکته : .p12 Client Certificates
اگر کلاینت شما به جای سرتیفیکیت بالا فایل certificate .p12 را بخواهد شما میتوانید با استفاده از openssl همانند دستور زیر آن را ایجاد کنید.
کد:
# openssl pkcs12 -export -out MySuperClientCert.p12 -inkey ca.key -in ca.crt -certfile asterisk.crt
تنظیمات chan-pjsip در استریسک
اکنون تنظیمات مربوط به درایور channel در pjsip استریسک را به منظور استفاده از TLS کانفیگ میکنیم.
در فایل کانفیگ pjsip.conf شما باید یک TLS-capable transport را فعال کنید. که مثالی از آن شبیه به زیر خواهد بود.
کد PHP:
[transport-tls]
type=transport
protocol=tls
bind=0.0.0.0:5061
cert_file=/etc/asterisk/keys/asterisk.crt
priv_key_file=/etc/asterisk/keys/asterisk.key
method=tlsv1
سپس باید یک endpoint با پشتیبانی TLS ایجاد کنیم که همانند مثال زیر صورت میگیرد.
کد PHP:
[malcolm]
type=aor
max_contacts=1
remove_existing=yes
[malcolm]
type=auth
auth_type=userpass
username=malcolm
password=useabetterpasswordplease
[malcolm]
type=endpoint
aors=malcolm
auth=malcolm
context=local
disallow=all
allow=g722
dtmfmode=rfc4733
media_encryption=sdes
به آپشن media_encryption برای endpoint توجه کنید. در این مورد ما یک endpoint را تنظیم کردیم که از encription SDES برای RTP استفاده خواهد کرد.
شما ممکن است وسوسه شوید که گزینه transport=transport-tls را به endpoint اضافه کنید اما در ورژن های pjproject (حداقل در 2.4.5) این گزینه مشکل ایجاد خواهد کرد مانند Connection refused در یکسری مواقع. اجازه دهید pjproject خودش بخش transport را انجام دهد و اگر همچنان مشکلاتی وجود داشت گزینه rewrite_contact = yes را در تنظیمات endpoint تعریف کنید.
تنظیمات chan_sip در استریسک
اگر از chan_sip استفاده میکنید باید از بخش های زیر کمک بگیرید.
در فایل کانفیگ sip.conf موارد زیر را تعریف کنید.
کد PHP:
tlsenable=yes
tlsbindaddr=0.0.0.0
tlscertfile=/etc/asterisk/keys/asterisk.pem
tlscafile=/etc/asterisk/keys/ca.crt
tlscipher=ALL
tlsclientmethod=tlsv1 ;none of the others seem to work with Blink as the client
همچنین برای فایل certificate tls فایلی که در مراحل بالا ایجاد کردیم را تعریف میکنیم و مجوز certificate را برابر با مجوزی که قبلا ایجاد کردیم قرار میدهیم.
گزینه TLS Ciphers (رمز گذاری tls) برابر با ALL تعریف شده که به شدت امنیت آن بالاست.
برای گزینه TLS client method مقدار TLSv1 را تعریف کردیم که برای RFC ها و همچنین برای اکثر کلاینت ها مناسب است و ترجیح داده میشود.
سپس شما باید یک sip peer در استریسک تعریف کنید که از TLS به عنوان transport type استفاده میکند. در زیر مثالی از آن را مشاهده میکنید.
کد PHP:
[malcolm]
type=peer
secret=malcolm ;note that this is NOT a secure password
host=dynamic
context=local
dtmfmode=rfc2833
disallow=all
allow=g722
transport=tls
- udp
- tcp
- tls
از آنجایی که ما سعی در کانفیگ tls داریم برای این مقدار tls را تعریف میکنیم. همچنین میتوانیم لیستی از چندین transport type پشتیبانی شده برای peer استفاده کنیم که با جدا کردن آنها توسط کاما در کانفیگ بالا صورت میگیرد.
تنظیم یک کلاینت SIP با TLS-enable برای صحبت با Asterisk
سپس شروع به تنظیم blink خواهیم کرد.
ابتدا یک اکانت جدید اضافه میکنیم.
سپس نیاز داریم تا تنظیمات اکانت را تغییر دهیم و تحت تنظیمات SIP باید Outbound Proxy تعریف کنیم تا به پورت TLS و همچنین Transport type موجود روی سرور استریسک مان متصل شود. در اینجا سرور استریسک ما روی پورت 5061 و همچنین روی هاست 10.24.13.233 میباشد.
اکنون باید تنظیمات اکانت TLS را به سمت Certificate کلاینت (malcolm.pem) که قبلا به کامپیوترمان کپی کردیم هدایت کنیم.
سپس تنظیمات سرور TLS را به فایل ca.crt که قبلا به کامپیوتر ما کپی کردیم هدایت میکنیم.
و در آخر با کلیک روی close خواهید دید که blink با موفقیت در استریسک ریجیستر میشود.
با توجه به log level کنسول استریسک تان باید چیزی شبیه به لاگ زیر مشاهده کنید.
کد PHP:
-- Registered SIP 'malcolm' at 10.24.250.178:5061
> Saved useragent "Blink 0.22.2 (MacOSX)" for peer malcolm
اکنون از سافت فون تان یک تماس برقرار کنید باید یک باکس امنیتی کوچک (به شکل یک فقل) در پنجره تماس blink تان مشاهده کنید که نشان میدهد این تماس با استفاده از signaling امن (TLS) برقرار شده است.
مشکلات با بررسی سرور
اگر هاست یا ip که شما برای نام مشترک مورد نظر در certificate تان استفاده کردید با سرور تان match نباشد، هنگامی که کلاینت تان در حال تماس با استریسک میباشد شما دچار مشکل خواهید شد. مطمئن شوید که کلاینت به گونه ای config نشده باشد که سرور را با cert (سرتیفیکیت) بررسی کند.
زمانی که از استریسک یا کلاینت دیگر با blink تماس گرفته میشود شما ممکن است با error شبیه به زیر در کنسول استریسک رو به رو شوید.
کد PHP:
[Jan 29 16:04:11] DEBUG[11217]: tcptls.c:248 handle_tcptls_connection: SSL Common Name compare s1='10.24.18.124' s2='phone1.mycompany.com'
[Jan 29 16:04:11] ERROR[11217]: tcptls.c:256 handle_tcptls_connection: Certificate common name did not match (10.24.18.124)
شما برای جلوگیری از این که استریسک تلاش به بررسی سرور نماید، میتوانید در sip.conf گزینه tlsdontverifyserver=yes را تعریف کنید.
کد PHP:
;tlsdontverifyserver=[yes|no]
; If set to yes, don't verify the servers certificate when acting as
; a client. If you don't have the server's CA certificate you can
; set this and it will connect without requiring tlscafile to be set.
; Default is no.
بخش دوم SRTP
اکنون با فعال کردن TLS سیگنالینگ ما امن شده است در نتیجه هیچ کسی نمیتواند بفهمد که ما در حال زنگ زدن به کدام داخلی روی pbx هستیم. اما مدیای ما هنوز امن نمیباشد در نتیجه یک نفر میتواند مکالمات RTP (مدیا) را از طریق سیم snoop (شنود) کند. برای رفع این مشکل همانند زیر عمل کنید.
پشتیبانی از SRTP توسط Libsrtp فراهم میگردد. libsrtp باید روی سیستم و قبل از کامپایل استریسک نصب شود. در غیر اینصورت شما پیغام زیر را مشاهده خواهید کرد.
کد PHP:
[Jan 24 09:29:16] ERROR[10167]: chan_sip.c:27987 setup_srtp: No SRTP module loaded, can't setup SRTP session.
با تکمیل مراحل بالا به فایل sip.conf و قسمت مربوط به peer مورد نظر برمیگردیم و یک خط جدید encryption به آن اضافه میکنیم همانند زیر.
کد PHP:
[malcolm]
type=peer
secret=malcolm ;note that this is NOT a secure password
host=dynamic
context=local
dtmfmode=rfc2833
disallow=all
allow=g722
transport=tls
encryption=yes
context=local
تنظیمات sip استریسک را reload کنید. (sip reload) سپس یک تماس برقرار کنید. همانطور که میبینید یک box به شکل قفل در مقابل قسمت مربوط به مدیا اضافه شده است.
همانطور که دیدی تماس ها را با استفاده از TLS (سیگنالینگ) و SRTP (مدیا) امن کردیم.
کامنت