Найти тему

Fail2ban в Asterisk 16 - настройка безопасности на Debian 10

Оглавление

Не так давно, команда разработчиков объявила о релизе Debian 10. Для тех, кто использует Asterisk и обновился до этого релиза, прежде всего следует подумать о безопасности. В данной статье мы расскажем как установить и после этого настроить Fail2ban в Asterisk 16 на ОС Debian 10.

Данная статья является рекомендованным продолжением статьи об установке Asterisk 16 на Debian 10 “под ключ”. Большинство аспектов безопасности Asterisk мы к тому же, уделяли ранее в статье.

Формат данной статьи: простая пошаговая инструкция. Если у вас возникнут вопросы, просьба публиковать их в комментариях. Что имеем:

  • Debian 10 (Buster)
  • Asterisk 16 LTS
  • LAMP
  • Доверенные сети: 192.168.0.0/24, 192.168.1.0/24, 10.3.1.0/24

Приступаем:

Установка пакетов безопасности

Предварительная настройка:

apt-get update && apt-get upgrade -y
apt-get install -y debconf-utils

Переключимся в автоматический режим:

echo iptables-persistent iptables-persistent/autosave_v4 boolean true | debconf-set-selections
echo iptables-persistent iptables-persistent/autosave_v6 boolean true | debconf-set-selections

Установка пакетов безопасности:

apt-get install -y --allow-unauthenticated --allow-downgrades --allow-remove-essential --allow-change-held-packages iptables-persistent netfilter-persistent ipset fail2ban

Мы будем по умолчанию использовать IPtables в Debian 10, вместо nftables. Кстати, которую мы также рассматривали.

update-alternatives --set iptables /usr/sbin/iptables-legacy
update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy

Настройка IPtables

Защита от сканирования:

iptables -I INPUT -p udp -m udp --dport 5060:5091 -m string --string "eyeBeam" --algo bm -j DROP
iptables -I INPUT -p udp -m udp --dport 5060:5091 -m string --string "sipcli" --algo bm -j DROP
iptables -I INPUT -p udp -m udp --dport 5060:5091 -m string --string "VaxSIPUserAgent" --algo bm -j DROP
iptables -I INPUT -p udp -m udp --dport 5060:5091 -m string --string "SIVuS" --algo bm -j DROP
iptables -I INPUT -p udp -m udp --dport 5060:5091 -m string --string "sipvicious" --algo bm -j DROP
iptables -I INPUT -p udp -m udp --dport 5060:5091 -m string --string "sipsak" --algo bm -j DROP
iptables -I INPUT -p udp -m udp --dport 5060:5091 -m string --string "iWar" --algo bm -j DROP
iptables -I INPUT -p udp -m udp --dport 5060:5091 -m string --string "sundayddr" --algo bm -j DROP
iptables -I INPUT -p udp -m udp --dport 5060:5091 -m string --string "sip-scan" --algo bm -j DROP
iptables -I INPUT -p udp -m udp --dport 5060:5091 -m string --string "friendly-scanner" --algo bm -j DROP
iptables -I INPUT -p udp -m udp --dport 5060:5091 -m string --string "pplsip" --algo bm -j DROP
iptables -I INPUT -p udp -m udp --dport 5060:5091 -m string --string "CSipSimple" --algo bm -j DROP
iptables -I INPUT -p udp -m udp --dport 5060:5091 -m string --string "Gulp" --algo bm -j DROP
iptables -I INPUT -p udp -m udp --dport 5060:5091 -m string --string "sipv" --algo bm -j DROP
iptables -I INPUT -p udp -m udp --dport 5060:5091 -m string --string "smap" --algo bm -j DROP
iptables -I INPUT -p udp -m udp --dport 5060:5091 -m string --string "friendly-request" --algo bm -j DROP
iptables -I INPUT -p udp -m udp --dport 5060:5091 -m string --string "VaxIPUserAgent" --algo bm -j DROP
iptables -I INPUT -p udp -m udp --dport 5060:5091 -m string --string "siparmyknife" --algo bm -j DROP
iptables -I INPUT -p udp -m udp --dport 5060:5091 -m string --string "Test" --algo bm -j DROP

Добавляем таблицу VoIP и после этого разрешаем только известные подсети или IP-адреса:

iptables -N VOIP_ACCESS
iptables -A VOIP_ACCESS -s 192.168.0.0/24 -j ACCEPT
iptables -A VOIP_ACCESS -s 192.168.1.0/24 -j ACCEPT
iptables -A VOIP_ACCESS -s 10.3.1.0/24 -j ACCEPT
iptables -A VOIP_ACCESS -m limit --limit 2/min -j LOG --log-prefix "DROPPED: " --log-level 7
iptables -A VOIP_ACCESS -j DROP

Добавим порты, используемые Asterisk в созданную цепочку:

iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 1720 -j VOIP_ACCESS
iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 4559 -j VOIP_ACCESS
iptables -A INPUT -p udp -m conntrack --ctstate NEW -m udp --dport 4569 -j VOIP_ACCESS
iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 5038 -j VOIP_ACCESS
iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 5060:5091 -j VOIP_ACCESS
iptables -A INPUT -p udp -m conntrack --ctstate NEW -m udp --dport 5060:5091 -j VOIP_ACCESS

Для автоматического запуска правил IPtables после перезапуске системы мы установили netfilter-persistent. Настроим его на сохранение правила в файл и автозагрузку:

cat > /usr/share/netfilter-persistent/plugins.d/15-ip4tables << 'EOF'
#!/bin/sh
# This file is part of netfilter-persistent & iptables-persistent
# Copyright (C) 2019, PRO-VOIP.RU <info@pro-voip.ru>
#
set -e
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
load_rules()
{
# Загрузка правил IPv4
if [ ! -f /etc/iptables/rules.v4 ]; then
echo "Warning: skipping IPv4 (no rules to load)"
else
ipset restore < /etc/iptables/ipset-rules.v4 2> /dev/null
iptables-restore < /etc/iptables/iptables-rules.v4
fi
}
save_rules()
{
# Сохранение правил IPv4
modprobe -b -q iptable_filter || true
if [ ! -f /proc/net/ip_tables_names ]; then
echo "Warning: skipping IPv4 (Kernel support is missing)"
else
touch /etc/iptables/iptables-rules.v4
chmod 0640 /etc/iptables/iptables-rules.v4
touch /etc/iptables/ipset-rules.v4
chmod 0640 /etc/iptables/ipset-rules.v4
iptables-save > /etc/iptables/iptables-rules.v4
ipset save > /etc/iptables/ipset-rules.v4
fi
}
flush_rules()
{
if [ ! -f /proc/net/ip_tables_names ]; then
log_action_cont_msg "Warning: skipping IPv4 (Kernel support is missing)"
elif [ $(which iptables) ]; then
for chain in INPUT FORWARD OUTPUT
do
iptables -P $chain ACCEPT
done
for param in F Z X; do iptables -$param; done
for table in $(cat /proc/net/ip_tables_names)
do
iptables -t $table -F
iptables -t $table -Z
iptables -t $table -X
done
fi
}
case "$1" in
start|restart|reload|force-reload)
load_rules
;;
save)
save_rules
;;
stop)
echo "Automatic flushing disabled, use \"flush\" instead of \"stop\""
;;
flush)
flush_rules
;;
*)
echo "Usage: $0 {start|restart|reload|force-reload|save|flush}" >&2
exit 1
;;
esac
EOF

Подводим итог установки и настройки IPtables. Набор базовых команд:

  • Сохранить текущие правила:
netfilter-persistent save
Восстановить правила из файла:
iptables-restore < /etc/iptables/iptables-rules.v4

Настройка Fail2ban в Asterisk 16

Основная идея fail2ban прежде всего заключается в отслеживании логов общих сервисов для выявления ошибок аутентификации.

Когда fail2ban мониторит логи сервиса, он кроме того, сравнивает совпадения с настроенным для этого сервиса фильтр. Фильтр предназначен для определения сбоев аутентификации конкретного сервиса на основе сложных регулярных выражений. Шаблоны регулярных выражений определяются в переменной failregex.

  • /etc/fail2ban/jail.conf – основная конфигурация fail2ban. Перезаписывается при обновлении пакета.
  • /etc/fail2ban/filter.d/*.conf – регулярные выражения для блокировки.
  • /etc/fail2ban/jail.local – файл, который переопределяет глобальные настройки
  • /etc/fail2ban/jail.d/*.local – переопределяет глобальные настройки. Приоритет устанавливается в алфавитном порядке.
Действие по умолчанию – безусловно блокировка хоста/IP-адреса путем изменения правил брандмауэра iptables. Вы можете расширить это действие, например, настроив электронные уведомления администратора. Или, к примеру, отправку данных о злоумышленнике со строками лога, которые вызвали указанное действие на e-mail.

Для безопасного обновления пакетов, а также сохранение текущих настроек и правил, рекомендуется собственные правила создавать в файле /etc/fail2ban/jail.local.

cat > /etc/fail2ban/jail.local << EOF
# Copyright (C) 2019, PRO-VOIP.RU <info@pro-voip.ru>
# All rights reserved
# Fail2Ban configuration file.
[DEFAULT]
ignoreip = 192.168.0.0/24 192.168.1.0/24 10.3.1.0/24
bantime = 604800
findtime = 86400
maxretry = 3
logpath = /var/log/asterisk/security
destemail = root@localhost
sender = root@localhost
banaction = iptables-multiport
banaction_allports = iptables-allports
[asterisk-iptables]
enabled = true
port = 5060,5061
filter = asterisk
action = iptables-allports[name=ASTERISK, protocol=all]
%(mta)s-whois[name=ASTERISK, dest="%(destemail)s", sender=%(sender)s"]
logpath = /var/log/asterisk/messages
EOF
sed -i 's/blocktype = REJECT --reject-with icmp-port-unreachable/blocktype = DROP/' /etc/fail2ban/action.d/iptables-common.conf

Сохраняем и перезапускаем службу:

netfilter-persistent save
systemctl restart fail2ban

Настройка Asterisk 16

sed -i "s/;rotatestrategy = rotate/rotatestrategy=rotate /" /etc/asterisk/logger.conf
sed -i "s/;dateformat=%F %T/dateformat=%F %T /" /etc/asterisk/logger.conf
sed -i "s/;security => security/security => security /" /etc/asterisk/logger.conf
asterisk -rx "logger reload"