Защита ssh от подбора пароля


Предыстория этой статьи такая: оставил как-то домашний комп, на котором мирно 
приютилась Ubuntu, на несколько суток - торренты покачать. Проснулся с утра, 
решил посмотреть логи и обнаружил:

$ cat /var/log/auth.log | grep invalid
Dec  8 02:05:01 monster sshd[20083]: Failed password for invalid user username from 190.8.192.66 port 44223 ssh2
Dec  8 02:05:07 monster sshd[20087]: Failed password for invalid user administrator from 190.8.192.66 port 46516 ssh2
Dec  8 02:05:20 monster sshd[20095]: Failed password for invalid user test from 190.8.192.66 port 50891 ssh2
Dec  8 02:05:26 monster sshd[20099]: Failed password for invalid user root from 190.8.192.66 port 52630 ssh2
Dec  8 02:05:31 monster sshd[20103]: Failed password for invalid user admin from 190.8.192.66 port 55130 ssh2
Dec  8 02:05:38 monster sshd[20107]: Failed password for invalid user guest from 190.8.192.66 port 56862 ssh2
Dec  8 02:05:44 monster sshd[20111]: Failed password for invalid user master from 190.8.192.66 port 59278 ssh2

Какой-то чукча ломился по SSH почти сутки. Мой 50-символьный пароль, конечно, 
ему подобрать слабо, но вдруг что-нибудь еще угадает. Нужно защититься.
Начал с простого анализа: какие порты открыты. Оказалось, кроме ssh я, в общем, 
ничего и не открывал. К тому же я сижу за wifi-точкой доступа, и фаервол 
крутится на ней. Соответственно, только 22-ой порт прокидывается на мою машину. 
Значит, проверим ssh. Сначала, конечно, родной конфиг: /etc/ssh/sshd_config. 
Туда добавляем строчки:

# Рекомендуется для секьюрити
UsePrivilegeSeparation yes

# Плохая привычка - заходить по root-ом
PermitRootLogin no

# Пустые пароли - нельзя!
PermitEmptyPasswords no

# "Жесткий" режим - ON
StrictModes yes

# Кому вообще можно заходить
AllowUsers artix

Обязательно сделать рестарт:

$ sudo /etc/init.d/ssh restart

Но этих мероприятий недостаточно для защиты от "brute force" атак, или проще 
говоря, от простого подбора пароля. Тем более, что программа-автомат может 
подбирать пароли быстро и эффективно. Поэтому ставим специальное средство, 
которое позволит блокировать IP-адреса всех подбиральщиков на некоторое время, 
и тем самым, убить всю производительность автоматических роботов. Сначала я 
попробовал в данном контексте использовать sshguard, но он имеет 
жесткую связку с iptables или ipfw и отказывается корректно работать под ufw. 
Поэтому взял fail2ban

$ sudo apt-get install fail2ban

Программа fail2ban работает в связке с firewall: iptables, pf или ipfw - т.к. 
блокирование IP происходит именно через firewall. Включаем фаервол, если он не 
включен.

ufw status
Firewall not loaded
# ufw enable
Firewall started and enabled on system startup
# ufw status
Firewall loaded
# ufw default allow
Default policy changed to 'allow'
(be sure to update your rules accordingly)

Обратите внимание - последняя команда пропускает "всё", т.е. превращает ваш 
компьютер в одну сплошную дыру. В моем случае это не критично, т.к. локальных 
машин нет, а от глобальных я защищен файерволом, встроенным в железку - роутер. 
Поэтому мне важно просто запустить фаервол. Далее нужно обязательно посмотреть 
в файл /etc/fail2ban/jail.conf - основной файл настройки fail2ban. Здесь 
регулируются время блокировки и еще много ценных параметров, которые могут 
оказаться весьма полезны. Дальше - достаточно просто запустить fail2ban как 
сервис:

# /etc/init.d/fail2ban restart

Желательно так же сделать старт fail2ban автоматическим. Для этого лично мне 
удобно пользоваться утилитой sysv-rc-conf. По-моему, наглядней некуда. Вот и 
все. На защиту ушло 10 минут. Теперь можно спать спокойно.