среда, 12 октября 2011 г.

Простейший скрипт для защиты Asterisk

Так же мы можем скриптом анализировать логи Asterisk сервера и всех уродов, подбирающих пароль, банить фаирволом (ipfw) сервера. Одна из версий скрипта:
time=$(expr `/bin/date +%H%M` / 1)
if [ $time -eq 1015 ]; then
        echo "Table 56 contents IP:"
 echo "====================="
 /sbin/ipfw table 56 list
 echo "====================="
 /sbin/ipfw table 56 flush
 echo "Table 56 flushed"
fi
if [ $time -eq 0 ]; then
 rm -rf `/bin/date -v-180d +'/var/log/asterisk/%Y/%m/'`
# echo "Deleted dir " `/bin/date -v-180d +'/var/log/asterisk/%Y/%m/'`
 mkdir -p `/bin/date +'/var/log/asterisk/%Y/%m/'`
# echo "Created dir " `/bin/date +'/var/log/asterisk/%Y/%m/'`
fi
/usr/local/sbin/asterisk -rx 'logger rotate'

/bin/sleep 2

/usr/bin/grep -E ' chan_sip.c: Registration from .* No matching peer found$' /var/log/asterisk/messages.0 | \
awk -F "'" '{ ips[$4]++ } END { for (a in ips){ if (ips[a]> 10 ){ cmd=sprintf("/sbin/ipfw table 56 add %s/32 5060 >/dev/null 2>&1",a); system(cmd); printf ("asterisk: Wrong peers repeated [%d] times: IP [%s] blocked\n",ips[a],a); } } }'

/usr/bin/grep -E ' chan_sip.c: Registration from .* Wrong password$' /var/log/asterisk/messages.0 | \
awk -F "'" '{ ips[$4]++ } END { for (a in ips){ if (ips[a]> 20 ){ cmd=sprintf("/sbin/ipfw table 56 add %s/32 5061 >/dev/null 2>&1",a); system(cmd); printf ("asterisk: Wrong passwords repeated [%d] times: IP [%s] blocked\n",ips[a],a); } } }'

mesdst=`/bin/date +'/var/log/asterisk/%Y/%m/mes_%Y%m%d.log'`
evtdst=`/bin/date +'/var/log/asterisk/%Y/%m/evt_%Y%m%d.log'`
quedst=`/bin/date +'/var/log/asterisk/%Y/%m/que_%Y%m%d.log'`

cat /var/log/asterisk/messages.0 >> $mesdst
rm /var/log/asterisk/messages.0

cat /var/log/asterisk/event_log.0 >> $evtdst
rm /var/log/asterisk/event_log.0

cat /var/log/asterisk/queue_log.0 >> $quedst
rm /var/log/asterisk/queue_log.0
Инсталляция скрипта: 1. Сохраните код скрипта на своем сервере 2. Переименуйте файл в protect_aster.sh 3. Сделайте скрипт исполняемым: chmod a+x protect_aster.sh 4. Добавте в ваш firewall ipfw правило: ipfw add XXX reject ip from «table(56)» to me где ХХХ это номер правила. Будьте внимательны размещая данное правило, не забаньте сами себя ! Обеспечьте allow правила для своих IP-адресов выше этого правила, чтобы избежать неожиданностей. 5. Добавте скрипт на исполнение по crontab, отредактируйте /etc/crontab: */5 * * * * root /full/path/to/script/protect_aster.sh Забаненый IP-адрес попадает в таблицу ровно на сутки, через сутки он автоматически будет удален из таблицы. Надеемся, что эти не хитрые приемы помогут вам остаться при деньгах и сэкономить ваши нервы. Спасибо, Панфилову Алексею и Николаеву Дмитрию!

Защита Asterisk с помощью Fial2ban в связке с pf.

Fail2ban – это простенький сервис, который поможет отслеживать и блокировать атаки, анализируя лог файлы той или иной службы. При обнаружении атаки fail2ban может занести ip источника в таблицу фаервола, уведомить по электронной почте и т.д. Сервис очень гибок в настройке, написан на python.

Установка и настройка fail2ban

Устанавливаем из портов. За собой он потянет Python, если у Вас он не установлен.
КОД: ВЫДЕЛИТЬ ВСЁ
cd /usr/ports/security/py-fail2ban; make install clean


После установки переходим в каталог /usr/local/etc/fail2ban и приступаем к настройке.
КОД: ВЫДЕЛИТЬ ВСЁ
cd /usr/local/etc/fail2ban


В папке находятся 2 поддиректории.
action.d – Хранятся файлы, в которых описываются действия при срабатывании правил.
filter.d – Хранятся шаблоны, использующие в основном регулярные выражения, которые служат для обнаружения атак, попытки подбора паролей, и т.д.

А так же 2 файла:
fail2ban.conf - Файл содержит общие настройки для демона, такие как уровень логирования и т.д.
jail.conf - Файл в котором содержится описание фильтров.

Редактируем файл jail.conf, в конец файла добавляем следующее.

КОД: ВЫДЕЛИТЬ ВСЁ
[asterisk-pf]
enabled = true
filter = asterisk
action = pf[table=asterisk-ban]
       sendmail[name=ASTERISK, dest=root, sender=fail2ban@example.com]
logpath = /var/log/asterisk/messages
maxretry = 5
bantime = 86400
ignoreip = 192.168.15.0/24ляем


Немного подробнее о переменных.

filter = asterisk - Название фильтра, которые будут использоваться для обнаружения совпадений.
В случае срабатывания фильтра, будут выполнены следующие действия.
action = pf[table=asterisk-ban]
sendmail[name=ASTERISK, dest=root, sender=fail2ban@example.com]

pf[table=asterisk-ban] - Будет выполнен скрипт pf.conf (в директории action.d), которому будет передана переменная table со значением asterisk-ban (Где asterisk-ban - это название таблицы в pf)
sendmail[name=ASTERISK, dest=root, sender=fail2ban@example.com] - Будет отправлено уведомление о срабатывании фильтра. (name - тема письма, dest - кому будет послано, sender - отправитель)
logpath = /var/log/asterisk/messages - Путь до лог файла asterisk
maxretry = 5 - Количество совпадений, который вызывает блокировку IP адреса
bantime = 86400 - Продолжительность (в секундах), в течение которых IP адрес будет блокирован.
ignoreip = 192.168.15.0/24 - Не проверять данные сети, IP адреса.

Создадим файл - шаблон /usr/local/etc/fail2ban/filter.d/asterisk.conf следующего содержания.

КОД: ВЫДЕЛИТЬ ВСЁ
cat /usr/local/etc/fail2ban/filter.d/asterisk.conf
# Fail2Ban configuration file
#
#
# $Revision: 250 $
#

[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
#

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.* <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>.*

# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
#
ignoreregex =


Далее создаем файл /usr/local/etc/fail2ban/action.d/pf.conf в котором опишем связь с pf.

КОД: ВЫДЕЛИТЬ ВСЁ
cat /usr/local/etc/fail2ban/action.d/pf.conf
[Definition]

actionstart =
actionstop =
actioncheck =
actionban = pfctl -t <table> -Ta  <ip>
actionunban = pfctl -t <table> -Td <ip>

[Init]

port = any
localhost = 127.0.0.1


Где переменную <table> мы описали в jail.conf (action = pf[table=asterisk-ban])

Asterisk

Теперь нужно немного настроить Asterisk.
КОД: ВЫДЕЛИТЬ ВСЁ
vim /usr/local/etc/asterisk/logger.conf

И раскомментируем
КОД: ВЫДЕЛИТЬ ВСЁ
[general]
dateformat=%F %T


Заходим в консоль asterisk и рестартуем сервис логирования
КОД: ВЫДЕЛИТЬ ВСЁ
asterisk -rx "logger reload"


PF

Добавим блокирующее правило в pf.conf. Для примера:
КОД: ВЫДЕЛИТЬ ВСЁ
block in log quick on $EXT_IF proto {tcp udp} from <asterisk-ban> to $EXT_IF port 5060


Запуск

Добавляем fail2ban в /etc/rc.conf.
КОД: ВЫДЕЛИТЬ ВСЁ
echo ‘fail2ban_enable="YES"’ >> /etc/rc.conf

И запускаем
КОД: ВЫДЕЛИТЬ ВСЁ
/usr/local/etc/rc.d/fail2ban start


Теперь можно проверить, попробовать авторизироваться на asterisk с неправильным паролем и посмотреть, что из этого получится, должно будет прийти письмо, если вы добавили эту возможность, или смотрите лог файл.

Логи fail2ban пишет в /var/log/fail2ban.log или настройте сами, куда вам удобно в /usr/local/etc/fail2ban/fail2ban.conf
Постскриптум
В папке filter.d вы можете найти много различных фильтров ко многим известным сервисам, да вы и сами можете написать их, это не так сложно.

И еще по поводу Asterisk. Помните, fail2ban не поможет Вам, если вы используете легкие пароли (123 и т.д.), используйте сложные, длинные пароли, по возможности привязывайте аккаунты к ip адресам. Только совокупность этих мер поможет вам и вашей компании не получить гигантский счет за связь.

APF и BFD для защиты Asterisk

APF используется для того, чтобы управлять iptables, открывать или закрывать порты. У APF есть дополнительные функции, которые заставляют его выделиться выше остальных: Reactive Address Blocking (RAB), поддержка QoS (TOS), интеграция с BFD и многое другое.
BFD расшифровывается как Brute Force Detection (обнаружение брутфорса). Он используется, чтобы контролировать любые неудавшиеся попытки входа в систему и блокировать IP-адреса. Он запускается как демон cron и отлично работает с APF.
Установка обеих программ очень проста. Вы можете загрузить их с сайтов, указанных выше, распаковать и запустить install.sh. Тим также создал скрипт инсталлятора, который устанавливает последнюю версию APF/BFD. Чтобы получить этот скрипт, Вы можете использовать wget. Зайдите под root и выполните следующие команды:
wget http://engineertim.com/install_apf_bfd.sh
chmod 755 install_apf_bfd.sh
./install_apf_bfd.sh
 
APF
Конфиг APF находится в /etc/apf/conf.apf
Чтобы начать редактировать файл, используйте следующую команду:
nano /etc/apf/conf.apf
Ставим the IFACE_IN иIFACE_OUT для сетевого интерфейса, смотрящего в Интернет. Для сетевого интерфейса, смотрящего в локальную сеть, ставим IFACE_TRUSTED.
Рекомендуется установить SET_TRIM=0 для интерфейса, смотрящего в Интернет.
SET_TRIM="0"
У APF есть способность поддерживать QoS. Для SIP и IAX необходимо установить следующее:
TOS_8="21,20,80,4569,5060,10000_20000"
Если бы Вы изменили порт SSH, необходимо отредактировать conf.apf файл, чтобы соответствовать этому новому порту.
HELPER_SSH_PORT="2222"
Удостоверьтесь, что заменили 2222 правильным числом порта, на котором Вы решили управлять SSH.
Фильтрация входящего трафика используется, чтобы открыть порты для доступа; у TCP и UDP есть отдельные параметры настройки. Для Asterisk (Trixbox) следующие порты должны быть открытыми; и TCP и UDP перечислены. Если Вы не используете TFTP, то не открывайте порт 69. Не забывайте изменять порт SSH. Иначе, Вы не сможете получить доступ; здесь мы используем порт 2222 из нашего последнего примера. Мы не включали порты IAX в эту установку. Есть легкий способ убедиться, что только определенные хосты могут использовать IAX, который мы откроем позже. Это удобно, если Вы используете IAX, чтобы поднять межстанционные транки, невидимые для внешнего мира.
IG_TCP_CPORTS="2222,69,80,5060,6600,10000_20000"
IG_UDP_CPORTS="69,5060,10000_20000"
Я не использую фильтрацию исходящего трафика, поэтому она не рассматривается в данной статье. Она установлено в EGF="0", отключена по умолчанию.
Чтобы увидеть список параметров командной строки, запустите apf без флагов.
[trixbox1.localdomain apf]# apf
apf(3402): {glob} status log not found, created
APF version 9.6 < apf@r-fx.org>
Copyright (C) 1999-2007, R-fx Networks < proj@r-fx.org>
Copyright (C) 2007, Ryan MacDonald < ryan@r-fx.org>
This program may be freely redistributed under the terms of the GNU GPL
usage /usr/local/sbin/apf [OPTION]
-s|--start ......................... load all firewall rules
-r|--restart ....................... stop (flush) & reload firewall rules
-f|--stop........ .................. stop (flush) all firewall rules
-l|--list .......................... list all firewall rules
-t|--status ........................ output firewall status log
-e|--refresh ....................... refresh & resolve dns names in trust
rules
-a HOST CMT|--allow HOST COMMENT ... add host (IP/FQDN) to
allow_hosts.rules and immediately load new rule into firewall
-d HOST CMT|--deny HOST COMMENT .... add host (IP/FQDN) to
deny_hosts.rules and immediately load new rule into firewall
-u|--remove HOST ................... remove host from
[glob]*_hosts.rules and immediately remove rule from firewall
-o|--ovars ......................... output all configuration options
 
Для старта APF мы используем следующие команды:
[trixbox1.localdomain apf]# apf -s
apf(3445): {glob} activating firewall
apf(3489): {glob} determined (IFACE_IN) eth0 has address 192.168.1.31
apf(3489): {glob} determined (IFACE_OUT) eth0 has address 192.168.1.31
apf(3489): {glob} loading preroute.rules
apf(3489): {resnet} downloading http://r-fx.ca/downloads/reserved.
networks
apf(3489): {resnet} parsing reserved.networks into
/etc/apf/internals/reserved.networks
apf(3489): {glob} loading reserved.networks
apf(3489): {glob} SET_REFRESH is set to 10 minutes
apf(3489): {glob} loading bt.rules
apf(3489): {dshield} downloading http://feeds.dshield.org/top10-2.txt
apf(3489): {dshield} parsing top10-2.txt into /etc/apf/ds_hosts.rules
apf(3489): {dshield} loading ds_hosts.rules
apf(3489): {sdrop} downloading http://www.spamhaus.org/drop/drop.lasso
apf(3489): {sdrop} parsing drop.lasso into /etc/apf/sdrop_hosts.rules
apf(3489): {sdrop} loading sdrop_hosts.rules
apf(3489): {glob} loading common drop ports
...........trimmed for this document.........
apf(3489): {glob} default (ingress) input drop
apf(3445): {glob} firewall initalized
apf(3445): {glob} !!DEVELOPMENT MODE ENABLED!! - firewall will flush
every 5 minutes.
 
Мы можем видеть, что APF стартанул, загрузил несколько правил с dshield.org и spamhaus.org. Теперь проведем тест захода на Asterisk (Trixbox)-сервер по SSH, чтобы убедиться, что Вы настроили все правильно. Если Вы не можете соединиться, необходимо подождать 5 минут, и затем APF снимет блокировку. Как только Вы уверены, что можете войти по SSH, мы можем изменить в conf.apf DEVEL_MODE = "1" на DEVEL_MODE = "0" и перезапустить APF. APF стартанет и не выдаст предупреждение о том, чтобы он находится в DEVELOPMETN_MODE.
 
APF: дополнительный тюнинг
На этом настройка не заканчивается, если Вы хотите объединить свои Asterisk (Trixbox)-сервера по IAX. Для этого Вам потребуется добавить порты IAX в conf.apf. Этот вариант будет работать со статическими IP-адресами или DynDNS. Команда apf –a разрешает доступ для определенного IP-адреса. Это глобально позволит хосту соединяться с Asterisk (Trixbox), обходя правила брандмауэра.
apf -a 192.168.1.216
Это позволит системе 192.168.1.216 соединяться с любым портом на зафаерволенном сервере, таким образом, обходя правила брандмауэра. Если Вы управляете APF на обоих Asterisk (Trixbox), убедитесь, что сделали ту же самую вещь на другом хосте, использующем правильный IP-адрес.
APF также позволяет системному администратору блокировать хост или целую подсеть. Это удобно, если Вы видите, что кто-то пытается соединиться с Вашей машиной по FTP, Telnet, SSH и так далее. Чтобы заблокировать определенный хост, используйте следующее: убедитесь, что использовали IP-адрес, который Вы хотите заблокировать.
apf -d 192.168.1.216
Чтобы заблокировать полную подсеть (CIDR):
apf -d 202.86.128.0/24
APF не поддерживает QoS для UDP-пакетов. Только TCP. Есть легкий способ пофиксить это. В /etc/apf/internals есть файл functions.apf. Мы должны отредактировать этот файл вручную. Есть несколько мест, где мы должны добавить единственную строку. Ищем секцию TOS_ в functions.apf файле. Это будет похоже на это:
if [ ! "$TOS_0" == "" ]; then
for i in `echo $TOS_0 | tr ',' ' '`; do
i=`echo $i | tr '_' ':'`
$IPT -t mangle -A PREROUTING -p tcp --sport $i -j TOS --set-tos 0
done
fi
 
Мы должны добавить параметры настройки для UDP. Мы копируем одну строку и изменяем tcp на udp. Образец ниже.
if [ ! "$TOS_0" == "" ]; then
for i in `echo $TOS_0 | tr ',' ' '`; do
i=`echo $i | tr '_' ':'`
$IPT -t mangle -A PREROUTING -p tcp --sport $i -j TOS --set-tos 0
$IPT -t mangle -A PREROUTING -p udp --sport $i -j TOS --set-tos 0
done
fi
Эта дополнительная строка должна быть сделана для всех битов TOS, которые Вы используете.
 
BFD  

Обнаружение брутфорса (атаки по словарю) используется, чтобы отследить несанкционированные попытки входа в систему.
Конфигурационный файл для BFD расположен в /usr/local/bfd и назван conf.bfd. Этот файл, как и для APF, содержит множество комментариев. Мы рассмотрим лишь некоторые параметры настройки.
Первая переменная конфигурации, на которую мы обратим внимание, - TRIG; это число неудавшихся попыток прежде, чем злоумышленник будет заблокирован. По умолчанию равно 15. Имейте в виду, что это число попыток не с одного аккаунта, а с одного IP-адреса. Так, если с 1 IP-адреса прихоидт 15 неудачных попыток входа, используя разные аккаунты, он все равно будет залочен.
У BFD есть хорошая фича -  послать электронные письма при обнаружении брутфорса. Чтобы включить данную опцию, установите EMAIL_ALERTS в 1; не забудьте указать адрес, на который Вы хотите получать уведомления - EMAIL_ADRESS.
BFD запускается cron-ом каждые 3 минуты и находится в /etc/cron.d.
Вы можете получить список забаненных IP-адресов, используя команду:
bfd -a
Для старта BFD используйте следующую команду:
bfd -s
 
Резюме
На этом обзор безопасности Asterisk (Trixbox) завершен.
В данной статье рассмотрены лишь основные принципы защиты Asterisk (Trixbox). Естественно, построение безопасных VoIP-систем этим не ограничивается.
С оригиналом статьи Вы можете ознакомиться по ссылке
http://packtpub.com/article/securing-your-trixbox-server

Asterisk и fail2ban или как что делать с iptables

Шаг 1. Установка fail2ban. # apt-get install fail2ban Шаг 2. Установка python и iptables. Возможно вам понадобиться установить эти пакеты, поэтому # apt-get install iptables python Шаг 3. Конфигурация fail2ban. И так, займемся конфигурацией. Для этого перейдем в каталог /etc/fail2ban/filter.d. # cd /etc/fail2ban/filter.d Создаем новый фильтр: # touch asterisk.conf Содержимое файла /etc/fail2ban/filter.d/asterisk.conf должно быть примерно таким: # Fail2Ban configuration file # $Revision: 250 $ [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 "" can # be used for standard IP/hostname matching and is only an alias for # (?:::f{4,6}:)?(?P\S+) # Values: TEXT failregex = NOTICE.* .*: Registration from '.*' failed for '' - Wrong password NOTICE.* .*: Registration from '.*' failed for '' - No matching peer found NOTICE.* .*: Registration from '.*' failed for '' - Username/auth name mismatch NOTICE.* .*: Registration from '.*' failed for '' - Device does not match ACL NOTICE.* failed to authenticate as '.*'$ NOTICE.* .*: No registration for peer '.*' \(from \) NOTICE.* .*: Host failed MD5 authentication for '.*' (.*) NOTICE.* .*: Failed to authenticate user .*@.* # Option: ignoreregex # Notes.: regex to ignore. If this regex matches, the line is ignored. # Values: TEXT ignoreregex = Шаг 4. Редактируем /etc/fail2ban/jail.conf. В конец файла добавляем следующее содержимое: [asterisk-iptables] enabled = true filter = asterisk action = iptables-allports[name=ASTERISK, protocol=all] sendmail-whois[name=ASTERISK, dest=root, sender=fail2ban@example.org] logpath = /var/log/asterisk/messages (Тут внимательно! Посмотрите где у вас логи храняться!) maxretry = 5 bantime = 259200 Шаг 5. Логирование Asterisk. Открываем /etc/asterisk/logger.conf и раскомментируем: [general] dateformat=%F %T В консоли перегружаем сервис логирования: # asterisk -rx "logger reload" Шаг 6. Запуск. # /etc/init.d/iptables start Проверим: # iptables -L -v Должно появиться что то типа этого: # iptables -L -v Chain INPUT (policy ACCEPT 20100 packets, 3866K bytes) pkts bytes target prot opt in out source destination 62 5692 fail2ban-ssh tcp -- any any anywhere anywhere multiport dports ssh 2049 471K fail2ban-ASTERISK all -- any any anywhere anywhere Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 18948 packets, 5246K bytes) pkts bytes target prot opt in out source destination Chain fail2ban-ASTERISK (1 references) pkts bytes target prot opt in out source destination 2049 471K RETURN all -- any any anywhere anywhere Chain fail2ban-ssh (1 references) pkts bytes target prot opt in out source destination 62 5692 RETURN all -- any any anywhere anywhere Шаг 7. Автозапуск fail2ban и iptables: # update-rc.d iptables defaults # update-rc.d fail2ban defaults

Код безопасности Asterisk от Ranch Networks

Компания Digium, создавшая Asterisk, специализирующаяся в области телефонии на открытых кодах, и фирма Ranch Networks, разработчик устройств для IP-телефонии, представляют свой код безопасности для платформы открытых кодов Asterisk.

Совместное использование Asterisk и устройств модельного ряда RN производства Ranch Networksобеспечивает безопасность и масштабирование для телефонии на открытых кодах. Загрузить код можно с сайта ranchnetworks.com.

По мнению разработчиков, устройства Ranch Networks решают проблемы, присущие VoIP, как путем интеграции MIDCOM с платформой Asterisk, так и при помощи ряда собственных технологий, находящихся в стадии оформления патента. MIDCOM-интеграция обеспечивает динамическое управление межсетевыми экранами для каждого звонка, управление шириной полосы пропускания, прохождение NAT и маршрутизацию потоков, передаваемых по протоколу RTP, при этом поддерживая прохождение шифрованных потоков. В то же время ожидающие патента технологии Ranch Networks позволяют разделить голосовой трафик, видеосигналы и трафик данных по множественным изолированным зонам безопасности без необходимости реконфигурации IP-адресов.

«Безопасность решений на базе SIP вызывает серьезное беспокойство, — говорит президент Digium и автор платформы Asterisk Марк Спенсер. — Необходимость держать порты постоянно открытыми для прохождения голосового трафика распахивает двери для нежелательных визитеров в вашу сеть. Наша же технология не только обеспечивает активную безопасность VoIP еще до того, как создаются предпосылки к вторжению, но и позволяет управлять распределением нагрузки и качеством обслуживания, а также масштабировать систему».


Защита Asterisk или элементарные правила безопасности VoIP

Сейчас все пишут про большое количество атак на Asterisk и прочих PBX. Хочу рассказать, что недавно произошло с одним из наших клиентов. У товарищей хакеров из КНДР не получилось пробраться на Asterisk, стоящий за простеньким роутером ASUS, почему напишу далее, но зато у них отлично получилось ломануть, а вернее подобрать пароли к IP телефонам Yealink SIP T-22. Сделать это было не сложно, так как клиент не удосужился поменять стандартные admin/admin. И от сюда...

Правило первое: Всегда менять логины и пароли на вех сетевых устройствах. Особенно на IP телефонах, VoIP шлюзах и т.д.
Пароли абонентов, админов, менеджеров Asterisk и т.д. должны состоять, не менее чем из 12 символов (буквы, цифры, перемена регистра), используйте сложные логины и паролиНе соблюдение этого простого правила стоило 15000 рублей.

Правило второе: Использовать нестандартные порты SIP, IAX, SSH. Применение данной модели безопасности не даст особого эффекта защиты само по себе, но несколько усложнит задачу злоумышленников, а в купе с другими рекомендациями поможет избавиться от незапланированных трат.
Меняйте стандартные порты на любые другие. Чем он будет больше непохож на стандартный – тем лучше. 
SIP: Настройка порта производится в файле sip. Conf в секции general:
Bindport=5060 => bindport=5172
SSH: Новый порт не должен конфликтовать с уже открытыми в системе портами. Например, будем использовать 9321. Редактируем /etc/ssh/sshd_config.
Удаляем знак # перед изменением.
Port 9321
После чего перезапустим sshd для применения изменений, используя команду: 
service sshd restart
IAX: Заходим в/etc/asterisk/iax.conf
меняем в строке порт на любой свободный ;bindport=4569
Перезапускаем Asterisk командой /etc/ininit.d/asterisk restart

Правило третье: Использовать пользователя с правами доступа по SSH. Следует создать юзера и наделить его правами доступа только по SSH. Сейчас мы создадим пользователя myasterisk и зададим ему пароль. Пароль должен содержать символы, числа и буквы со сменой регистра. 
# useradd myasterisk
# passwd myasterisk
Отредактируем /etc/ssh/sshd_config, добавив в него следующую строчку: AllowUsers myasterisk
Запретить пользователю root подключаться к серверу Asterisk по SSH: PermitRootLogin no  

Правило четвертое: Задать разрешенные адреса для внутренних абонентов (Deny/Permit).
Данная настройка ограничивает возможность регистрации внутренних абонентов только с доверенных IP адресов.
Для каждого экстеншена задаем диапазон адресов или допустимый IP адрес.
123
Deny=0.0.0.0/0.0.0.0
Permit=10.10.1.7
Permit=10.10.2.1/24
Где 10.10.2.1/24 – диапазон локальных адресов, с которых будет производится подключение. Подключения с других адресов Asterisk принимать не будет.

Правило четвертое: Отключить ответ о неверном пароле.
По умолчанию Asterisk выдает одну ошибку о неверном пароле для существующего аккаунта и другую для несуществующего аккаунта. Существует множество программ для подбора паролей, поэтому злоумышленнику не составит труда проверить все короткие номера и собирать пароли лишь к существующим аккаунтам, которые ответили «неверный пароль». Чтобы помешать этому, меняем строчку в файле /etc/asterisk/sip.conf:
alwaysauthreject = no  на  alwaysauthreject = yes и перезапускаем Asterisk.
После такой настройки, Asterisk будет отвечать одинаково для любых неверных авторизации «401 Unauthorized» и не сообщать подробностей.

Правило пятое: Отключить гостевые вызовы (guest-звонки) и регистрации.
Необходимо отредактировать /etc/asterisk/sip.conf:
строку Allowguest=yes  заменить на allowguest=no; Allow or reject guest calls (default is yes)
Данный вариант подойдет не всем пользователям, иногда бывает, что отказаться от guest-вызовов не представляется возможным.

Правило шестое: Установить лимит звонков.
В том случае, если вас уже взломали, потерять меньше денег поможет строка Call-limit=1, прописанная в настройках ваших внутренних абонентов Эта строка ограничивает количество одновременных соединений.вашего внутреннего абонента.

Правило седьмое: Использовать различные правила исходящей маршрутизации.
Не стоит лениться и использовать дефолтные маршруты, типа Exten => _X.,1,Hangup. Следует жестко прописывать направления с кодами городов, операторов мобильной связи и международных кодов (если такое вообще нужно), на пример: 8495XXXXXXX, 8961XXXXXXX, 89ХХXXXXXXX и т.д.

Эти простейшие семь правил, которые помогут вам защитится от элементарных методов хищения вашего трафика. Также рекомендую обсудить с вашим sip провайдером возможность регистрации только с вашего ip адреса, установить лимит расходования средств в сутки, исходя их ваших средних затрат, Также думаю будет не лишним отключить междугороднюю и международную связь, если вы ей не пользуетесь, или сделать возможным совершать исходящие МГ и МН вызовы после ввода pin кода.
Сейчас перейдем к более серьезным настройкам для защиты вашего Asterisk. 

Правило восьмое: Использовать Iptables и Fail2ban.

Думаю все слышали про программу Fail2ban, а некоторые даже умеют настраивать её для работы с логом Asterisk. Действительно, вылавливая строки вида «failed for ’127.0.0.1′ – Wrong password» и «failed for ’127.0.0.1′ – Peer is not supposed to register» – можно существенно сократить количество мусорного SIP трафика. Однако, есть несколько неприятных ситуаций, в которых анализ лога Asterisk не поможет. Например, в случае когда злоумышленник посылает запрос REGISTER без идентификационных данных – в логе никогда не появится сообщение «Wrong password».

Лично я не особо боюсь того, что к моей системе подберут пароль одного из клиентов. Вероятность данного события мала, поскольку все пароли в системе стойкие. И даже если пароль подберут, у большинства клиентов установлено ограничение на 1-2 одновременных вызова. Для меня неприятность SIP брутфорса заключается в другом. Дело в том, что в Asterisk вся SIP UDP сигнализация обрабатывается одним единственным тредом. Обработка SIP трафика – ресурсоёмкий процесс, 7-8 мегабит мусорных запросов заставляют Asterisk полностью скушать ядро процессора (например Intel E5335, E5405). Когда ядро полностью съедено, происходит вытеснение полезного SIP трафика – мусорным. Перестают работать DTMF у клиентов использующих SIP INFO. Начинаются проблемы с установкой новых и завершением существующих соединений. И вот это – основная угроза которую несут роботы-брутфорсеры.

Так как же бороться с проблемами о которых нет сообщений в логах? Очень просто – необходимо сгенерировать сообщение о проблеме самому, тогда всю остальную часть нашей системы противодействия (например программу fail2ban) можно будет оставить без изменений. Характерным признаком брутфорса является большое количество SIPпакетов в единицу времени. Посчитать количество пакетов в единицу времени можно с помощью модуля iptables под названием recent. В интернете есть много примеров как с помощью модуля recent отбрасывают пакеты приходящие с частотой выше определённой. Мы, вместо отбрасывания, будем генерировать сообщения для нашей системы обнаружения атак (например fail2ban). Такой подход имеет свои недостатки и преимущества. Основным недостатком является, то что на обработку сообщений будут тратиться ресурсы системы, тогда как отбрасывание пакета условно бесплатное. Преимуществ чуть больше: мы сможем воспользоваться всеми возможностями нашей системы обнаружения атак, такими как белые списки IP адресов, единообразный учёт всех обнаруженных атак и так далее.

От теории – к практике! Подготовим скелет из правил iptables:

-A INPUT -p udp --dport 5060 -j SCAMBLOCK
-A INPUT -p udp --dport 5060 -m recent --set --name SIP
-A INPUT -p udp --dport 5060 -m recent --update --seconds 2 --hitcount 60 --name SIP \
-j LOG --log-prefix "SIP flood detected: "

Первое правило проверяет наш пакет по цепочке SCAMBLOCK. В данной цепочке хранятся заблокированные IP адреса, если пакет совпадает с одним из адресов этой цепочки – он отбрасывается. Если пакет не отброшен, то во втором правиле он помечается для учёта под именем SIP. Третье правило считает не превысил ли данный пакет указанное количество (60) за указанное время (2 секунды). Если количество не превышено – правило игнорируется, если превышено – выполняется действие. В нашем случае в системный лог пишется детальная информация о пакете начинающаяся со строки «SIP flood detected: «. Количество пакетов и время считаются отдельно для каждого источника. Таким образом получается, что мы ограничили скорость приёма SIP пакетов от каждого незаблокированного IP адреса на уровне 30 пакетов в секунду. Для меня данное ограничение является комфортным, с одной стороны все клиенты, даже самые крупнные, шлют пакеты с одного IP адреса со скоростями ниже 30 пакетов/с, с другой стороны, 30 пакетов в секунду практически не отражаютя на работе системы. Возможно, что эту величину следует подправлять в ту или иную сторону в зависимости от производительности сервера, количества и типа абонентов.

В некоторых системах встроенное ограничение модуля recent на параметр hitcount весьма небольшое, например в CentOS это ограничение составляет 20 пакетов. Если вы попробуете выполнить приведенную выше команду, то получите следующую ошибку:

iptables -A INPUT -p udp --dport 5060 -m recent --update --seconds 2 --hitcount 60 --name SIP \
-j LOG --log-prefix "SIP flood detected: "
iptables: Unknown error 4294967295

Или вот так, для 64 битных систем:

iptables -A INPUT -p udp --dport 5060 -m recent --update --seconds 2 --hitcount 60 --name SIP \
-j LOG --log-prefix "SIP flood detected: "
iptables: Unknown error 18446744073709551615

Изменить максимальное ограничение можно передав модулю recent специальный параметр при загрузке. Для этого создадим файл /etc/modprobe.d/ipt.conf и пропишем в нём интересующий нас параметр:

options ipt_recent ip_pkt_list_tot=60

Будьте осторожны увеличивая данное ограничение, помните что вместе с ним увеличивается память, требуемая для хранения последних пакетов, а также количество циклов процессора требуемые на их обработку.

Ну вот и всё, теперь любой флуд на порт 5060 будет обнаружен с помощью модуля recent пакета iptables. Сообщение об обнаруженном флуде будет направлено в системный лог где его сможет увидеть наша любимая система обнаружения атак (например fail2ban). iptables не ограничивает нас одним лишь системным логом, действию LOG можно указать уровень (level) и facility сообщения, а в настройках Syslog перенаправить данные сообщения в отдельный файл. Сами же сообщения о SIP флуде будут выглядеть вот так:

Jun 17 23:54:44 sip2 kernel: SIP flood detected: IN=eth0 OUT= MAC=00:21:5e:db:15:b8:00:0f:34:f8:28:7f:08:00 SRC=184.172.62.3 DST=192.168.224.217 LEN=370 TOS=0x00 PREC=0x00 TTL=47 ID=0 DF PROTO=UDP SPT=5495 DPT=5060 LEN=350
Jun 17 23:54:44 sip2 kernel: SIP flood detected: IN=eth0 OUT= MAC=00:21:5e:db:15:b8:00:0f:34:f8:28:7f:08:00 SRC=184.172.62.3 DST=192.168.224.217 LEN=369 TOS=0x00 PREC=0x00 TTL=47 ID=0 DF PROTO=UDP SPT=5495 DPT=5060 LEN=349
Jun 17 23:54:44 sip2 kernel: SIP flood detected: IN=eth0 OUT= MAC=00:21:5e:db:15:b8:00:0f:34:f8:28:
Спасибо, Сергею Тамкович!

Соблюдайте правила безопасности, чтобы не стать очередным героем этого ролика!

Automated VOIP penetration testing using sipautohack from Sandro Gauci on Vimeo.