Так, сегодня будем конструировать небольшую защиту операционки. Как минимум, осложним жизнь подборщикам паролей. Принцип работы:
- мониторит указанные логи
- ищет строки по шаблону
- если в заданный промежуток времени нашлось строк больше ограничителя, то адрес “атакующего” блокируется на заданное время.
Установка проста и незатейлива:
apt-get -t stretch install fail2ban
Запускаем в соседнем окошке просмотр лога – tail -f /var/log/fail2ban.log . Опа, уже кого-то заблокировала. Строка лога:
2015-11-28 10:30:51,506 fail2ban.actions [11771]: NOTICE [sshd] Ban 43.229.53.97
Хорошо, посмотрим, за что – cat /var/log/auth.log |fgrep 43.229.53.97, выскакивает:
Nov 28 10:26:36 XXX sshd[11763]: Failed password for root from 43.229.53.97 port 44472 ssh2
Nov 28 10:26:36 XXX sshd[11767]: Failed password for root from 43.229.53.97 port 17219 ssh2
Nov 28 10:26:36 XXX sshd[11763]: Received disconnect from 43.229.53.97: 11: [preauth]
Nov 28 10:26:36 XXX sshd[11763]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=43.229.53.97 user=root
Nov 28 10:26:36 XXX sshd[11767]: Received disconnect from 43.229.53.97: 11: [preauth]
Nov 28 10:26:36 XXX sshd[11767]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=43.229.53.97 user=root
Ага, попался подборщик паролей. Теперь посмотрим, что программа с ним сделала – iptables -L (в конце таблицы):
Chain f2b-sshd (1 references)
target prot opt source destination
REJECT all -- 43.229.53.97 anywhere reject-with icmp-port-unreachable
RETURN all -- anywhere anywhere
Отлично, так и надо. С этого ip доступ блокирован совсем. Осталось подождать и посмотреть, через сколько fail2ban снимет блокировку. Попьём кофейку, пока в логе fail2ban не появится запись:
2015-11-28 10:40:52,364 fail2ban.actions [11771]: NOTICE [sshd] Unban 43.229.53.97
Проверяем iptables :
Chain f2b-sshd (1 references)
target prot opt source destination
RETURN all -- anywhere anywhere
10 минут бана, маловато. Поскольку я неравнодушен к подборщикам паролей для ssh, ща мы им жизнь усложним. Сначала посмотрим состояние:
#fail2ban-client -i
Fail2Ban v0.9.3 reads log file that contains password failure report
and bans the corresponding IP addresses using firewall rules.
fail2ban> status
Status
|- Number of jail: 1
`- Jail list: sshd
fail2ban> status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 332
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 0
|- Total banned: 1
`- Banned IP list:
fail2ban> get sshd bantime
600
fail2ban> get sshd findtime
600
fail2ban> get sshd maxretry
5
Один фильтр – в системе именуется jail, виден лог-файл. Currently failed – это сколько было найдено регулярных выражений (подозрений к бану) за текущий “отчётный период”. bantime – на сколько блокирует, findtime – “отчётный период”, maxretry – неудачных попыток. Итого, в течение 10 минут можно совершить 5 попыток подобрать пароль. Дальнейшее зависит от версии. Может, потребуется редактировать файл /etc/fail2ban/jail.conf (секцию [sshd]), ну а я создаю файл /etc/fail2ban/jail.d/sshd.conf (чтобы при обновлении fail2ban конфиг не затёрся) следующего содержания:
[sshd]
enabled = true
bantime = 1800
Теперь, в клиенте fail2ban, даём команды:
fail2ban> reload sshd
fail2ban> get sshd bantime
1800
Отлично, время бана изменилось, программа подцепила новый конфиг. Подробнее можно увидеть в /var/log/fail2ban.log :
2015-11-28 11:16:47,038 fail2ban.jail [11771]: INFO Jail 'sshd' stopped
2015-11-28 11:16:47,289 fail2ban.server [11771]: INFO Changed logging target to /var/log/fail2ban.log for Fail2ban v0.9.3
2015-11-28 11:16:47,290 fail2ban.jail [11771]: INFO Creating new jail 'sshd'
2015-11-28 11:16:47,290 fail2ban.jail [11771]: INFO Jail 'sshd' uses pyinotify
2015-11-28 11:16:47,291 fail2ban.filter [11771]: INFO Set jail log file encoding to UTF-8
2015-11-28 11:16:47,297 fail2ban.jail [11771]: INFO Initiated 'pyinotify' backend
2015-11-28 11:16:47,502 fail2ban.filter [11771]: INFO Set jail log file encoding to UTF-8
2015-11-28 11:16:47,503 fail2ban.filter [11771]: INFO Set findtime = 600
2015-11-28 11:16:47,706 fail2ban.filter [11771]: INFO Added logfile = /var/log/auth.log
2015-11-28 11:16:48,795 fail2ban.actions [11771]: INFO Set banTime = 1800
2015-11-28 11:16:48,796 fail2ban.filter [11771]: INFO Set maxRetry = 5
2015-11-28 11:16:48,796 fail2ban.filter [11771]: INFO Set maxlines = 10
2015-11-28 11:16:48,830 fail2ban.server [11771]: INFO Jail sshd is not a JournalFilter instance
2015-11-28 11:16:48,839 fail2ban.jail [11771]: INFO Jail 'sshd' started
Запомним несколько команд:
- fail2ban-client -i – работа в интерактивном режиме. Посмотреть статусы, перегрузить конфиги и прочая…
- fail2ban-regex /var/log/apache2/contrpost.com.80/access.log /etc/fail2ban/filter.d/apache-get-ddos.conf /etc/fail2ban/filter.d/apache-get-ddos.conf – проверить составленный конфиг с regex. Второй параметр – откуда брать фильры для поиска, третий – для игнорирования строк.
- iptables -L – распечатать таблицу фильтров для ip
Пока всё, установка и знакомство закончились.
Ссылки:
- Официальный сайт fail2ban – wiki
- How To: Stop Apache DOS attacks with Fail2Ban – добавление конфига на большое число запросов от одного IP.