امنیت Asterisk با Fail2ban

گام اول : بررسی log های سرویس تلفنی

در سیستم های تلفنی مبتنی بر Asterisk هر عملیاتی که انجام میگیرد به صورت متنی در کنسول Asterisk نمایش داده میشود .

این پیام ها انواع مختلفی دارند که در این مقاله ما فقط نیاز به پیغام های اخطار و امنیتی داریم .

با دستور زیر وارد کنسول استریسک خود شوید

asterisk -vvvr

دستور زیر را وارد کنید

module show like res_security_log.so

حالا از کنسول Asterisk با دستور quit خارج بشید .

در قدم بعد احتیاج داریم که برای Asterisk مشخص کنیم که پیام های امنیت VoIP و اخطار ها رو در فایلی جداگانه ذخیره کنه که fail2ban برای خوندن اونها به مشکل بر نخوره .

به مسیر /etc/asterisk/ برید و فایل logger.conf رو با ویرایش گر مورد علاقه خودتون باز کنید در آخرین خط عبارت زیر را وارد کنید .

security_log => SECURITY,NOTICE

فقط دقت داشته باشید برای ویرایش این فایل شما احتیاج به دسترسی sudo دارید . الان نیاز هست مجددا وارد کنسول Asterisk بشید و ماژول logger رو مجدد راه اندازی کنید تا سیستم فایل log مورد نظر شما رو بسازه . وارد کنسول Asterisk بشید :

Asterisk -rvvvv

دستور زیر رو برای راه اندازی مجدد ماژول logger اجرا کنید .

logger reload

برای اطمینان از انجام صحیح مراحل تا اینجا با دستور زیر میتونید فایل های log که سیستم تلفنی تولید میکنه رو ببینید . با دستور زیر این کار رو انجام بدید :

logger show channels

بعد از اجرای دستور شما باید این خط رو مشاهده کنید

/var/log/asterisk/security_log      File 	default    Enabled    - NOTICE SECURITY

حالا از کنسول Asterisk با دستور quit خارج بشید .

عالیه ! الان میتونید با مراجعه به مسیر /var/log/asterisk/ فایل security_log رو ببینید .

پیکربندی Fail2ban

با دستور زیر نرم افزار fail2ban رو نصب کنید

apt-get install fail2ban

بعد از اتمام نصب محتویات پوشه fail2ban رو با دستور زیر چک کنید

ls /etc/fail2ban/

شما باید این فایل ها رو ببینید :

 action.d  fail2ban.conf  filter.d  jail.conf

قدم اول : خواندن log های سیستم تلفنی توسط Fail2ban

شما احتیاج دارید یه فایل برای تنظیمات fail2ban خودتون بسازید که برای fail2ban شرح بدید چطور باید فایل های log که قبل تر ایجاد کردیم رو بخونه . پس با دستور زیر وارد مسیر فایل های تنظیمات بشید .

cd /etc/fail2ban/filter.d/

حالا با دستور زیر یه فایل با نام asterisk2.conf بسازید.

touch asterisk2.conf

حالا فایل asterisk2.conf رو با ویرایشگر مورد علاقتون باز کنید و متن زیر رو در اون کپی کنید

# Fail2Ban configuration file
#
#
#
 
[INCLUDES]
 
# Read common prefixes. If any customizations available -- read them from
# common.local
before = common.conf
 
[Definition]
 
#_daemon = asterisk
 
# Option:  failregex
# Notes.:  regex to match the password failures messages in the logfile. The
#          host must be matched by a group named "host". The tag "<HOST>" can
#          be used for standard IP/hostname matching and is only an alias for
#          (?:::f{4,6}:)?(?P<host>\S+)
# Values:  TEXT
#
# Asterisk ۱.۸ uses Host:Port format which is reflected here
 
failregex = NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Wrong password
        NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - No matching peer found
        NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Username/auth name mismatch
        NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Device does not match ACL
        NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Peer is not supposed to register
        NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - ACL error (permit/deny)
        NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Device does not match ACL
        NOTICE.* .*: Registration from '\".*\".*' failed for '<HOST>:.*' - No matching peer found
        NOTICE.* .*: Registration from '\".*\".*' failed for '<HOST>:.*' - Wrong password
        NOTICE.* <HOST> failed to authenticate as '.*'$
        NOTICE.* .*: No registration for peer '.*' \(from <HOST>\)
        NOTICE.* .*: Host <HOST> failed MD5 authentication for '.*' (.*)
        NOTICE.* .*: Failed to authenticate user .*@<HOST>.*
        NOTICE.* .*: <HOST> failed to authenticate as '.*'
        NOTICE.* .*: <HOST> tried  to authenticate with nonexistent user '.*'
        SECURITY.* .*: SecurityEvent="InvalidAccountID",.*,Severity="Error",Service="SIP",.*,.*,.*,.*,RemoteAddress=".*/.*/<HOST>/.*"
        SECURITY.* .*: SecurityEvent="ChallengeResponseFailed",.*,Severity="Error",Service="SIP",.*,.*,.*,.*,RemoteAddress=".*/.*/<HOST>/.*",.*
        SECURITY.* .*: SecurityEvent="InvalidPassword",.*,Severity="Error",Service="SIP",.*,.*,.*,.*,RemoteAddress=".*/.*/<HOST>/.*",.*
 
# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
#

قدم دوم : ساخت تنظیمات اقدام کننده (Action)

حالا باید یه فایل دیگه بسازیم که در اون برای fail2ban توضیح بدیم که چطور IP شخصی که تلاش برای ورود داشته رو در فایروال اضافه کنه و دسترسی اون رو محدود کنه . پس ما برای تنظیم احتیاح به ساخت فایلی با عنوان iptables-asterisk.conf داریم .

با دستور زیر این کار رو انجام میدیم . بهتره برای امنیت voip این قسمت رو با دقت بخونید .

با دستور اول وارد پوشه action.d بشید و با دستور دوم فایلی با نام iptables-asterisk.conf بسازید .

cd /etc/fail2ban/action.d
touch iptables-asterisk.conf

حالا فایلی رو که ساختید با ویرایشگر مورد علاقتون باز کنید و متن زیر رو در اون کپی کنید .

# Fail2Ban configuration file
#
# Author: MB
#
# $Revision$
#
 
[Definition]
 
# Option:  actionstart
# Notes.:  command executed once at the start of Fail2Ban.
# Values:  CMD
#
actionstart = iptables -N fail2ban-<name>
          iptables -A fail2ban-<name> -j RETURN
          iptables -I <chain> -p udp --dport 5061 -j fail2ban-<name>
          iptables -I <chain> -p tcp --dport 5061 -j fail2ban-<name>
          iptables -I <chain> -p udp --dport 5060 -j fail2ban-<name>
          iptables -I <chain> -p tcp --dport 5060 -j fail2ban-<name>
 
# Option:  actionstop
# Notes.:  command executed once at the end of Fail2Ban
# Values:  CMD
#
actionstop = iptables -D <chain> -p tcp --dport 5061 -j fail2ban-<name>
     	iptables -D <chain> -p udp --dport 5061 -j fail2ban-<name>
     	iptables -D <chain> -p udp --dport 5060 -j fail2ban-<name>
     	iptables -D <chain> -p tcp --dport 5060 -j fail2ban-<name>
     	iptables -F fail2ban-<name>
     	iptables -X fail2ban-<name>
 
# Option:  actioncheck
# Notes.:  command executed once before each actionban command
# Values:  CMD
#
actioncheck = iptables -n -L <chain> | grep -q fail2ban-<name>
 
# Option:  actionban
# Notes.:  command executed when banning an IP. Take care that the
#          command is executed with Fail2Ban user rights.
# Tags:    <ip>  IP address
#          <failures>  number of failures
#          <time>  unix timestamp of the ban time
# Values:  CMD
#
actionban = iptables -I fail2ban-<name> 1 -s <ip> -j DROP
 
# Option:  actionunban
# Notes.:  command executed when unbanning an IP. Take care that the
#          command is executed with Fail2Ban user rights.
# Tags:    <ip>  IP address
#          <failures>  number of failures
#          <time>  unix timestamp of the ban time
# Values:  CMD
#
actionunban = iptables -D fail2ban-<name> -s <ip> -j DROP
 
[Init]
 
# Defaut name of the chain
#
name = default
 
# Option:  chain
# Notes    specifies the iptables chain to which the fail2ban rules should be
#          added
# Values:  STRING  Default: INPUT
chain = INPUT

اگر یکم به نوشته های بالا دقت کنید میبینید که ما در اون فقط پورت های سرویس sip رو بستیم یعنی پورت های udp5060 , tcp5060 ,tcp5061 رو بستیم . در پنجره پایین به صوت جدا براتون آوردمش .

iptables -I <chain> -p tcp --dport 5061 -j fail2ban-<name>
iptables -I <chain> -p udp --dport 5061 -j fail2ban-<name>
iptables -I <chain> -p udp --dport 5060 -j fail2ban-<name>
iptables -I <chain> -p tcp --dport 5060 -j fail2ban-<name>

قدم سوم : اضافه کردن تنظیمات که ساختیم به Fail2ban

حالا باید در فایل تنظیمات اصلی Fail2ban تنظیماتی که در بالا توضیح دادم رو به این فایل اضافه کنید . از مسیر /etc/fail2ban فایل jail.conf رو با ویرایشگر باز کنید و متن پایین رو به این فایل اضافه کنید .

[asterisk-sec]
enabled  = true
filter   = asterisk2
action   = iptables-asterisk[name=asterisk]
#          sendmail[name=Asterisk, dest=your_mail@your.domain, sender=your_mail@your.domain]
logpath  = /var/log/asterisk/security_log
maxretry = 3
findtime = 21600
bantime  = 604800

اگر شما بخواهید ip هایی که توسط fail2ban بلاک می شوند را به ایمیل خود ارسال نمایید خط بالا که کامنت شده است را باید از کامنت در بیاورید و درنهایت ابزار sendmail را نیز نصب نمایید.

در قسمت dest و sender تغییرات جدید اعمال شود. اگر خواستید تعداد دفعات مجاز رو تغییر بدید maxretry = 3 رو با هر تعداد باری که میخواهد جایگزین کنید . در حال حاضر ip مسدود شده به مدت 1 هفته (604800 ثانیه ) در لیست فایروال میمونه میتونید مدت زمان رو به صورت ثانیه در bantime = 1800 تغییر بدید.

الان با دستور های زیر سرویس Fail2ban رو یکبار استارت و استاپ میکنیم تا تنظیمات ما اعمال بشه .

service fail2ban stop
service fail2ban start

حالا با دستور زیر میتونید فایروال سیستم خودتون رو ببینید

iptables -L -v

در این مقاله fail2ban یاد گرفتیم چطور میتونیم از حملات brute force در امان باشیم و امنیت VoIP خودمون رو ارتقا بدیم .