امنيت در VoIP، موضوعي است که با گسترش روزافزون استفاده از سيستمهاي تلفني تحت شبکه از اهميت بيشتري برخوردار شده است. فريسوئيچ هم به عنوان يکي از نرمافزارهاي مديريت تماس متنباز از روشها و تکنولوژيهاي مختلفي براي برقراري امنيت استفاده ميکند. براي برقراري امنيت در فريسوئيچ از دو دسته روشهاي پيشگيرانه (proactive) و تدافعي (defensive) استفاده شده است. در روشهاي پيشگيرانه از انواع مختلف روشهاي رمزنگاري براي غيرقابل مشاهده و شنودکردن ارتباطات SIP و RTP استفاده شده است و در روشهاي تدافعي، فريسوئيچ با استفاده همزمان از ابزارهاي متنباز ديگري مانند Fail2Ban، ميتواند ترافيکهاي مشکوک از منابع ناشناس را شناسايي و مسدود کند. اهميت استفاده همزمان از فريسوئيچ و اين ابزارهاي امنيتي در يک محيط عملياتي امري غيرقابل اجتناب است که در ادامه به آن خواهيم پرداخت.
اين مقاله از چهار بخش زير تشکيل شده است:
- امنيت در لايه شبکه
- برقراري امنيت در پروتکلهاي signaling
- برقراري امنيت در پروتکلهاي انتقال صدا
- حفاظت از کلمههاي عبور
امنيت در لايه شبکه
اغلب افراد خرابکار از پورتهاي باز شبکه براي نفوذ به سيستمهاي ويپ استفاده ميکنند. آنها معمولا به دنبال کلمات عبور آسان و قابل حدس و يا باگهاي نرمافزاري شناخته شده هستند که با استفاده از آنها کنترل سيستم تلفني شما را به دست بگيرند و به اهدافي مانند سوءاستفاده از خطوط شهري، شنود مکالمات و سرقت اطلاعات (مانند پيامهاي صوتي) دست يابند.
شبکه، نقطه ورود به سيستم تلفني شما است، بنابراين مهم است که توجه بيشتري به نحوه پيکربندي شبکه خود داشته باشيد و علاوه بر استفاده از روشهاي مرسوم برقراري امنيت، از قابليتهاي ويژه فريسوئيچ نيز در جهت برقراري امنيت بيشتر استفاده کنيد.
مجزا کردن پورتهاي شبکه و محدودکردن ترافيک
SIP، يکي از پروتکلهايي است که معمولا در بستر اينترنت بيشتر مورد هدف هکرها قرار ميگيرد. هکرها، در بيشتر موارد سعي ميکنند با ارسال بستههاي UDP براي تعداد زيادي از آدرسهاي IP، پورت ۵۰۶۰ آنها را اسکن کنند و سرورهايي که پاسخ ميدهند را شناسايي کنند. سپس، به محض شناسايي اين نوع سرورها، تلاش ميکنند با استفاده از روشهاي آزمون و خطا (brute-force) کلمات عبور سيستم را پيدا کنند. در بعضي موارد هم با ارسال ترافيک سنگين به سمت آنها سعي ميکنند در کار سرورها اختلال ايجاد کنند.
يکي از روشهاي اوليه محافظت از فريسوئيچ، مجزا کردن پورتهاي شبکه سرور SIP و اعمال قوانين متفاوت فايروال يا IPTables براي هر کدام از آنها است.
يکي از قابليتهاي فريسوئيچ اين است که به شما اين امکان را ميدهد که بر روي يک سرور، پروفايلهاي SIP مختلفي ايجاد و ترافيک SIP را از طريق IPها و پورتهاي مختلفي ارسال و دريافت کنيد. چيزي که ممکن است واضح به نظر نرسد اين است که اين قابليت براي ايجاد يک لايه اضافه براي برقراري امنيت مفيد است.
پروفايلهاي SIP، contextهاي پيشفرض خود را دارند که براي مسيريابي تماسهاي ورودي خود از آن استفاده ميکنند. Dialplanهايي که در هر کدام از contextها قرار ميگيرند ميتوانند کاملا محدود باشند. با ترکيب Dialplanها و Contextهاي محدود شده با پروفايلهاي SIP مرتبط، احتمال سوء استفاده از سيستم تلفني شما کاهش مييابد حتي اگر سهوا تنظيمات اشتباهي هم انجام داده باشيد.
علاوه بر اين، هر کدام از پروفايلهاي SIP ميتوانند ليست کنترل دسترسي (ACL) مربوط به خود را داشته باشند. با استفاده از ACLها، شما ميتوانيد محدوديت آدرسهاي IP عمومي خود را بيشتر و محدوديت آدرسهاي IP خصوصي را کمتر کنيد.
از منظر کارايي اگر بخواهيم بررسي کنيم، بايد گفت که طراحي فريسوئيچ طوري است که هرکدام از پروفايلهاي SIP در يک thread جداگانه اجرا ميشوتد. داشتن thread مجزا براي هر آدرس IP و پورت بدين معني است که شما ميتوانيد اختلال افراد خرابکار را به حداقل برسانيد. لازم است که به اين نکته اشاره شود که اين روش به هيچ وجه راهحلي کامل و بدون نقص براي محافظت از سيستم تلفني شما نخواهد بود و بايد براي جلوگيري از حملات احتمالي به راهکارهاي ديگري نيز بينديشيد.
پيکربندي نمونه – ساده
در سادهترين حالت، داشتن يک پروفايل SIP براي ارتباط با تامينکنندههاي خدمات تلفني اينترنتي (ITSP) و يک پروفايل SIP براي ارتباط با تلفنهاي داخلي روشي مرسوم است. اغلب فعاليتهاي خرابکارانه با اسکن پورت ۵۰۶۰ آغاز ميشود، سپس ترکيبات مختلفي از روشهاي احراز هويت بررسي و آزمايش ميشوند تا بالاخره راهي براي نفوذ پيدا شود. اگر شما دسترسي به IP سرور خود را محدود کنيد، از شماره پورت تصادفي استفاده کنيد و فقط اجازه ورود تماسها با اعمال ACL هاي محدود را بدهيد، به راحتي ميتوانيد جلوي افرادي که قصد دسترسي به سيستم تلفني شما را دارند بگيريد حتي اگر نامکاربري و کلمهعبور درستي هم داشته باشند.
تصوير زير پيکربندي شبکهايي را نشان ميدهد که افراد معمولا به صورت پيشفرض از فريسوئيچ استفاده ميکنند:
و در تصوير زير پيکربندي شبکهايي نشان داده شده است که با استفاده از دو پروفايل SIP و استفاده از شماره پورتهاي غير معمول کار هکرها سختتر شده است. ضمنا، شما ميتوانيد با استفاده از فايروال پورتهاي شبکه عمومي خود را محدودتر کنيد:
تنظيمات مثال قبل براي فري سوئيچ در زير آمده است:
<profile name=”incoming_from_pstn”>
<settings>
<param name=”auth-calls” value=”true”/>
<param name=”apply-inbound-acl” value=”my_carriers”/>
<param name=”context” value=”inbound_call”/>
<param name=”sip-port” value=”5678″/>
… ساير تنظيمات …
</settings>
</profile>
با تنظيمات فوق، پروفايل SIPئي با نام incoming_from_pstn ايجاد ميشود که تماسهاي ورودي را از پورت ۵۶۷۸ دريافت ميکند. به محض دريافت تماس، ACLئي با نام my_carriers بر روي آن اعمال ميشود تا در صورتيکه از مبدائي ناشناس دريافت شده باشد آن را مسدود کند. حتي اگر در نوشتن قوانين ACL اشتباه کرده باشيد و اجازه ورود تماس از مبدا ناشناس را هم بدهد جاي هيچ نگراني نيست چون در مرحله بعد، تماس براي مسيريابي براي contextئي با نام inbound_call فرستاده ميشود که اجازه برقراري تماسهاي خروجي را نميدهد.
علاوه بر تنظيمات مربوط به فريسوئيچ، چون IPهاي Carrierهاي شما مشخص هستند ميتوانيد با تغيير قوانين فايروال سيستم عامل خود ترافيک را تنها از آن IPها دريافت کنيد.
در مرحله بعد، براي کاربران داخلي خود بايد پروفايل SIPئي با تنظيمات زير ايجاد کنيد:
<profile name=”customer_access”>
<settings>
<param name=”auth-calls” value=”true”/>
<param name=”apply-inbound-acl” value=”default_deny_list”/>
<param name=”context” value=”customer_call”/>
<param name=”sip-port” value=”23000″/>
… ساير تنظيمات …
</settings>
</profile>
در اين پروفايل، تماسهايي که از شبکه داخلي براي پورت ۲۳۰۰۰ ارسال ميشوند، اولا بايد احراز هويت شوند (نامکاربري و کلمه عبور)، سپس ACLئي با نام default_deny_list بر روي آن اعمال ميشود که جلوي دريافت تماس از همه IPها را ميگيرد جزء IPهاي داخلي. بعد از گذر تماس از مراحل قبل سپس براي contextئي با نام customer_call فرستاده ميشود تا مسيريابي بر روي آن انجام شود.
پيکربندي نمونه – پيچيده
يک مثال پيچيدهتر براي پيکربندي سيستم تلفني با فريسوئيچ، جداسازي شبکه سيستم تلفني از شبکه کامپيوتري با استفاده از تجهيزات سختافزاري مجزا يا تنظيمات VLAN است. حتي اگر بخواهيم پيکربندي را پيچيدهتر کنيم ميتوانيم با نصب دو کارت شبکه از آدرسهاي IP متفاوت براي شبکههاي مختلف استفاده کنيم.
براي انجام اين پيکربندي شما به دو پروفايل SIP با تنظيمات زير نياز داريد:
<profile name=”incoming_from_pstn”>
<settings>
<param name=”auth-calls” value=”true”/>
<param name=”apply-inbound-acl” value=”my_carriers”/>
<param name=”context” value=”inbound_call”/>
<param name=”sip-port” value=”5678″/>
<param name=”sip-ip” value=”2.3.4.5″/>
… ساير تنظيمات …
</settings>
</profile>
<profile name=”customer_access”>
<settings>
<param name=”auth-calls” value=”true”/>
<param name=”apply-inbound-acl” value=”default_deny_list”/>
<param name=”context” value=”customer_call”/>
<param name=”sip-port” value=”23000″/>
<param name=”sip-ip” value=”212.222.33.111″/>
… ساير تنظيمات …
</settings>
</profile>
در تنظيمات فوق اگر دقت کنيد، ميبينيد که مقدار sip-ip ها با يکديگر تفاوت دارد. به عنوان مثال آدرس IP، ۲٫۳٫۴٫۵ ميتواند براي شبکه داخلي و آدرس IP، ۲۱۲٫۲۲۲٫۳۳٫۱۱ براي شبکه عمومي (اينترنت) استفاده شده است (شکل زير). بر روي پورت شبکه عمومي ميتوانيد قوانين ACL و يا فايروالي بنويسيد که تنها تماسهاي ورودي از Carrierها را بپذيرد مگر اينکه کاربراني داشته باشيد که از خارج از مجموعه شما و از طريق اينترنت قصد اتصال به سيستم تلفني را داشته باشند. يک راهحل براي دادن دسترسي به اين دسته از کاربران استفاده از VPN است، که به امنيت شبکه شما ميافزايد.
VLAN
VLANها، راهحلي عالي براي جداسازي سيستم تلفني از شبکه داده شما هستند که اگر پيکربندي آن به درستی انجام شود، علاوه بر بهبود کيفيت تماسهاي شما جلوي اعمال خرابکارانه را نيز خواهد گرفت.
VLANها، اغلب ناديده گرفته و معمولا به عنوان راهکاری اختياري تلقی میشوند، اما بيشترين صدمه به سيستم تلفني از طريق شبکههايي بوده که شبکه داده آن با شبکه تلفن يکي بوده است. در شبکههاي داخلي، تشخيص IP دستگاهها و ورود به آنها کار زياد سختي نيست. براي مثال اگر شما تحت وب به يک تلفن polycom (به دليل استفاده از کلمات عبور پيشفرض و يا قابل حدس) وارد شويد، ميتوانيد تنظيمات آن را بر روي يک کامپيوتر ذخيره کنيد و نامکاربري و کلمه عبور آن را از فايل متني استخراج کنيد. اگر اين تلفن در شبکه مخصوص تلفنها قرار داشت مسلما به راحتي اينکار شدني نبود. علاوه بر اين، VLANها ميتوانند جلوي ارسال دادههاي زائد از طرف کامپيوترها را بگيرند که ضمن کاهش کيفيت تماسها ميتوانند باعث اختلال در روند کار سيستم تلفني نيز شوند.
تنظيمات مربوط به VLANها از حوصله اين بحث خارج است، اما لازم به ذکر است که در اغلب شبکهها امکان استفاده از VLANها چه به صورت port-based tagging و چه software-based tagging وجود دارد و تقريبا همه IP Phoneها و تجهيزات سختافزاري امروزي از VLANها پشتيباني ميکنند، بنابراين به عنوان راهحلي عالي در جهت بهبود امنيت سيستم تلفني نبايد ناديده گرفته شوند.
تشخيص نفوذ (Intrusion detection)
تشخيص آنلاين و خودکار اينکه فرد يا افرادي در حال تلاش براي دسترسي به سيستم تلفني يا خرابکاري آن هستند، ميتواند چالش برانگيز باشد. هرچند ممکن است که اين کار ساده و بديهي به نظر برسد، اما موارد خاصي (فوت کوزهگري) وجود دارد که بايد در هنگام نوشتن قوانين آن مورد بررسي قرار بگيرد.
نظارت بر Registration
بعضي ابزارها، با ارسال دادههاي تقلبي زياد (به منظور Register کردن) به سمت سرور بدون اينکه منتظر پاسخي باشند، باعث اختلال در کار سيستم تلفني ميشوند. يکي از اين ابزارها friendly scanner يا SIPvicious است. اين دسته از ابزارها سيستم تلفني را با ارسال درخواستهاي نادرست مشغول نگه ميدارند، بارکاري سيستم را افزايش ميدهند، امکان پاسخ به درخواستهاي درست را سخت ميکنند و …. علاوه بر اين، بعضي رفتارهاي مشکوک مانند تلاشهاي زياد در يک بازه زماني کم براي تماس با مقاصد بينالمللي ميتوانند از طريق روشهاي تشخيص نفوذ تشخيص داده شوند.
فريسوئيچ، تمام تلاشهايي که به منظور احراز هويت انجام ميشوند را به صورت اخطار (warning) ثبت ميکند. برنامههايي مانند Fail2Ban ميتوانند از اين دادهها استفاده کنند و با توجه به بازه زماني و تعداد تلاشهاي موفق و ناموفق، ترافيکهاي مشکوک را شناسايي کنند و با تغيير در قوانين فايروال سرور، IPهاي فرستنده ترافيک مشکوک را به صورت موقت و يا هميشگي مسدود کنند. به طور کلي ترافيک آدرس IPئي مشکوک تشخيص داده ميشود که در يک بازه زماني کوتاه تعداد زيادي تلاش براي احراز هويت ارسال کرده باشد.
براي اطمينان از اينکه فريسوئيچ در هنگام تلاش ناموفق براي احرازهويت اخطار ثبت ميکند، ميتوانيد مقدار پارامتر log-auth-failures را که جزء تنظيمات پروفايلهاي SIP ميباشد را بررسي کنيد و در صورت نياز مقدار آن را تغيير دهيد.
<param name=”log-auth-failures” value=”true”/>
اطلاعاتي که فريسوئيچ در هنگام احراز هويت به صورت اخطار ثبت ميکند مشابه مثال زير است:
[WARNING] SIP auth challenge (REGISTER) on sofia profile ‘customer_access’ for
[user_rdkj7h@2600hz.com] from ip 184.106.157.100
Fail2Ban
Fail2Ban، يک نرمافزار جانبي است که در پس زمينه اجرا ميشود و لاگها را کنترل ميکند. به محض اينکه رفتار مشکوکي را تشخيص دهد، يکي از کارهاي از پيش تعيين شده را انجام ميدهد. مثلا ميتواند طوري برنامهريزي شود که ايميل براي شما ارسال کند يا به صورت خودکار قوانين فايروال را به منظور مسدودکردن آدرس IP مشکوک تغيير دهد.
در اين بخش قصد آموزش کامل Fail2Ban را نداريم اما چند اسکريپت نمونه را مورد بررسي قرار ميدهيم.
براي پيکربندي Fail2Ban شما نياز داريد که فايلهاي متعددي ايجاد کنيد که از طريق آنها به نرمافزار فرمان دهيد که چه لاگهايي را مورد بررسي قرار دهد و در مواقع تشخيص چه کارهايي را انجام دهد.
Fail2Ban، براي فيلترها به صورت پيشفرض يک فولدر دارد که ميتوانيد فيلترها را در آن قرار دهيد. اين فيلترها حاوي رشتههايي هستند که ميتوانند براي مطابقت دادن با لاگها استفاده شوند. شما به منظور بررسي انواع مختلف ترافيکها ميتوانيد به هر تعداد که لازم بدانيد فيلتر ايجاد کنيد.
دومين چيزي که نياز داريد، فايل پيکربندي به نام jail است. در اين فايل شما ميتوانيد حد آستانه (threshold) تعداد خطاهاي مجاز را مشخص کنيد تا در صورتيکه از حد آستانه بيشتر شد، عملي (action) که مشخص کردهايد را انجام دهد.
پيکربندي فيلترها
فايلهاي مربوط به فيلترها در مسير /etc/Fail2Ban/filter.d قرار دارند و نامگذاري آنها ميتواند بر اساس نوع فيلتري که مدنظر داريد، انجام شود. به عنوان مثال براي تشخيص احرازهويتهاي مشکوک نام freeswitch-auth.conf را انتخاب ميکنيم. در کدي که در ادامه ميبينيد، فيلتري نوشته شده است که در هنگام تماس يا register کردن، احرازهويتهاي ناموفق را بررسي کند.
# freeswitch-auth.conf Fail2Ban filter configuration file
[Definition]
failregex = SIP auth failure \((?:[REGISTER|INVITE])\) on sofia profile \'[^’]+\’ for \[.*\] from ip <HOST>
اگر مقدار failregex را با لاگ زير مقايسه کنيد، ميبينيد که دقيقا قسمتهاي قرمز رنگ تکرار شدهاند و براي قسمتهايي که مقدار متغير دارند از عبارات منظم استاندارد (regular expressions) استفاده شده است.
[WARNING] SIP auth challenge (REGISTER) on sofia profile ‘customer_access’ for [user_rdkj7h@2600hz.com] from ip 184.106.157.100
تنظيمات Jail
حال، ميتوان فيلتري که در بخش قبل نوشته شده است را با تنظيمات jail ئي که در ادامه ميبينيد ترکيب کرد:
enabled = true
# place your custom port entries in here if needed (per the Sofia
settings above)
port = 5060
filter = freeswitch-auth
logpath = /var/log/freeswitch/freeswitch.log
maxretry = 50
findtime = 30
bantime = 6000
action = iptables-allports[name=freeswitch, protocol=all]
اين تنظيمات به Fail2Ban فرمان ميدهد که از فيلتر freeswitch-auth استفاده کند و در صورتيکه در بازه زماني ۳۰ ثانيه بيش از ۵۰ تلاش ناموفق احرازهويت REGISTER يا INVITE از يک آدرس IP تشخيص داد، آن را به مدت ۶۰۰۰ ثانيه مسدود کند.
توجه
در پيکربندي Fail2Ban بايد نهايت دقت را داشته باشيد تا با نوشتن فيلترهاي کلي باعث از کار افتادن کل سيستم تلفني خود نشويد. براي مثال فرض کنيد شما يکي از فيلترهاي خود را طوري نوشتهايد که بتواند کل آدرسهاي IP داخلي را به دليل ارسال تعداد درخواستهاي بالا (۵۰ درخواست) در يک بازه زماني کوتاه (۳ ثانيه) مسدود کند. حال فرض کنيد ناگهان برق مجموعه شما قطع شود، در اين شرايط هنگاميکه برق وصل شود همه گوشيها با همديگر درخواست REGISTER ارسال ميکنند. Fail2Bail هنگاميکه تشخيص دهد که در مدت ۳ ثانيه بيشتر از ۵۰ درخواست REGISTER دريافت شده است کل IPهاي داخلي را مدت زيادي مسدود ميکند.