Назад | Перейти на главную страницу

Остановка брутфорса SSH из Китая - fail2ban не работает

Я вижу подобные вещи в моем /var/log/auth.log

sshd[2173]: Unable to negotiate with 218.92.0.205 port 21029: no matching host key type found. Their offer: ssh-rsa,ssh-dss [preauth]

sshd[1964]: Unable to negotiate with 218.92.0.205 port 26342: no matching host key type found. Their offer: ssh-rsa,ssh-dss [preauth]

sshd[3031]: Unable to negotiate with 218.92.0.205 port 25903: no matching host key type found. Their offer: ssh-rsa,ssh-dss [preauth]

fail2ban не фильтрует эти проблемы.

для справки моя конфигурация jail.local:

[sshd]


enabled = true
filter = sshd
port = 0:65535
banaction = ufw
bantime = -1
maxretry = 1
logpath = %(sshd_log)s
backend = %(sshd_backend)s

Я думаю, мне нужно обновить регулярное выражение, как я могу заблокировать этот спам?

При изучении /etc/fail2ban/filter.d/sshd.conf будем надеяться, что регулярные выражения для Unable to negotiate with записи журнала.

sshd вбегает normal режим, чтобы обнаружить ddos (дополнительно есть extra и aggressive) этот режим должен быть определен в jail.local.

Для указанного вами сценария это будет extra:

[sshd]
mode = extra
# same as filter with argument
# filter = sshd[mode=extra]
# ... rest of your configuration, findtime, maxretry ...

Кроме того, можно было бы определить другую тюрьму с другими настройками:

[sshd-custom]
enabled = true
filter = sshd[mode=extra]
# ... rest of your configuration, findtime, maxretry ...

ПРИМЕЧАНИЕ: Обязательно запускайте как root

Теория очень проста:

  1. Прочтите / var / secure / log и отфильтруйте несоответствие пароля ssh (нужен root)
  2. Создайте скрипт python, способный создавать команду iptables ban на основе порога (жестко запрограммированного)

Если у вас установлен python (а если у вас есть fail2ban), вы можете запустить этот простой скрипт

import sys
import re

# Save the input data into a string
raw = sys.stdin.read().strip()

BAN_COUNT = 3
# Split the lines of the log
data = raw.split("\n")
to_ban = {}
# Iterate the lines
for item in data:
    # Extract IP
    ip = re.findall(r"[0-9]+(?:\.[0-9]+){3}", item)
    # Due to the filter, we can have only 1 IP
    if len(ip) == 1:
        # print("Found IP to BAN -> {}".format(ip[0]))
        # If IP alredy found increase counter
        if ip[0] in to_ban:
            to_ban[ip[0]] += 1
        # First time that we encounter the IP, create new entry in dict
        else:
            to_ban[ip[0]] = 1
# Create iptables mask for ban
for keys in to_ban.keys():
    if to_ban[keys] >= BAN_COUNT:
        # BAN MASK
        # Use this for ban
        # ban_mask = 'iptables -A INPUT -s {} -j DROP'.format(keys)
        # Use this for test purpouse
        ban_mask = 'echo "iptables -A INPUT -s {} -j DROP"'.format(keys)
        print(ban_mask)

Теперь, когда у нас есть скрипт python, который берет строки ввода, извлекает ip, подсчитывает, сколько раз они сравнивают в тексте, и выводит команду iptables для запрета ip, мы можем проанализировать secure журнал.

Сохраните сценарий как ban.py

cat /var/log/secure | egrep 'Failed password for' | python ban.py | xargs command