Защита SSH средствами iptables
Примеры использования iptables для защиты SSH-доступа.
iptables — утилита командной строки, стандартный интерфейс управления межсетевым экраном (брандмауэром) Netfilter для ядра Linux. С её помощью можно создавать и изменять правила фильтрации и перенаправления пакетов. Для работы с iptables требуются права суперпользователя (root).
Ключевые понятия
Правило — состоит из критерия, действия и счётчика. Если пакет соответствует критерию, к нему применяется действие и он учитывается счётчиком. Правила срабатывают в порядке следования — порядок важен.
- Критерий — логическое выражение, анализирующее свойства пакета и определяющее, подпадает ли он под текущее правило. Несколько критериев объединяются логическим «И».
- Действие — описание того, что нужно сделать с пакетом, если он соответствует критерию.
- Счётчик — учитывает количество пакетов, попавших под критерий, и их суммарный объём в байтах.
Цепочка — упорядоченная последовательность правил. Бывают базовые и пользовательские:
- Базовая цепочка — создаётся по умолчанию при инициализации таблицы. Имеет «действие по умолчанию», которое применяется к пакетам, не обработанным ни одним другим правилом. Имена базовых цепочек всегда в верхнем регистре:
PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING. - Пользовательская цепочка — создаётся пользователем, работает только в пределах своей таблицы. Рекомендуется не использовать верхний регистр, чтобы не путать с базовыми цепочками.
Таблица — совокупность цепочек, объединённых общим назначением. Имена таблиц пишутся в нижнем регистре. При вызове команды таблица указывается через флаг -t имя_таблицы. Если таблица не указана явно, используется filter.
1. Ограничение количества подключений (защита от brute force)
Чтобы защититься от перебора паролей, можно ограничить количество новых подключений к 22-му порту с одного IP-адреса — например, не более 2 попыток в минуту, после чего блокировать дальнейшие попытки.
## Создание цепочки sshguard
/sbin/iptables -N sshguard
# Включить логирование (по желанию):
#/sbin/iptables -A sshguard -m state --state NEW -m recent --name SSH --rcheck --seconds 60 --hitcount 2 -j LOG --log-prefix "SSH-shield: "
# Блокировать, если превышен лимит подключений
/sbin/iptables -A sshguard -m state --state NEW -m recent --name SSH --update --seconds 60 --hitcount 2 -j DROP
# Разрешить и занести в список
/sbin/iptables -A sshguard -m state --state NEW -m recent --name SSH --set -j ACCEPT
/sbin/iptables -A sshguard -j ACCEPT
## Применить цепочку sshguard к SSH-трафику
/sbin/iptables -A INPUT -p tcp --dport 22 -j sshguard
В этих правилах используется модуль ядра recent, который позволяет создавать динамические списки IP-адресов. Основные опции модуля:
--name name— имя списка. По умолчанию используетсяDEFAULT--rcheck— проверяет наличие адреса отправителя в списке; если адрес не найден, возвращаетfalse--update— проверяет наличие адреса в списке и обновляет запись, если адрес найден; если нет — возвращаетfalse--hitcount hits— возвращаетtrue, если число пакетов с данного адреса больше или равно заданному значению; используется вместе с--rcheckили--update--seconds seconds— задаёт период, в течение которого адрес остаётся в списке с момента добавления--set— добавляет адрес отправителя в список; если адрес уже есть, обновляет запись--remove— удаляет адрес из списка; если адрес не найден, возвращаетfalse
Примечание
Использование --update вместо --rcheck приводит к тому, что каждая новая попытка подключения обнуляет таймер. Если не выдержать интервал и снова попытаться подключиться, отсчёт 60 секунд начнётся заново.
2. Динамическое открытие и закрытие SSH-порта
Этот подход позволяет не держать SSH-порт открытым постоянно. Порт открывается только для конкретного IP-адреса — после того как с него поступил специальный «стук».
Чтобы открыть доступ к SSH, нужно предварительно обратиться на порт 1500 — например, через telnet:
telnet myserver 1500
или через браузер:
http://192.168.0.100:1500
Обращение на порт 1499 закрывает доступ.
iptables -N sshguard
# Разрешить подключение, если IP есть в списке
iptables -A sshguard -m state --state NEW -m recent --rcheck --name SSH -j ACCEPT
# Разрешить пакеты для уже установленных соединений
iptables -A sshguard -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A sshguard -j DROP
# Открыть доступ: занести IP в список
#iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 1500 -j LOG --log-prefix "SSH-open: "
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 1500 -m recent --name SSH --set -j DROP
# Закрыть доступ: удалить IP из списка
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 1499 -m recent --name SSH --remove -j DROP
# Применить цепочку sshguard к SSH-трафику
iptables -A INPUT -p tcp --dport 22 -j sshguard
Порт открывается только для того IP-адреса, с которого был выполнен «стук».
3. Открытие SSH-порта на заданное время
Этот пример позволяет открыть SSH-доступ для конкретного IP на ограниченный период времени.
## Создание и очистка цепочки sshguard
iptables -N sshguard
iptables -F sshguard
# Разрешить подключение, если IP в списке и последнее обращение — не позднее 30 часов назад (108000 секунд)
iptables -A sshguard -m state --state NEW -m recent --update --seconds 108000 --name SSH -j ACCEPT
# Разрешить пакеты для уже установленных соединений
iptables -A sshguard -m state --state ESTABLISHED,RELATED -j ACCEPT
# Блокировать, если IP не в списке
iptables -A sshguard -j DROP
## Открытие доступа: занести IP в список при обращении на порт 222
iptables -A INPUT -m state --state NEW -p tcp --dport 222 -m recent --name SSH --set
## Применить цепочку sshguard к SSH-трафику
iptables -A INPUT -p tcp --dport 22 -j sshguard
Чтобы получить доступ по SSH, нужно сначала «постучаться» на порт 222:
ssh user@server.name -p 222
После этого доступ к 22-му порту для вашего IP будет открыт на указанное время. Каждое новое подключение к SSH продлевает этот срок. Если продление не нужно, замените --update --seconds 108000 на --rcheck.
Порт открывается только для того IP-адреса, с которого было выполнено подключение.
Посмотреть, каким IP-адресам в данный момент разрешён доступ к SSH:
cat /proc/net/ipt_recent/SSH
Помощь
Если у вас возникли вопросы или требуется помощь, пожалуйста, свяжитесь с нами через систему тикетов — мы обязательно вам поможем!