Стоит сегодня засветиться сервису в общедоступной сети, так практически он сразу становится объектом для атаки. Одной из проблем является попытка получения доступа посредством перебора паролей. И SSH является популярной целью.
Анализ /var/log/auth.log или аналогов, показывает что попытка подбора пароля как правило производится сразу с нескольких IP и растянута по времени. Пойти можно двумя путями: используя возможности настройки демона SSH, использование пакетного фильтра и Port knocking.

Самый простой и действенный способ это изменить 22 порт используемый по умолчанию, например на 2002. Если это не препятствует другим задачам:
В /etc/ssh/sshd_config
Port 2002
После этого попытки перебора паролей практически прекращаются. Хотя бывают случаи когда изменить порт нельзя.
Как вариант можно ограничить доступ по ssh определенным пользователям (в частности root) или группе. В sshd_config за это отвечает целый ряд параметров: AllowUsers, AllowGroups, DenyUsers и DenyGroups. Удобно то сразу с логином можно указать IP или подсеть. Например, разрешим доступ пользователю admin и user, последнему столько с определенного IP.
sshd_config:
AllowUsers admin user@192.168.0.1
Еще один действенный вариант защиты от перебора использование для аутентификации сертификатов. Причем при помощи специального параметра match, можно создать условный блок, в котором переопределить параметры в глобальной секции конфигурационного файла. Например, запретим вход по SSH по паролю для пользователя root, разрешив всем остальным:
PasswordAuthentication yes # всем разрешаем доступ по паролю
# пользователь root будет использовать только сертификат
match user root
PasswordAuthentication no
KbdInteractiveAuthentication no
Используя TCP Wrapper также можем ограничить доступ к любому сервису (демону) только с определенных IP, для этого следует лишь прописать в файл /etc/hosts.allow или /etc/hosts.deny нужное правило. Разрешим в /etc/hosts.allow доступ только с нужной подсети:
sshd : 192.168.1.0/24 : allow
Или в /etc/hosts.deny:
sshd : ALL : deny
sshd : ALL EXCEPT 192.168.1.0/24 : allow
Пакетный фильтр позволяет очень точно задавать параметры соединений, отбрасывая все ненужные пакеты. С его помощью легко ограничить доступ к 22 порту только определенными адресами.
iptables -A INPUT -s !192.168.0.1 -p tcp -m tcp --dport 22 -j REJECT --reject-with
icmp-port-unreachable
Простая фильтрация пакетов по портам и IP-адресам в таком случае не очень эффективна, особенно если сисадмин нe приязан к определенному рабочему месту. В этом случае помогут специальные утилиты. Один из них Fail2ban fail2ban.org), который изначально Fail2ban как раз и разрабатывался для защиты SSH. Хотя сегодня это уже фреймворк который можно легко настроить под любые приложения и события, в том числе и прописать свои методы блокировки IP. Принцип работы очень просто. Демон периодически проверяет журналы при помощи на наличие записей о любых подозрительных действиях. Затем подозрительный IP блокируется средствами iptables или TCP Wrapper. Через указанное в настройках время блокировка обычно снимается, чтобы случайно не заблокировать легальный узел. При срабатывании правила записывается событие в журнал /var/log/fail2ban.log и может быть отправлен email.
Один процесс может контролировать сразу несколько сервисов, а в пакете поставляются готовые настройки для популярных приложений Linux. В настройках по умолчанию защищается только SSH.
В Ubuntu и Debian устанавливается командой:
$ sudo apt-get install fail2ban
Все настройки производятся в нескольких файлах размещенных в каталоге /etc/fail2ban. В fail2ban.conf хранятся параметры запуска самого демона, в jail.conf описываются контролируемые сервисы (внутри секции ssh).
[ssh]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
Фильтры и действия прописываются в файлах, размещенных в подкаталогах filter.d и action.d. По умолчанию все файлы имеют расширение .conf, их лучше не трогать (в т.ч. и jail.conf). Все изменения следует заносить в файл с расширением .local (например jail.local), параметры которого замещают установки из первого. А при обновлении не будут потеряны. Для проверки работы фильтра можно использовать утилиту fail2ban-regex.
Альтернативой fail2ban можно назвать Sshguard (sshguard.net).
//
Будем анализировать логи, лишь бы не использовать pam
//
Полезная статья, спасибо.