Как всегда нашим директорам, начальникам отдела, клиентам приходит в голову поставить у себя сервер телефонии. И зачастую выбор падает на бесплатный Asterisk.
Мы приходим ставим сервер все прекрасно работает но в один момент мы сталкиваемся с тем что сервер-то либо не работает, либо у нас или клиента огромный минус на счету. Разбирая логи мы хватаемся за голову и понимаем, что уделив достаточное внимание диалпланам и SIP аккаунтам мы упустили физические моменты сервера.
Пароли на администратора, менеджера, базу и т.д. и т.п. мы оставили их дефолтными. и теперь мы увлеченно разбираем логи и пытаемся исправить все что мы не доделали тогда. Но возникает вопрос зачем нам все это нужно после того как мы сдали свою работу?
Итак по порядку. В качестве подопытного экземпляра был выбран дистрибутив AsteriksNOW 1.6 c FreePBX в качестве GUI и CentOS в качестве ОС. Описывать саму установку не имеет смысла т.к. это не является задачей. Множество мануалов в сети интернет помогут нам это сделать быстрее чем мы дочитаем этот пост.
Первое на что мы должны обратить внимание это стандартные пароли на сам астериск и подключение его к базе. Они содержатся в файле /etc/amportal.conf в строчках
Теперь мы меняем данные пароли в файлах для корректного подключения.
/etc/asterisk/cdr_mysql.conf
/etc/asterisk/cdr_mysql.conf
Теперь мы защищаем базу. Зная Mysql и возможности подключения к ней из вне просто перебиваем пароли либо устанавливаем ( по умолчанию пароля на базе нет)
теперь мы имеем после данных действий:
Измененые дефолтные пароли на самом астериске, на подключении к базе, на базе данных.
После того как мы поменяли стандартные пароли наша задача усложнить злоумышленнику добраться до них. С этим прекрасно справляется дубль из IPtables и Fail2ban. Для установки Fail2ban нам требуется питон потому его и IPtables ставим в первую очередь (просто чтобы меньше печатать).
Выполнив первичную установку мы переходим к конфигурированию.
Теперь мы должны сконфигурировать нашу утилиту на работу
Создаем новый фильтр для работы с 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 http://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. Не забываем про то, что пароли требуют особого подхода и лучше их генерировать из букв разного регистра, цифр и символов.