Fail2ban — на шаг впереди брутфорсеров

fail2banБезопасность — наше всё. Мы разлогиниваемся из мессенджеров и страниц социальных сетей на чужих компьютерах. Мы не хотим, что бы кто то завладел нашим акаунтом и данными. И пока мы этого не хотим какой то злодей подбирает пароль к нашему серверу. Вот и я на одном из своих серверов увидел вот такое:
There were 228 failed login attempts since the last successful login.
Ну хорошо хоть попытки были неудачными. Пароль у меня крутой, но всё равно не очень нравится, когда кто то лапатит доступы на сервер.
Для исправления данного неудобства я решил использовать fail2ban. Коробочный он умеет анализировать логи на наличие определённых строк с помощью регулярных выражений и в случае нахождения предпринимать указанные действия
Этого функционала хватит
Установка довольно проста:

# yum install fail2ban
Installing:
fail2ban
Installing for dependencies:
fail2ban-firewalld
fail2ban-sendmail
fail2ban-server
ipset
ipset-libs
systemd-python
Updating for dependencies:
libgudev1
systemd
systemd-libs
systemd-sysv

Transaction Summary
==============================================
Install 1 Package (+6 Dependent packages)
Upgrade ( 4 Dependent packages)

На своём сервере я заменил firewalld на iptables, по этому и action будет для iptables
Правим конфигурационный файл:

# vim /etc/fail2ban/jail.conf

В секции [DEFAULT] находим следующие параметры и правим на своё усмотрение

ignoreip = 127.0.0.1 # не баним сами себя
bantime = 3600 # устанавливаем время бана на 1 час то есть 3600 секунд
findtime = 600 # отслеживаем данные только за последние 10 минут то есть 600 секунд.
maxretry = 2 # максимальное разрешённое количество попыток ввода пароля

И ниже в секции [JAIL] добавляем

[ssh-iptables]

enabled = true
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
         sendmail[name=SSH, dest=admin@tradenark.com.ua, sender=fail2ban@tradenark.com.ua]
logpath = /var/log/secure
maxretry = 2

как видно в нашем jail есть 2 экшина: iptables и sendmail.
Первый добавляет запрещающее правило в iptables, а второй отправляет уведомление с помощью sendmail следующего содержания
sendmail
если заменить строку на

sendmail-whois[name=SSH, dest=admin@tradenark.com.ua, sender=fail2ban@tradenark.com.ua]

то в теле письма мы увидим больше побробностей об IP-адресе
sendmail-whois
Добавляем сервис в автозапуск и стартуем

# systemctl enable fail2ban
ln -s '/usr/lib/systemd/system/fail2ban.service' '/etc/systemd/system/multi-user.target.wants/fail2ban.service'
# systemctl start fail2ban

Через пару секунд уже можно проверять правила фаервола на наличие заблокированных айпишников, с которых хотели подобрать наш пароль

# iptables -L
Chain f2b-SSH (1 references)
target prot opt source destination
REJECT all -- 150.0.47.59.broad.bx.ln.dynamic.163data.com.cn anywhere reject-with icmp-port-unreachable
REJECT all -- p84018-obmd01.tokyo.ocn.ne.jp anywhere reject-with icmp-port-unreachable
RETURN all -- anywhere anywhere

Для пущей убедительности я зашёл на другой сервер и инициировал ssh-соединение с заведомо неправильными авторизационными данными:

# ssh root@host.tradenark.com.ua
The authenticity of host 'host.tradenark.com.ua (1.1.1.1)' can't be established.
ECDSA key fingerprint is 44:5e:09:a2:35:af:5e:13:fc:06:11:11:11:11:11:11.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'host.tradenark.com.ua' (ECDSA) to the list of known hosts.
root@host.tradenark.com.ua's password:
Permission denied, please try again.
root@host.tradenark.com.ua's password:
Permission denied, please try again.
root@host.tradenark.com.ua's password:
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
# ssh root@host.tradenark.com.ua
ssh: connect to host host.tradenark.com.ua port 22: Connection refused

Работает, правило тоже появилось появилось:
REJECT all — host.tradenark.com.ua anywhere reject-with icmp-port-unreachable

Это пока что первый jail. Следующим шагом будет блокирование тех, кто подбирает всякие админ-панели и ссылки на phpMyAdmin

Fail2ban — на шаг впереди брутфорсеров: 2 комментария

    1. Воронов Глеб Автор записи

      Добрый вечер, Николай
      По умолчанию присутствуют 2 правила для firewalld:
      # cat /etc/fail2ban/action.d/firewallcmd-new.conf | grep -v «^#» | grep -v «^$»
      [INCLUDES]
      before = iptables-common.conf
      [Definition]
      actionstart = firewall-cmd —direct —add-chain ipv4 filter f2b-
      firewall-cmd —direct —add-rule ipv4 filter f2b-
      1000 -j RETURN
      firewall-cmd —direct —add-rule ipv4 filter 0 -m state —state NEW -p —dport -j f2b-
      actionstop = firewall-cmd —direct —remove-rule ipv4 filter 0 -m state —state NEW -p —dport -j f2b-
      firewall-cmd —direct —remove-rules ipv4 filter f2b-

      firewall-cmd —direct —remove-chain ipv4 filter f2b-

      actioncheck = firewall-cmd —direct —get-chains ipv4 filter | grep -q ‘f2b-
      $’
      actionban = firewall-cmd —direct —add-rule ipv4 filter f2b-
      0 -s -j
      actionunban = firewall-cmd —direct —remove-rule ipv4 filter f2b- 0 -s -j
      [Init]
      chain = INPUT_direct

      И второе:
      cat /etc/fail2ban/action.d/firewallcmd-ipset.conf | grep -v «^#» | grep -v «^$»
      [INCLUDES]
      before = iptables-common.conf
      [Definition]
      actionstart = ipset create fail2ban- hash:ip timeout
      firewall-cmd —direct —add-rule ipv4 filter 0 -p -m multiport —dports -m set —match-set fail2ban- src -j
      actionstop = firewall-cmd —direct —remove-rule ipv4 filter 0 -p -m multiport —dports -m set —match-set fail2ban- src -j
      ipset flush fail2ban-
      ipset destroy fail2ban-

      actionban = ipset add fail2ban-
      timeout -exist
      actionunban = ipset del fail2ban- -exist
      [Init]
      chain = INPUT_direct
      bantime = 600

      Должно сработать. Напишите здесь о результате

Добавить комментарий