Назад | Перейти на главную страницу

iptables на некоторое время сбрасывает IP-адреса с недавно неудачными соединениями

Я хочу уменьшить вероятность успешной атаки ssh на систему Linux. Единственный открытый порт - 22 (я использую переадресацию портов для всего остального), и, конечно же, я убедился, что ssh принимает только логины на основе пары ключей (без паролей).

Объем неудачных попыток входа в систему ssh (вывод last -f /var/log/btmp) был довольно большим (как и следовало ожидать любому, открывающему порт 22), поэтому в течение последних 2+ лет я полагался на разновидность решений на основе iptables, часто упоминаемых для блокирования атак ssh, например Сотни неудачных попыток входа по ssh.

Один досадный недостаток такой схемы заключается в том, что она ограничивает количество новых подключений с IP-адреса за период времени, независимо от того, были ли предыдущие подключения с этого IP-адреса успешными или нет, и пытались ли они войти в систему как тот же пользователь или не. Представьте себе сценарий, содержащий полдюжины rsync команды, используемые из-за границы для обновления различных областей на этом сервере: обычно он достигает «лимита нового соединения» и терпит неудачу где-то посередине. То же самое происходит, если несколько пользователей за маршрутизатором (отображаются как один и тот же IP-адрес) подключаются к моему серверу более или менее одновременно.

Итак, мне интересно, если, не прибегая к синтаксическому анализу /var/log файлы, можно реализовать следующую стратегию с iptables:

  1. принимать установленные соединения
  2. разрешить новые подключения из ранее успешных подключений
  3. помещать IP-адреса с неудачными соединениями в тюрьму на некоторое время

Бонусные очки:

  1. То же, что и выше, но разрешено / заключено в тюрьму user@ip вместо всех @ip.

И чтобы попытаться пресечь атаки ботнета:

  1. Временно посадить пользователя в тюрьму (независимо от того, с каких IP-адресов он подключается) после неудачной попытки ssh.

Без анализа файлов журналов вы не можете узнать, была ли попытка входа в систему 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 ядро.