Первичная защита Вашего Asterisk или бронежилет для сервера

24 Ноя
2011

Как всегда нашим директорам, начальникам отдела, клиентам приходит в голову поставить у себя сервер телефонии. И зачастую выбор падает на бесплатный Asterisk. Мы приходим ставим сервер все прекрасно работает но в один момент мы сталкиваемся с тем что сервер-то либо не работает, либо у нас или клиента огромный минус на счету. Разбирая логи мы хватаемся за голову и понимаем, что уделив достаточное внимание диалпланам и SIP аккаунтам мы упустили физические моменты сервера. Пароли на администратора, менеджера, базу и т.д. и т.п. мы оставили их дефолтными. и теперь мы увлеченно разбираем логи и пытаемся исправить все что мы не доделали тогда. Но возникает вопрос зачем нам все это нужно после того как мы сдали свою работу? Итак по порядку. В качестве подопытного экземпляра был выбран дистрибутив AsteriksNOW 1.6 c FreePBX в качестве GUI и CentOS в качестве ОС. Описывать саму установку не имеет смысла т.к. это не является задачей. Множество мануалов в сети интернет помогут нам это сделать быстрее чем мы дочитаем этот пост.

Стандартные пароли зло но мы готовы к этому.

  Первое на что мы должны обратить внимание это стандартные пароли на сам астериск и подключение его к базе. Они содержатся в файле /etc/amportal.conf в строчках
...

AMPDBPASS: freepbx <- Его и меняем (далее pass1)

...

AMPMGRPASS: amp111 <- Его и меняем (далее pass2)

...
Теперь мы меняем данные пароли в файлах для корректного подключения. /etc/asterisk/cdr_mysql.conf
[global]

...

password = pass1

...
/etc/asterisk/cdr_mysql.conf
[admin]

...

secret = pass2
Теперь мы защищаем базу. Зная Mysql и возможности подключения к ней из вне просто перебиваем пароли либо устанавливаем ( по умолчанию пароля на базе нет)
mysql -p

"Enter password" нажимаем клавишу "Enter"

mysql > SET PASSWORD FOR freepbx@localhost=PASSWORD('new password');
теперь мы имеем после данных действий: Измененые дефолтные пароли на самом астериске, на подключении к базе, на базе данных.

IPtables + Fail2ban

После того как мы поменяли стандартные пароли наша задача усложнить злоумышленнику добраться до них. С этим прекрасно справляется дубль из IPtables и Fail2ban. Для установки Fail2ban нам требуется питон потому его и IPtables ставим в первую очередь (просто чтобы меньше печатать).
cd /usr/src/ 

yum install -y python iptables

wget sourceforge.net/projects/fail2ban/files/fail2ban-stable/fail2ban-0.8.4/fail2ban-0.8.4.tar.bz2/download

tar jxf fail2ban-0.8.4.tar.bz2

cd fail2ban-0.8.4

python setup.py install

cp /usr/src/fail2ban-0.8.4/files/redhat-initd /etc/init.d/fail2ban

chmod 755 /etc/init.d/fail2ban
Выполнив первичную установку мы переходим к конфигурированию.
Настраиваем Fail2ban
  Теперь мы должны сконфигурировать нашу утилиту на работу Создаем новый фильтр для работы с Asterisk
touch /etc/fail2ban/filter.d/asterisk.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 "" 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.* .*: Registration from '.*' failed for '' - Peer is not supposed to register

 NOTICE.* .*: Registration from '.*' failed for '' - ACL error (permit/deny)

 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 = #указываем наш IP с которого не будет проходить блок
Настраиваем /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@localhost]

logpath = /var/log/messages

maxretry = 5 <- количество попыток до бана

bantime = 259200 <- длительность бана в миллисекундах

 ignoreip=127.0.0.1, (#Свою подсеть если требуется)
В данном файле не забываем включить правила для SSH httpd/Apache и FTP и поменять правила sendmail-whois
Настраиваем логи Астера
  Т.к. Fail2Ban воспринимает (^) началом строки а Астериск вставляет дату в [Дата] заодно чтобы упредить вероятные ошибки логирования переделываем нотификацию в системный лог. Открываем /etc/asterisk/logger.conf Редактируем секцию [general] если ее нет то создаем перед секцией [logfiles]
 [general]

 dateformat=%F %T
В секции [logfiles] вставляем или расскоментируем строчку
syslog.local0 => notice
перезагружаем модуль логов астера
asterisk -rx "logger reload"
Настраиваем IPtables
помещаем в /etc/sysconfig/iptables
*mangle

:PREROUTING ACCEPT [48:5495]

:INPUT ACCEPT [48:5495]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [53:5502]

:POSTROUTING ACCEPT [53:5502]

COMMIT

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

# LOCAL ROUTING RULES

-A FORWARD -s Ваш IP или сеть /24 -j ACCEPT

-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

-A INPUT -i lo -j ACCEPT

#-A INPUT -i eth1 -s IP адрес SIP провайдера -j ACCEPT

-A INPUT -i eth1 --dport 22 -j REJECT --reject-with icmp-host-prohibited

-A INPUT -i eth1 --dport 53 -j REJECT --reject-with icmp-host-prohibited

-A INPUT -i eth1 --dport 80 -j REJECT --reject-with icmp-host-prohibited

-A INPUT -i eth1 --dport 111 -j REJECT --reject-with icmp-host-prohibited

-A INPUT -i eth1 --dport 999 -j REJECT --reject-with icmp-host-prohibited

-A INPUT -i eth1 --dport 3306 -j REJECT --reject-with icmp-host-prohibited

COMMIT

*nat

:PREROUTING ACCEPT [0:0]

:POSTROUTING ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

-A POSTROUTING -s Наша подсеть -o eth1 -j MASQUERADE 

COMMIT
Данный файл сделан с тем что наш Asterisk смотрит одним интерфейсов в локальную сеть, вторым в сеть интернет. Добавлять разрешения Fail2ban не требуется она сама пропишет нужные строки. Порты 111 (портмаппер для RPC) и 999 могут быть открытыми и не обязательно это трояны. Посему чтобы обезопасить себя мы закроем и их. Тут мы все закончили… можно запускать. Запускаем iptables /etc/init.d/iptables start Запускаем fail2ban /etc/init.d/fail2ban start Проверяем работу iptables -L -v -n Если мы получили следующий экран:
Chain INPUT (policy ACCEPT 795K packets, 71M bytes)

 pkts bytes target prot opt in out source destination

14823 851K fail2ban-SSH tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22

3962K 655M fail2ban-asterisk all -- * * 0.0.0.0/0 0.0.0.0/0

2882K 527M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED

 283K 57M ACCEPT all -- eth1 * IPадрес нашего SIP провайдера 0.0.0.0/0

 1717 126K ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0

 11 536 REJECT tcp -- eth1 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306 reject-with icmp-host-prohibited

 0 0 REJECT tcp -- eth1 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:999 reject-with icmp-host-prohibited

 0 0 REJECT tcp -- eth1 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:111 reject-with icmp-host-prohibited

 39 2008 REJECT tcp -- eth1 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 reject-with icmp-host-prohibited

 83 4468 REJECT tcp -- eth1 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)

 pkts bytes target prot opt in out source destination

 0 0 ACCEPT all -- * * Наша подсеть 0.0.0.0/0

 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED

Chain OUTPUT (policy ACCEPT 3393K packets, 850M bytes)

 pkts bytes target prot opt in out source destination

Chain fail2ban-SSH (1 references)

 pkts bytes target prot opt in out source destination

14823 851K RETURN all -- * * 0.0.0.0/0 0.0.0.0/0

Chain fail2ban-asterisk (1 references)

 pkts bytes target prot opt in out source destination

3962K 655M RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
Если мы это увидели значит мы все сделали правильно. Поздравляю с первым шагом физической защитой сервера. P.S. Не забываем про то, что пароли требуют особого подхода и лучше их генерировать из букв разного регистра, цифр и символов.
По материалам Хабрахабр.



загрузка...

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

Наверх