Борьба с брутфорсом SSH

Материал из RSU WiKi
(Различия между версиями)
Перейти к: навигация, поиск
Строка 87: Строка 87:
 
Дальнейшую работу по администриованию системы ведем из под него при помощи "sudo" или "su -"
 
Дальнейшую работу по администриованию системы ведем из под него при помощи "sudo" или "su -"
  
=== Авторизация строго по сертификатам ===
+
=== Как настроить защиту об брутфорса по ssh через iptables? ===
{{todo-here|где как зачем}}
+
Статья [http://www.opennet.ru/tips/info/2386.shtml Защита от bruteforce средствами iptables]
 +
В заметке приведены различные варианты защиты от bruteforce-атак,  на примере
 +
блокирования последовательного подбора паролей через ssh.
 +
 
 +
Общий шаблон правил
 +
 
 +
  iptables -P INPUT DROP
 +
  iptables -P OUTPUT DROP
 +
  iptables -P FORWARD DROP
 +
 
 +
  iptables -A INPUT -p all -i lo -j ACCEPT
 +
  iptables -A OUTPUT -p all -o lo -j ACCEPT
 +
 
 +
Здесь будут наши правила (вариант)
 +
 
 +
  iptables -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
 +
  iptables -A OUTPUT -p all -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
 +
 
 +
 
 +
Вариант 1, используя модуль recent:
 +
 
 +
Добавляем ip в таблицу
 +
  iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name BLOCK -set
 +
 
 +
С одного ip разрешаем 2 (--hitcount 3-1) запроса на соединение (NEW) в минуту (60 секунд),
 +
третье блокируется и все последующие в течение минуты
 +
  iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name BLOCK --update --seconds 60 --rttl --hitcount 3 -j DROP
 +
 
 +
Разрешаем входящие соединения на 22 порт
 +
  iptables -A INPUT -p tcp --syn --dport 22 -j ACCEPT
 +
 
 +
 
 +
Вариант 2, используя модуль hashlimit:
 +
 
 +
С одного ip разрешаем 2 запроса на соединение (NEW) в минуту (2/m) все
 +
остальные пакеты (NEW) c этого ip блокируется
 +
 
 +
  iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m hashlimit \
 +
      --hashlimit-name BLOCK --hashlimit-mode srcip --hashlimit-above 2/m --hashlimit-burst 2 -j DROP
 +
 
 +
Разрешаем входящие соединения на 22 порт
 +
  iptables -A INPUT -p tcp --syn --dport 22 -j ACCEPT
 +
 
 +
 
 +
Вариант 3, используя модули connlimit, limit:
 +
 
 +
С одного ip разрешаем не больше одно соединения (! --connlimit-above 1) на 22
 +
порт, пропускаем 2 пакета в минуту с запросом на соединение (NEW), все
 +
остальные пакеты (NEW) c этого ip блокируется
 +
  iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m connlimit ! \
 +
      --connlimit-above 1 -m limit --limit 2/m --limit-burst 2 -j ACCEPT
 +
 
 +
Вариант 4, параноидальный:
 +
 
 +
Два раза в течение минуты разрешено подключаться к 22 порту, при превышении
 +
порога ip блокируется на 10 минут.
 +
 
 +
блокируем ip с запросом на соединение (NEW) попавшие в динамически обновляемую
 +
таблицу на 600 секунд
 +
  iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name BLOCK --rcheck --seconds 600 -j DROP
 +
 
 +
С одного ip разрешаем 2 запроса на соединение (NEW) в минуту (2/m), если
 +
превышен порог,то добавляем ip в таблицу BLOCK для блокировки на 600 секунд (10 минут)
 +
  iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m hashlimit \
 +
      --hashlimit-name BLOCK --hashlimit-mode srcip --hashlimit-above 2/m --hashlimit-burst 2 -m recent --name BLOCK --set -j DROP
 +
 
 +
Разрешаем входящие соединения на 22 порт
 +
  iptables -A INPUT -p tcp --syn --dport 22 -j ACCEPT
 +
 
 +
 
 +
 
  
 
Под [[SuSE Linux|Linux]] или [[Apple Macintosh|OS X]] сгенерировать ключи для входа по ssh можно при помощи простого скрипта [[Ssh key pairs auth|ssh-keyput]].
 
Под [[SuSE Linux|Linux]] или [[Apple Macintosh|OS X]] сгенерировать ключи для входа по ssh можно при помощи простого скрипта [[Ssh key pairs auth|ssh-keyput]].

Версия 10:36, 19 сентября 2016

Содержание

Vyatta

Защита SSH самой Vyatta:

set firewall name self_in rule 115 action 'drop'
set firewall name self_in rule 115 description 'Limit SSH against BruteForce'
set firewall name self_in rule 115 destination port '22'
set firewall name self_in rule 115 protocol 'tcp'
set firewall name self_in rule 115 recent count '4'
set firewall name self_in rule 115 recent time '60'
set firewall name self_in rule 115 state new 'enable'
set firewall name self_in rule 120 action 'accept'
set firewall name self_in rule 120 description 'permit ssh'
set firewall name self_in rule 120 destination port '22'
set firewall name self_in rule 120 protocol 'tcp'

Защита от перебора паролей для машин внутри DMZ:

set firewall name outside_in rule 115 action 'drop'
set firewall name outside_in rule 115 description 'Limit SSH against BruteForce'
set firewall name outside_in rule 115 destination address '198.51.100.0/24'
set firewall name outside_in rule 115 destination port 'ssh'
set firewall name outside_in rule 115 protocol 'tcp'
set firewall name outside_in rule 115 recent count 4
set firewall name outside_in rule 115 recent time 60
set firewall name outside_in rule 115 state new enable

set firewall name outside_in rule 120 action 'accept'
set firewall name outside_in rule 120 description 'permit ssh for all RealIP'
set firewall name outside_in rule 120 destination address '198.51.100.0/24'
set firewall name outside_in rule 120 destination port 'ssh'
set firewall name outside_in rule 120 protocol 'tcp'

Основная статья: Vyatta

SuSE Linux

SuSEfirewall2

Отредактируйте /etc/sysconfig/SuSEfirewall2:

Здесь не надо открывать порт для ssh

Attention.pngВНИМАНИЕ!
Обязательно проверьте, что в этих строках SSH не открыт! Иначе все выкрутасы с FW_SERVICES_ACCEPT_EXT просто-напросто не работают!
FW_SERVICES_EXT_TCP=""
FW_CONFIGURATIONS_EXT=""

Добавьте это правило:

FW_SERVICES_ACCEPT_EXT="0.0.0.0/0,tcp,22,,hitcount=3,blockseconds=60,recentname=ssh"

Перезапустите файерволл:

rcSuSEfirewall2 restart

Теперь у атакующего будет только три попытки до того момента, как он будет заблокирован на 60 секунд.

Основная статья: SuSE Linux

fail2ban

Устанавливаем и настраиваем пакет fail2ban. Для SLES 11 SP1 воспользуемся репозиторием с software.opensuse.org:

zypper ar http://download.opensuse.org/repositories/security/SLE_11 OpenSUSE_Security4SLE11
zypper in fail2ban

В конф. файле /etc/fail2ban/jail.conf настраиваем интересующие сервисы, напр. SSH:

[ssh-tcpwrapper]
enabled     = true
filter      = sshd
action      = hostsdeny
              sendmail-whois[name=SSH, dest=postmaster@example.com]
ignoreregex = for myuser from
logpath     = /var/log/messages

Включаем сервис:

chkconfig fail2ban on

Проверить как работает можно почитав лог /var/log/fail2ban.log

В случае, если на сервере установлен Communigate Pro может потребоваться команда:

ln -s /opt/CommuniGate/sendmail /usr/sbin/sendmail

Отключение удаленного входа для ROOT

В конфигурационном файле /etc/ssh/sshd_config меняем строку

PermitRootLogin yes

на

PermitRootLogin no

Перезапускаем sshd:

service sshd restart

Создаем обычного пользователя:

useradd exampleuser

Дальнейшую работу по администриованию системы ведем из под него при помощи "sudo" или "su -"

Как настроить защиту об брутфорса по ssh через iptables?

Статья Защита от bruteforce средствами iptables В заметке приведены различные варианты защиты от bruteforce-атак, на примере блокирования последовательного подбора паролей через ssh.

Общий шаблон правил

  iptables -P INPUT DROP
  iptables -P OUTPUT DROP
  iptables -P FORWARD DROP
  iptables -A INPUT -p all -i lo -j ACCEPT
  iptables -A OUTPUT -p all -o lo -j ACCEPT

Здесь будут наши правила (вариант)

  iptables -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
  iptables -A OUTPUT -p all -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT


Вариант 1, используя модуль recent:

Добавляем ip в таблицу

  iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name BLOCK -set

С одного ip разрешаем 2 (--hitcount 3-1) запроса на соединение (NEW) в минуту (60 секунд), третье блокируется и все последующие в течение минуты

  iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name BLOCK --update --seconds 60 --rttl --hitcount 3 -j DROP

Разрешаем входящие соединения на 22 порт

  iptables -A INPUT -p tcp --syn --dport 22 -j ACCEPT


Вариант 2, используя модуль hashlimit:

С одного ip разрешаем 2 запроса на соединение (NEW) в минуту (2/m) все остальные пакеты (NEW) c этого ip блокируется

  iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m hashlimit \
     --hashlimit-name BLOCK --hashlimit-mode srcip --hashlimit-above 2/m --hashlimit-burst 2 -j DROP

Разрешаем входящие соединения на 22 порт

  iptables -A INPUT -p tcp --syn --dport 22 -j ACCEPT


Вариант 3, используя модули connlimit, limit:

С одного ip разрешаем не больше одно соединения (! --connlimit-above 1) на 22 порт, пропускаем 2 пакета в минуту с запросом на соединение (NEW), все остальные пакеты (NEW) c этого ip блокируется

  iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m connlimit ! \
     --connlimit-above 1 -m limit --limit 2/m --limit-burst 2 -j ACCEPT

Вариант 4, параноидальный:

Два раза в течение минуты разрешено подключаться к 22 порту, при превышении порога ip блокируется на 10 минут.

блокируем ip с запросом на соединение (NEW) попавшие в динамически обновляемую таблицу на 600 секунд

  iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name BLOCK --rcheck --seconds 600 -j DROP

С одного ip разрешаем 2 запроса на соединение (NEW) в минуту (2/m), если превышен порог,то добавляем ip в таблицу BLOCK для блокировки на 600 секунд (10 минут)

  iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m hashlimit \
     --hashlimit-name BLOCK --hashlimit-mode srcip --hashlimit-above 2/m --hashlimit-burst 2 -m recent --name BLOCK --set -j DROP

Разрешаем входящие соединения на 22 порт

  iptables -A INPUT -p tcp --syn --dport 22 -j ACCEPT



Под Linux или OS X сгенерировать ключи для входа по ssh можно при помощи простого скрипта ssh-keyput.

Примечания

См. также

Ссылки

Личные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты