Защита ssh средствами iptables: различия между версиями

Материал из Ай да Linux Wiki
Перейти к навигации Перейти к поиску
(Новая страница: «== Ограничение количества подключений == Для защиты от brute force (перебора паролей), можно огра...»)
 
 
(не показаны 3 промежуточные версии этого же участника)
Строка 3: Строка 3:
 
Для защиты от brute force (перебора паролей), можно ограничить количество подключений на 22 порт с одного ip адреса до нескольких раз в минуту, после чего блокировать попытки подключения для данного ip.
 
Для защиты от brute force (перебора паролей), можно ограничить количество подключений на 22 порт с одного ip адреса до нескольких раз в минуту, после чего блокировать попытки подключения для данного ip.
  
 +
  <source lang="bash">
 
   ## Создание цепочки правил sshguard
 
   ## Создание цепочки правил sshguard
 
   # Максимум 2 новых запроса в минуту для одного ip
 
   # Максимум 2 новых запроса в минуту для одного ip
Строка 13: Строка 14:
 
   
 
   
 
   ## Применение для трафика ssh цепочку sshguard
 
   ## Применение для трафика ssh цепочку sshguard
   /sbin/iptables -A INPUT -p tcp --dport 22 -j sshguard
+
   /sbin/iptables -A INPUT -p tcp --dport 22 -j sshguard</source>
  
'''recent''': позволяет создавать динамические списки адресов IP. Модуль поддерживает ряд опций
+
*'''recent''': позволяет создавать динамические списки адресов IP. Модуль поддерживает ряд опций
 
* '''--name name''' : имя списка, с которым работает команда. По умолчанию для списка используется имя DEFAULT
 
* '''--name name''' : имя списка, с которым работает команда. По умолчанию для списка используется имя DEFAULT
 
* '''--rcheck''': опция будет проверять наличие адреса отправителя пакета в списке При отсутствии адреса в списке возвращается значение false.
 
* '''--rcheck''': опция будет проверять наличие адреса отправителя пакета в списке При отсутствии адреса в списке возвращается значение false.
Строка 36: Строка 37:
 
telnet'ом например:
 
telnet'ом например:
  
   telnet myserver 1500
+
   <source lang="bash">telnet myserver 1500</source>
  
 
или через браузер:
 
или через браузер:
  
   http://192.168.0.80:1500
+
   <source lang="bash">http://192.168.0.80:1500</source>
  
 
соответственно если стукнуть на 1499 - то порт закроется
 
соответственно если стукнуть на 1499 - то порт закроется
 
+
 
 +
  <source lang="bash">
 
   iptables -N sshguard
 
   iptables -N sshguard
 
   # Если адрес в списке, то подключение разрешено
 
   # Если адрес в списке, то подключение разрешено
Строка 57: Строка 59:
 
   
 
   
 
   # Применение для трафика ssh цепочку sshguard
 
   # Применение для трафика ssh цепочку sshguard
   iptables -A INPUT -p tcp --dport 22 -j sshguard
+
   iptables -A INPUT -p tcp --dport 22 -j sshguard</source>
  
 
Порт открывается только для ip с которого был открыт
 
Порт открывается только для ip с которого был открыт
Строка 65: Строка 67:
 
Еще один пример демонстрирует способ открытия порта ssh для определенного ip на заданное время.
 
Еще один пример демонстрирует способ открытия порта ssh для определенного ip на заданное время.
  
   ## определяем цепочку для SSH трафика
+
   <source lang="bash">## определяем цепочку для SSH трафика
 
   iptables -N sshguard
 
   iptables -N sshguard
 
   iptables -F sshguard
 
   iptables -F sshguard
Строка 78: Строка 80:
 
   iptables -A INPUT -m state --state NEW -p tcp --dport 222 -m recent --name SSH --set
 
   iptables -A INPUT -m state --state NEW -p tcp --dport 222 -m recent --name SSH --set
 
   ## Фильтрация ssh трафика через цепочку sshguard
 
   ## Фильтрация ssh трафика через цепочку sshguard
   iptables -A INPUT -p tcp --dport 22 -j sshguard
+
   iptables -A INPUT -p tcp --dport 22 -j sshguard</source>
  
 
Теперь, чтобы получить ssh доступ нужно сперва постучаться на порт 222, например так:
 
Теперь, чтобы получить ssh доступ нужно сперва постучаться на порт 222, например так:
  
   ssh user@server.name -p 222
+
   <source lang="bash">ssh user@server.name -p 222</source>
  
 
после этого доступ для вашего ip на 22 порт будет разрешен на указанное время, при этом каждый новый коннект на ssh будет продлевать это время. Если вы не хотите продления времени то замените --update --seconds 108000 на --rcheck.
 
после этого доступ для вашего ip на 22 порт будет разрешен на указанное время, при этом каждый новый коннект на ssh будет продлевать это время. Если вы не хотите продления времени то замените --update --seconds 108000 на --rcheck.
Строка 88: Строка 90:
 
Также можно узнать каким ip адресам разрешён доступ к ssh:
 
Также можно узнать каким ip адресам разрешён доступ к ssh:
  
   cat /proc/net/ipt_recent/SSH
+
   <source lang="bash">cat /proc/net/ipt_recent/SSH</source>
 +
 
 +
== Ссылки ==
 +
[http://wiki.enchtex.info/howto/iptables/ssh-guard wiki.enchtex.info]
 +
 
 +
[[Категория:Руководства]]
 +
[[Категория:Iptables]]
 +
[[Категория:Net]]

Текущая версия на 01:10, 18 апреля 2011

Ограничение количества подключений

Для защиты от brute force (перебора паролей), можно ограничить количество подключений на 22 порт с одного ip адреса до нескольких раз в минуту, после чего блокировать попытки подключения для данного ip.

   ## Создание цепочки правил sshguard
   # Максимум 2 новых запроса в минуту для одного ip
   /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
 
   ## Применение для трафика ssh цепочку sshguard
   /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 секунд с момента последний попытки подключения.

Динамическое открытие/закрытие ssh порта

Небольшое правило для iptables помогающее лишний раз не держать порты открытыми.

Пример для доступа к SSH, хотя как сами понимаете можно использовать как угодно.

Суть правила проста - для того чтобы открыть доступ к шеллу нужно сначала стукнуться на 1500 порт: telnet'ом например:

telnet myserver 1500

или через браузер:

http://192.168.0.80:1500

соответственно если стукнуть на 1499 - то порт закроется

   iptables -N sshguard
   # Если адрес в списке, то подключение разрешено
   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
 
   # Заносит адрес в список
   iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 1500 -m recent --name SSH --set -j DROP
   # Удаляет адрес из списка
   iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 1499 -m recent --name SSH --remove -j DROP
 
   # Применение для трафика ssh цепочку sshguard
   iptables -A INPUT -p tcp --dport 22 -j sshguard

Порт открывается только для ip с которого был открыт

Открытие порта ssh на заданное время

Еще один пример демонстрирует способ открытия порта ssh для определенного ip на заданное время.

## определяем цепочку для SSH трафика
   iptables -N sshguard
   iptables -F sshguard
   # Разрешить подключение если ip есть в списке и последнее подключение осуществлялось не позднее 108000 секунд (30 часов) 
   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
   # Заблокировать если нет в списке
   iptables -A sshguard -j DROP
 
   ## Открытие SSH
   iptables -A INPUT -m state --state NEW -p tcp --dport 222 -m recent --name SSH --set
   ## Фильтрация ssh трафика через цепочку sshguard
   iptables -A INPUT -p tcp --dport 22 -j sshguard

Теперь, чтобы получить ssh доступ нужно сперва постучаться на порт 222, например так:

ssh user@server.name -p 222

после этого доступ для вашего ip на 22 порт будет разрешен на указанное время, при этом каждый новый коннект на ssh будет продлевать это время. Если вы не хотите продления времени то замените --update --seconds 108000 на --rcheck.

Также можно узнать каким ip адресам разрешён доступ к ssh:

cat /proc/net/ipt_recent/SSH

Ссылки

wiki.enchtex.info