Безопасность — наше всё. Мы разлогиниваемся из мессенджеров и страниц социальных сетей на чужих компьютерах. Мы не хотим, что бы кто то завладел нашим акаунтом и данными. И пока мы этого не хотим какой то злодей подбирает пароль к нашему серверу. Вот и я на одном из своих серверов увидел вот такое:
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-whois[name=SSH, dest=admin@tradenark.com.ua, sender=fail2ban@tradenark.com.ua]
то в теле письма мы увидим больше побробностей об IP-адресе
Добавляем сервис в автозапуск и стартуем
# 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
Привет Глеб, если дефолтный firewalld оставить, то какой action тогда будет? спс
Добрый вечер, Николай 1000 -j RETURN 0 -m state —state NEW -p —dport -j f2b- 0 -m state —state NEW -p —dport -j f2b-$’ 0 -s -j 0 -s -j
По умолчанию присутствуют 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-
firewall-cmd —direct —add-rule ipv4 filter
actionstop = firewall-cmd —direct —remove-rule ipv4 filter
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-
actionunban = firewall-cmd —direct —remove-rule ipv4 filter f2b-
[Init]
chain = INPUT_direct
И второе: hash:ip timeout 0 -p -m multiport —dports -m set —match-set fail2ban- src -j 0 -p -m multiport —dports -m set —match-set fail2ban- src -j timeout -exist -exist
cat /etc/fail2ban/action.d/firewallcmd-ipset.conf | grep -v «^#» | grep -v «^$»
[INCLUDES]
before = iptables-common.conf
[Definition]
actionstart = ipset create fail2ban-
firewall-cmd —direct —add-rule ipv4 filter
actionstop = firewall-cmd —direct —remove-rule ipv4 filter
ipset flush fail2ban-
ipset destroy fail2ban-
actionban = ipset add fail2ban-
actionunban = ipset del fail2ban-
[Init]
chain = INPUT_direct
bantime = 600
Должно сработать. Напишите здесь о результате