12 января 2014 г.

Безопасность в Elastix (дистрибутив Asterisk)

Пост для заметки. Во-первых, прочитать это. В принципе, пост наполовину оттуда - спасибо нужно говорить там :). У меня все за фаерволом, открыты только нужные upd порты (5060 и 10000-20000).
1. Закрываем доступ через web! Я сделал это внешним фаеролом. Если вы хотите попасть в web конифгуратора elastix создайте ssh туннель с другого хоста.
2. Запретим гостевые вызовы, для этого в файле sip_general_custom.conf пропишем allowguest=no
3. Баним всяких подборщиков паролей и сохраняем для восстановления правил после перезагрузки:

  1. iptables -I INPUT -j DROP -p udp --dport 5060 -m string --string "friendly-scanner" --algo bm  
  2. iptables -I INPUT -j DROP -p udp --dport 5060 -m string --string "sipcli" --algo bm  
  3. iptables -I INPUT -j DROP -p udp --dport 5060 -m string --string "iWar" --algo bm  
  4. iptables -I INPUT -j DROP -p udp --dport 5060 -m string --string "sipsak" --algo bm  
  5. # /sbin/service iptables save  
  6. Правила брандмауэра сохраняются в /etc/sysconfig/iptables: [  OK  ]  
4. Запускаем fail2ban.

touch /etc/fail2ban/filter.d/asterisk.conf

Правила скопипастены (нажмите view plain, чтобы скопировать по-нормальному):

  1. # Fail2Ban configuration file  
  2. #  
  3. #  
  4. # $Revision: 251 $  
  5. #  
  6. [INCLUDES]  
  7. # Read common prefixes. If any customizations available -- read them from  
  8. # common.local  
  9. before = common.conf  
  10. [Definition]  
  11. #_daemon = asterisk  
  12. # Option:  failregex  
  13. # Notes.:  regex to match the password failures messages in the logfile. The  
  14. #          host must be matched by a group named "host". The tag "<host>" can  
  15. #          be used for standard IP/hostname matching and is only an alias for  
  16. #          (?:::f{4,6}:)?(?P<host>\S+)  
  17. # Values:  TEXT  
  18. #  
  19. # Asterisk 1.8 uses Host:Port format which is reflected here  
  20. failregex = NOTICE.* .*: Registration from '.*' failed for ':.*' - Wrong password  
  21.       NOTICE.* .*: Registration from '\".*\".*' failed for '' - Wrong password  
  22.      NOTICE.* .*: Registration from '\".*\".*' failed for '' - No matching peer found  
  23.     NOTICE.* .*: Registration from '.*' failed for '<host>:.*' - No matching peer found  
  24.     NOTICE.* .*: Registration from '.*' failed for '<host>:.*' - No matching peer found  
  25.     NOTICE.* .*: Registration from '.*' failed for '<host>:.*' - Username/auth name mismatch  
  26.     NOTICE.* .*: Registration from '.*' failed for '<host>:.*' - Device does not match ACL  
  27.     NOTICE.* .*: Registration from '.*' failed for '<host>:.*' - Peer is not supposed to register  
  28.     NOTICE.* .*: Registration from '.*' failed for '<host>:.*' - ACL error (permit/deny)  
  29.     NOTICE.* .*: Registration from '.*' failed for '<host>:.*' - Device does not match ACL  
  30.     NOTICE.* .*: Registration from '\".*\".*' failed for '<host>:.*' - No matching peer found  
  31.     NOTICE.* .*: Registration from '\".*\".*' failed for '<host>:.*' - Wrong password  
  32.     NOTICE.* <host> failed to authenticate as '.*'$  
  33.     NOTICE.* .*: No registration for peer '.*' \(from <host>\)  
  34.     NOTICE.* .*: Host <host> failed MD5 authentication for '.*' (.*)  
  35.     NOTICE.* .*: Failed to authenticate user .*@<host>.*  
  36.     NOTICE.* .*: <host> failed to authenticate as '.*'  
  37.     NOTICE.* .*: <host> tried  to authenticate with nonexistent user '.*'  
  38.     VERBOSE.*SIP/<host>-.*Received incoming SIP connection from unknown peer  
  39.     NOTICE.* .*: Sending fake auth rejection for device.* \(<host>:.*\)  
  40.     NOTICE.* .*: Failed to authenticate device.* \(<host>:.*\)  
  41. # Option:  ignoreregex  
  42. # Notes.:  regex to ignore. If this regex matches, the line is ignored.  
  43. # Values:  TEXT  
  44. #  
  45. ignoreregex =  

Добавляем в конфиг /etc/fail2ban/jail.conf (изменил немного, в почту слать ничего не надо, добавлены ip адреса игнорирования - внешняя статика и локальная сеть, бан изменен на пожизненный).

  1. [asterisk-iptables]  
  2. enabled = true  
  3. filter = asterisk  
  4. action = iptables-allports[name=ASTERISKprotocol=all]  
  5. #sendmail-whois[name=ASTERISK,dest=ваш_емаил_куда_слать_сообщения_о_бане, sender=fail2ban@local]  
  6. logpath = /var/log/asterisk/full  
  7. maxretry = 10  
  8. bantime = -1  
  9. ignoreip = 127.0.0.1 XXX.XXX.XXX.XXX 192.168.0.1/24  

/etc/init.d/fail2ban start

Статус смотрим командой fail2ban-client status asterisk-iptables или # iptables -L -n (уже забанил :) )

  1. # fail2ban-client status asterisk-iptables  
  2. Status for the jail: asterisk-iptables  
  3. |- filter  
  4. |  |- File list:        /var/log/asterisk/full  
  5. |  |- Currently failed: 1  
  6. |  `- Total failed:     16  
  7. `- action  
  8.    |- Currently banned: 1  
  9.    |  `- IP list:       50.30.35.55  
  10.    `- Total banned:     1  

Для автостарта fail2ban в файл /etc/rc.d/rc.local добавим строчку /etc/rc.d/init.d/fail2ban start

После рестарта fail2ban или после перезагрузки все адреса сбрасываются. Поэтому можно добавить /sbin/service iptables save в крон. Я думаю раз в час будет достаточно ( /etc/crontab ):

  1. 0 * * * * root /sbin/service iptables save  
Правда командой fail2ban-client status asterisk-iptables после перезагрузки забаненных мы уже не увидим. Если вы все-таки захотите видеть и чтобы fail2ban рулил сам iptables после перезагрузки, то прочитайте вот этот пост. Защита от SIP флуда описана тут.

Комментариев нет:

Отправить комментарий