Настройка fail2ban для защиты ssh-proxy опубликованного в интернет
Использованные инструменты
- Fail2ban — это инструмент системного администратора для борьбы с перебором паролей, способный отслеживать логи на предмет неудавшихся попыток авторизации и применять действия для предупреждения повторения этих попыток. Простыми словами мониторит логи, считает попытки ввода пароля с чужого адреса, когда набирается определенное их количество — блокирует запросы с этого адреса в firewall на заданное время. По умолчанию 5 попыток — 10 минут бана.
- syslog-ng — это расширенный демон журнала, поддерживающий широкий спектр методов ввода и вывода: системный журнал, неструктурированный текст, очереди сообщений, базы данных (как SQL, так и NoSQL) и многое другое. Используется в образах виртуальных машин Infrascope.
- logrotate — утилита предназначена для упрощения администрирования файлов журналов в системе, которая генерирует множество файлов журналов. Logrotate позволяет автоматически выполнять ротационное сжатие, удаление и отправку файлов журналов. Logrotate можно настроить на обработку файла журнала ежечасно, ежедневно, еженедельно, ежемесячно, по истечении времени в минутах или когда файл журнала достигает определенного размера.
- Infrascope — наш продукт, в котором присутствует модуль интеграции с SIEM системами. В схеме реализуемой в инструкции мы будем через этот модуль отправлять данные в syslog-ng.
- pam-ssh — SSH прокси модуль Infrascope
- pam-auth — модуль авторизации Infrascope
- iptables — брандмауэр Linux
Схема
Злоумышленник -> iptables -> pam-ssh -> pam-auth -> модуль SIEM -> syslog-ng -> файл журнала -> fail2ban идентифицирует атаку и добавляет блокировку адреса в iptables
Алгоритм действий
- Включаем прием логов syslog-ng от SIEM модуля
- Настройка logrotate
- Настройка SIEM модуля в Infrascope
- Настройка fail2ban
1. Включаем прием логов syslog-ng от SIEM модуля
syslog-ng имеет выделенную директорию /etc/syslog-ng/conf.d для пользовательских конфигураций. В ней необходимо создать файл infrascope.conf со следующим содержимым
source s_pam_net {
udp(ip(127.0.0.1) port(514));
};
destination d_pam_net {
file("/var/log/pam.log");
};
log {
source(s_pam_net);
destination(d_pam_net);
};
source— регистрируем источник данных — на адресе 127.0.0.1 слушать 514/udpdestination— регистрируем назначение — определенный файл журналаlog— связываем источник с файлом журнала
2. Настройка logrotate
Добавить /var/log/pam.log в файл /etc/logrotate.d/syslog-ng. Пример итогового файла:
/var/log/syslog
{
rotate 7
daily
missingok
notifempty
delaycompress
compress
postrotate
invoke-rc.d syslog-ng reload > /dev/null
endscript
}
/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug
/var/log/messages
/var/log/error
/var/log/pam.log
{
rotate 4
weekly
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
invoke-rc.d syslog-ng reload > /dev/null
endscript
}
3. Настройка SIEM модуля в Infrascope
В разделе Администрирование -> Конфигурация системы добавляем следующие параметры
syslog.connection.protocol=UDPsyslog.message.content.format=KEY_VALUEsyslog.message.rfcFormat=RFC_5424syslog.server.hostName=localhostsyslog.server.port=514

В разделе SIEM -> SIEM конфиг: добавляем и включаем AuthLog.

“Ограничение максимального количества записей” лучше увеличить, т.к. к моменту настройки fail2ban в логах уже могут быть накоплены многие сотни тысяч записей. А работает этот параметр так — раз в минуту отправляет N записей из журнала.
Перезапускаем pam-gui
sudo systemctl restart pam-gui
На этом этапе события авторизации начнут поступать в syslog-ng и записываться в /var/log/pam.log
4. Настройка fail2ban
Сначала необходимо задать фильтр — для чего создадим в папке /etc/fail2ban/filter.d файл infrascope_sshproxy.conf со следующим содержимым:
# Fail2Ban filter for infrascope ssh-proxy
#
[Definition]
# это регулярные выражения для распознавания в логах событий требующих реакции
commonfailure=^.*event=[1-9],.*clientIp='<HOST>', params='User (.*) not found!'.*$
^.*event=[1-9],.*clientIp='<HOST>', params='(.*)invalid user credential'.*$
failregex = %(commonfailure)s
Можем проверить работу фильтра
fail2ban-regex -v /var/log/pam.log /etc/fail2ban/filter.d/infrascope_sshproxy.conf
Команда прочитает лог файл используя созданный фильтр, и посчитает события.
Далее необходимо добавить jail fail2ban. В папке /etc/fail2ban/jail.d создадим файл infrascope_sshproxy.conf со следующим содержимым
[infrascope_sshproxy]
enabled = true
# порты можно указать all
port = 2222,3333,443,5444
filter = infrascope_sshproxy
logpath = /var/log/pam.log
maxretry = 5
findtime = 60
bantime = 600
Можем проверить статус активных jail’ов
fail2ban-client status
Осталось перезапустить fail2ban
systemctl restart fail2ban