Показаны сообщения с ярлыком APF. Показать все сообщения
Показаны сообщения с ярлыком APF. Показать все сообщения

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

Защита 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