В этой статье разберем как выглядит простая, но эффективная защита Asterisk с помощью Fail2ban, который заблокирует IP адрес злоумышленника до того, как он подключится к Вашей АТС перебирая пароли.
Хотите привлечь внимание роботов? Тогда запустите в открытом доступе в интернете сервис, например, Asterisk — открытую АТС. Роботы будут настойчиво искать способы совершать звонки на платные номера за ваш счёт. Вероятно, вы читаете этот пост после того, как увидели множество подобных попыток в командной строке Asterisk.
Так что же делать?
Fail2ban не является абсолютно надежным, но обеспечивает дополнительный уровень защиты и делает ваши лог-файлы и интерфейс командной строки более чистыми.
Принцип его работы прост: Fail2ban отслеживает ваши лог-файлы, выявляет вредоносные попытки и добавляет правило брандмауэра для блокировки нарушающего хоста.
В чём проблема? Конфигурация fail2ban для Asterisk давно не обновлялась, и я обнаружил, что ряд попыток регистрации и исходящих вызовов не фиксировались. Я потратил несколько дней на обновление своей конфигурации для Asterisk версии 18 и хотел бы поделиться ею на случай, если она поможет вам защитить ваш сервис Asterisk.
Есть два конфигурационных файла, оба должны присутствовать при установке Fail2ban и требуют лишь обновления. Я использую Ubuntu и указал пути к своим файлам, однако у вас они могут находиться по другим путям. Для Debian все точно так же.
/etc/fail2ban/jail.d/asterisk-jail.conf
[asterisk] # This needs to be true to tell Fail2ban to monitor and act on Asterisk logs enabled = true # Three attempts, and you're out! maxretry = 3 # Count to three attempts over the period of one day findtime = 1d # Naughty robots are banned for a year. This is my preference and you might be more lenient bantime = 1y # A space sepated list of ip addressess that should never be blocked. I've made these up as an example and you should configure your own. ignoreip = 127.0.0.0/8 192.168.0.0/24 # This line tells Fail2ban how to ban ip addressess. On Ubuntu it's likely iptables banaction = iptables-allports
/etc/fail2ban/filter.d/asterisk-filter.conf
# Fail2Ban filter for Asterisk
#
[INCLUDES]
# Include macros from common.conf
before = common.conf
[Definition]
_daemon = asterisk
__pid_re = (?:\s*\[\d+\])
iso8601 = \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+[+-]\d{4}
# All Asterisk log messages begin like this:
log_prefix= (?:NOTICE|SECURITY|WARNING|ERROR)%(__pid_re)s:?(?:\[C-[\da-f]*\])?:? [^:]+:\d*(?:(?: in)? [^:]+:)?
prefregex = ^%(__prefix_line)s%(log_prefix)s .+$
failregex = ^Registration from '[^']*' failed for '(:\d+)?' - (?:Wrong password|Username/auth name mismatch|No matching peer found|Not a local domain|Device does not match ACL|Peer is not supposed to register|ACL error \(permit/deny\)|Not a local domain)$
^Call from '[^']*' \(:\d+\) to extension '[^']*' rejected because extension not found in context
^(?:Host )? (?:failed (?:to authenticate\b|MD5 authentication\b)|tried to authenticate with nonexistent user\b)
^No registration for peer '[^']*' \(from \)$
^hacking attempt detected ''$
^SecurityEvent="(?:FailedACL|InvalidAccountID|ChallengeResponseFailed|InvalidPassword)"(?:(?:,(?!RemoteAddress=)\w+="[^"]*")*|.*?),RemoteAddress="IPV[46]/[^/"]+//\d+"(?:,(?!RemoteAddress=)\w+="[^"]*")*$
^"Rejecting unknown SIP connection from (?::\d+)?"$
^Request (?:'[^']*' )?from '(?:[^']*|.*?)' failed for '(?::\d+)?'\s\(callid: [^\)]*\) - (?:No matching endpoint found|Not match Endpoint(?: Contact)? ACL|(?:Failed|Error) to authenticate)\s*$
^Endpoint 'anonymous' \(:\d+\) has no configured AORs$
^SecurityEvent="(?:InvalidPassword|FailedACL)".*,RemoteAddress="IPV[46]\/(?:UDP|TCP|TLS)\/\/\d+
Call \((?:UDP|TCP|TLS)::\d+\) to extension '\+?\d*' rejected because extension not found in context '.*'.$
Error processing \d+ bytes packet from (?:UDP|TCP|TLS) :\d+ : PJSIP syntax error
ignoreregex =
datepattern = {^LN-BEG}
journalmatch = _SYSTEMD_UNIT=asterisk.service
[lt_journal]
# asterisk can log timestamp if logs into systemd-journal (optional part matching this timestamp, gh-2383):
__extra_timestamp = (?:\[[^\]]+\]\s+)?
__prefix_line = %(known/__prefix_line)s%(__extra_timestamp)s
У ботов нет шансов?
Автоматизированные боты добиваются успеха, потому что у них есть время. Они постепенно перебирают различные конфигурации, пока не найдут работающий вариант. Например, они могут пытаться набрать разные номера, пока один из них не пройдет через план набора, который вы, возможно, настроили для звонков на мобильные номера в вашем регионе. Если ваша система настроена правильно, маловероятно, что вредоносному боту повезет в течение 3 попыток, и Fail2ban заблокирует автоматизированного бота до того, как он что-либо обнаружит.
Однако у Fail2ban есть ограничения, которые важно понимать:
- Это не защитит от вашей разрешительной конфигурации. Например, если вы настроите Asterisk на разрешение анонимных звонков через платный сервис, автоматизированный бот добьётся успеха с первой попытки, и Fail2ban не обнаружит и не заблокирует его, потому что Asterisk сообщит об этом как о положительной записи в журнале, если вообще сообщит.
- Боты тоже могут получить удачу и сорвать куш за 3 попытки. Убедитесь, что ваша конфигурация безопасна, и используйте Fail2ban в качестве последней линии защиты, чтобы сделать ваши журналы менее содержательными.
- Грамотно спланированная вредоносная атака может подменить легитимный IP-адрес и заставить Fail2ban заблокировать этот адрес. Это приведет к отказу в обслуживании (DoS) для пользователей, находящихся за этим адресом. Это маловероятно, но тем не менее об этом следует помнить.
- Более вероятный сценарий — ложные срабатывания из-за неправильной конфигурации клиента. Например, легитимный удаленный хост с неверным паролем попытается зарегистрироваться несколько раз и будет заблокирован Fail2ban. Это может вызвать сильное разочарование при отладке проблемы, когда вы не понимаете, что удаленный IP-адрес заблокирован брандмауэром. При отладке всегда сначала проверяйте, не заблокировал ли Fail2ban IP-адрес.


Следи за своими финансами легко прямо в Telegram — начни вести учёт доходов и расходов уже сейчас!