Asterisk: защита от подбора паролей к SIP аккаунтам

Заметил, что у некоторых клиентов в Asterisk, который расположен за роутером и не имеет проброшенных к нему портов снаружи, стучатся боты пытаясь подобрать пароли к SIP аккаунтам. Как это происходит при отсутствии dnat, тема отдельной статьи. Тут мы разберем простые методы, которыми можно этому противостоять.

В логах мы видим следующее. Попытки ввести неправильный пароль:

/var/log/asterisk/messages.1:[2023-03-11 22:58:26] NOTICE[91872] chan_sip.c: 
Registration from '<sip:10@24.43.122.104>' failed for '71.112.148.181:52995' - Wrong password

И отправить INVITE пакеты на порт 5060:

/var/log/asterisk/messages:[2023-03-12 06:58:42] WARNING[106480] chan_sip.c: 
Timeout on 2088219419 on non-critical invite transaction.
Первым делом мы установим fail2ban для бана IP адресов, с которых ввели неправильный пароль. Тут можно не мудрить и воспользоваться настройками по умолчанию, для Ubuntu: 
sudo apt install fail2ban
Проверяем, что фильтр по умолчанию вам подходит (мне менять не пришлось) /etc/fail2ban/filter.d/asterisk.conf 
и включаем его в /etc/fail2ban/jail.conf добавив в секцию asterisk строку enabled  = true
У меня получилось так, учитывая время бана 2 суток при неправильном наборе пароля 1 раз:

[asterisk]
enabled = true
port     = 5060,5061
action   = %(banaction)s[name=%(__name__)s-tcp, port="%(port)s", protocol="tcp", chain="%(chain)s", actname=%(banaction)s-tcp]
           %(banaction)s[name=%(__name__)s-udp, port="%(port)s", protocol="udp", chain="%(chain)s", actname=%(banaction)s-udp]
           %(mta)s-whois[name=%(__name__)s, dest="%(destemail)s"]
logpath  = /var/log/asterisk/messages
bantime = 172800
maxretry = 1
Не забываем добавить свою подсеть в том же файле выше в белый список
ignoreip = 127.0.0.1/8 ::1 192.168.0.0/24
И проверить, что Asterisk пишет логи в нужном формате
/etc/asterisk/logger.conf, у меня он выглядит так:
[general]
dateformat=%F %T       ; ISO 8601 date format
[logfiles]
console => notice,warning,error
messages => notice,warning,error
Далее перезапускаем fail2ban и проверяем, что он поднялся:
systemctl restart fail2ban
systemctl status fail2ban
Забаненных клиентов смотрю так
fail2ban-client -v status asterisk
iptables -L -n -v
Вывести из бана можно так:
fail2ban-client set asterisk unbanip ip_address
Теперь разберемся с гостевыми INVITE  пакетами. Будем также банить. Можно попробовать воспользоваться для этого fail2ban или без него, скрипт я взял отсюда (там же есть вариант fail2ban). Создаем исполняемый скрипт /etc/asterisk/scripts/ban-ip-brute.sh:

#!/bin/bash
for IP in $(rasterisk -rx "sip show channels" | grep "INVITE" | grep "<guest>" | awk '{print $1}' | sort -n | uniq -c | awk '{print $2}')
do
  iptables -A INPUT -s $IP -m string --string 'INVITE' --algo bm -j DROP
echo `date "+%F %H:%M:%S"` - $IP banned >> /etc/asterisk/scripts/banned-IP-brute.log
done
создаем файл для логов, если вам они нужны:
touch /etc/asterisk/scripts/banned-IP-brute.log

и добавляем в cron каждые 5 минут например:

# баним ботов пытающихся подобрать SIP аккаунты INVITE пакетами
*/5    * * * * root    /etc/asterisk/scripts/ban-ip-brute.sh

Третий шаг, нам нужно проверить, что Asterisk настроен верно. Во первых, мы должны давать авторизовываться только клиентам из нашей подсети, для это в настройках SIP учеток добавьте например так:

deny=0.0.0.0/0.0.0.0 ; запретить доступ из всех подсетей
permit=192.168.0.0/255.255.255.0 ; разрешаем доступ только из нашей подсети
Там же, в файле /etc/asterisk/sip.conf в секии general проверяем, что у вас заданы:

allowguest = no ; запрещает гостевые (без аутентификации) подключения
authfailureevents = yes ; устанавливает статус пира если не может авторизоваться
alwaysauthreject = yes ; если запрос аутентификации был отклонен, то в ответе НЕ будет написано, что юзер введен неверно, помогает защитится от атаки перебора имен пользователей

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

Отправить комментарий