Я вижу подобные вещи в моем /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 ...
Теория очень проста:
Если у вас установлен 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