Pull to refresh

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

Как всегда нашим директорам, начальникам отдела, клиентам приходит в голову поставить у себя сервер телефонии. И зачастую выбор падает на бесплатный 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. Не забываем про то, что пароли требуют особого подхода и лучше их генерировать из букв разного регистра, цифр и символов.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.