суббота, 11 декабря 2010 г.

SSHguard: защита SSH от подбора паролей

Для защиты SSH от подбора пароля существует простенькая программа SSHguard. Впрочем, она умеет защищать не только SSH, но так же и почтовые и FTP-сервера.
Установка под Debian крайне проста:

> apt-get -y install sshguard

Reading package lists...
Building dependency tree...
Reading state information...
The following packages were automatically installed and are no longer required:
libdns66 libisccfg60 libisc60
Use 'apt-get autoremove' to remove them.
The following NEW packages will be installed:
sshguard
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 46.5 kB of archives.
After this operation, 102 kB of additional disk space will be used.
Get:1 http://ftp.de.debian.org/debian/ unstable/main sshguard amd64 1.4-2 [46.5 kB]
Fetched 46.5 kB in 0s (305 kB/s)
Selecting previously deselected package sshguard.
(Reading database ... 61780 files and directories currently installed.)
Unpacking sshguard (from .../sshguard_1.4-2_amd64.deb) ...
Processing triggers for man-db ...
Setting up sshguard (1.4-2) ...
.. установка завершена.

Конфигов в SSHguard нету, все параметры задаются через командную строку.
Настроим IPtables (поддерживаются и другие файрволы) для работы с SSHguard. Я создаю новую цепочку с именем sshguard в таблице filter (по умолчанию), добавляю новое правило в конец созданной цепочки, задаю политику по умолчанию для созданной цепочки (ACCEPT или DROP) и в конце сохраняю конфиг:

> iptables -N sshguard
> iptables -A INPUT -j sshguard
> iptables -P INPUT ACCEPT

Тоже самое проделываю для IPv6:

> ip6tables -N sshguard
> ip6tables -A INPUT -j sshguard
> ip6tables -P INPUT ACCEPT

Либо можно сделать несколько иначе, то есть после проверки sshguard разрешать только определенные порты, а все остальное блочить:

iptables -N sshguard
# Блокировать всё что sshguard сочтет нужным ...
iptables -A INPUT -j sshguard
# разрешаем ssh, dns, http, https
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# и блокируем всё остальное
iptables -P INPUT DROP

Сохраняем правила и делаем автозапуск iptables

SSHguard необходимо дать права, чтобы он перезаписывать правила iptables:
> chmod +s /usr/sbin/sshguard

Напишем небольшой скрипт /etc/init.d/sshguard для автозапуска SSHguard с необходимыми параметрами для работы:

#!/bin/sh
tail -n0 -F /var/log/auth.log | /usr/sbin/sshguard -b 3:/var/lib/sshguard/blocklist -w /var/lib/sshguard/whitelist

Делаем скрипт исполняемым и добавляем в автозапуск:
chmod +x /etc/init.d/sshguard
update-rc.d -n sshguard defaults

Проверяем, что sshguard запущен с помощью команды
> ps ax | grep sshguard

Брутефорсом sshguard, по умолчанию, считает 4 неудачные набора пароля. Изменяется это число с помощью опции -a
После того как sshguard определит подбор пароля, он добавит правило в файерволл, а потом по истечении времени, по умолчанию это 420 секунд, правило удалится. При повторе атаки время блокировки выростет в 2 раза.
Так же с помощью опции -b можно сделать черные список. Указать -b 3:/var/lib/sshguard/blocklist и после 3 блокировок файерволом, хост будет внесен в черный список и навсегда блокирован. Файл /var/lib/sshguard/blocklist содержит данные в нечитаемом формате, однако можно использовать утилиту strings, чтобы просмотреть список заблокированных адресов.
Я использую такие параметры:

-b 3:/var/lib/sshguard/blocklist -w /var/lib/sshguard/whitelist

Здесь /var/lib/sshguard/whitelist - текстовый файл адресов, которые не проверяются sshguard.
Пример такого файла:
# comment line (a '#' as very first character)
# a single IPv4 and IPv6 address
1.2.3.4
2001:0db8:85a3:08d3:1319:8a2e:0370:7344
# address blocks in CIDR notation
127.0.0.0/8
10.11.128.0/17
192.168.0.0/24
2002:836b:4179::836b:0000/126
# hostnames
rome-fw.enterprise.com
hosts.friends.com
Собственно и всё. Подробнее о параметрах работы можно посмотреть командой man sshguard либо в /usr/share/doc/sshguard.

2 комментария:

Unknown комментирует...

ИМХО весьма кривой костыль - существует более красивое и комплексное решение данной проблемы - fail2ban - работает еще и с apache ftp и вообще крутая штука, очень гибкая.

Евгений Медведев комментирует...

Про fail2ban слышал от моего френда Паши Одинцова, но он предупредил, что без напильника к нему лучше не подходить.
Будет время, как нить в виртуалке погоняю.