Я хочу уменьшить вероятность успешной атаки ssh на систему Linux. Единственный открытый порт - 22 (я использую переадресацию портов для всего остального), и, конечно же, я убедился, что ssh принимает только логины на основе пары ключей (без паролей).
Объем неудачных попыток входа в систему ssh (вывод last -f /var/log/btmp
) был довольно большим (как и следовало ожидать любому, открывающему порт 22), поэтому в течение последних 2+ лет я полагался на разновидность решений на основе iptables, часто упоминаемых для блокирования атак ssh, например Сотни неудачных попыток входа по ssh.
Один досадный недостаток такой схемы заключается в том, что она ограничивает количество новых подключений с IP-адреса за период времени, независимо от того, были ли предыдущие подключения с этого IP-адреса успешными или нет, и пытались ли они войти в систему как тот же пользователь или не. Представьте себе сценарий, содержащий полдюжины rsync
команды, используемые из-за границы для обновления различных областей на этом сервере: обычно он достигает «лимита нового соединения» и терпит неудачу где-то посередине. То же самое происходит, если несколько пользователей за маршрутизатором (отображаются как один и тот же IP-адрес) подключаются к моему серверу более или менее одновременно.
Итак, мне интересно, если, не прибегая к синтаксическому анализу /var/log
файлы, можно реализовать следующую стратегию с iptables
:
Бонусные очки:
user@ip
вместо всех @ip
.И чтобы попытаться пресечь атаки ботнета:
Без анализа файлов журналов вы не можете узнать, была ли попытка входа в систему ssh успешной. К счастью, вам не нужно разбирать эти файлы журналов самостоятельно. fail2ban могу сделать это за вас. Я обычно заключаю IP в тюрьму на неделю после 3 неудачных попыток входа в систему.
Прежде всего не иметь ssh
слушай port 22
чтобы снизить вероятность обнаружения вашего порта автоматическими сканерами.
Также используйте psad
к автоматически блокировать хосты, которые сканируют вашу машину на настраиваемое количество времени (по умолчанию 1 час).
Очень простое решение - просто арендовать 64 or 128 meg
openvz
контейнер и настроить openvpn
так что у вас есть fixed ip address
а затем ограничьте свои iptables
правило --source vpn.ip.address
на хосте, который вы хотите защитить.
Лучшее решение - полностью скрыть ваш ssh
порт сfwknop
. Тогда нет необходимости запускать fail2ban
как твой ssh
порт закрыт, пока вы не отправите gpg
подписанный и зашифрованный пакет из fwknop-client
который откроет ваш брандмауэр на настраиваемое время (по умолчанию 30 секунд). Вы также можете настроить fwknop
принимать только определенные IP-адреса (например, ваш vpn
).
У меня довольно подробные заметки здесь для fwknop
.
Если вы серьезно относитесь к ssh
безопасность, которую вы также должны использовать ed25519
ключи. Дополнительные примечания здесь для использования безопасные шифры с openssh
. Еще один хороший выбор tinyssh
у которого есть нет зависимость от openssl
& является безопасный по умолчанию.
Все упомянутые здесь программы существуют в Alpine Linux который также извлекает выгоду из рандомизация разметки адресного пространства через PaX
в этом Grsecurity ядро.