Не так давно, команда разработчиков объявила о релизе 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"