В Интернете полно всяких червяков, которые сканируют адреса, и обнаружив доступный ssh-сервис, вкачивают в него многие тысячи паролей из своих словарей. Всё бы ничего, но такие атаки отжирают гораздо больше внешнего трафика, чем хотелось бы -- один только лог неудачных входов за прошлый год у меня весит больше 50Мб. Почему я должен платить из своего кармана за то, что в Интернете полно всяких червяков?
Представленный патч реализует следующую фичу: каждый неудачный логин записывается в мини-БД (по умолчанию /var/db/sshd.lockout); как только с одного адреса набирается N (по умолчанию 5) неудачных логинов, доступ для этого адреса запрещается. В мини-БД хранится только M (по умолчанию 10) последних адресов, с которых шли атаки; так что через некоторое время, когда будут осуществлены атаки с M новых адресов, старые адреса будут разблокированы.
Реализация мини-БД в виде файла на диске, а не структуры в памяти, позволяет достичь совместимости с inetd(8), если она вдруг кому-нибудь нужна, а также сохранения базы при перезагрузках.
Прилагается также скрипт, анализирующий базу и запрещающий доступ заблокированным адресам на уровне ipfw(4), не допуская расхода трафика даже на установление TCP-соединения с sshd. Этот скрипт предназначен для регулярного запуска из cron(8). Он добавляет заблокированные адреса в таблицу №22, т.е. требуется правило ipfw вида "deny tcp from table(22) to me 22 setup"
Патч создавался для OpenSSH версии 3.8.1p1-FreeBSD-20040419, и я не в курсе его совместимости с другими версиями.