Защита ssh от брутфорса во FreeBSD

Posted Втр, 02/09/2010 - 16:56 by ttys

Содержание:

Блокировка брутфорс атак на ssh средствами Packet Filter (pf)

Блокировка брутфорс атак на ssh при помощи sshguard

Документация

Блокировка брутфорс атак на ssh средствами Packet Filter (pf)

PF поддерживает как IPv4 так и IPv6

OpenSSH предоставляет защищенную альтернативу протоколам первого поколения, таким как telnet и ftp, где логины и пароли передаются открытым текстом. Но простого использования SSH вместо telnet в наше время уже не достаточно.

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

И нам предстоит защититься от перебора паролей средствами Packet Filter (pf)

Есть и другие способы защиты, такие как sshguard-ipfilter, sshguard-ipfw, sshguard-pf, sshguard.

Редактируем файл конфигурации PF:

vi /etc/pf.conf

table <sshblock> persist #создаём таблицу

set skip on lo0 #пропускаем проверку на петле

set block-policy return #для отброшенных пакетов TCP отсылается пакет TCP RST

#для прочих ICMP Unreachable

#если DOSят то можно указать "drop"

# set block-policy drop #пакет молча отбрасывается

scrub in all #собираем все части пакета перед отправкой

block all #запретим все отовсюду

block in log quick from <sshblock> #блокируем тех кто попал в sshblock

pass in on $int_if proto tcp from $int_if:network to $int_if port ssh

synproxy state (max-src-conn-rate 2/60, overload <sshblock> flush global)

#пропускаем на ssh из внутренней подсети, а злодеев заносим в таблицу

pass in on $ext_if proto tcp from any to $ext_if port ssh

synproxy state (max-src-conn-rate 2/60, overload <sshblock> flush global)

#пропускаем на ssh из вешней подсети, и тоже заносим злодеев в таблицу

pass in on $int_if from any to any #разрешаем всё из локальной сети

pass out on $ext_if from $ext_if to any #разрешаем серверу доступ в интернет

pass in inet proto icmp all icmp-type echoreq #разрешаем ping

Если вы получаете ip адрес по DHCP, то вместо переменной $ext_if вы можете указать имя WAN интерфейса в круглых скобках (rl0), тогда при смене ip адреса pf подменит его на лету.

посмотреть тех кто в таблице можно так:

pfctl -t sshblock -T show

Удалить ip адрес (например 192.168.1.9), из таблицы можно так:

pfctl -t sshblock -T delete 192.168.1.9

осталось настроить cron

crontab -e

30 * * * * root /sbin/pfctl -t sshblock -T expire 86400

Каждые час (в 30 минут) "-T expire 86400" удаляет все записи из таблицы старше 86400 секунд (сутки)

max number

Ограничение максимального количества записей в таблице состояний, которое может сделать данное правило. По достижении этого предела, будет отброшен любой пакет, который должен был бы завести новую запись в таблице состояний. Пакеты будут отбрасываться до тех пор, пока число записей в таблице состояний не уменьшится.

source-track

Эта опция даёт возможность отслеживать количество записей в таблице состояний в пересчёте на каждый адрес источника. Возможные форматы опции:

* source-track rule — Максимальное количество записей в таблице состояний созданных данным правилом ограничивается опциями max-src-nodes и max-src-states, заданными в этом правиле. Счётчики заводятся не глобальные, а локальные.

* source-track global — То же что и в предыдущем слуаче, но счётчики ведутся глобально. При этом каждое правило может иметь свои пределы max-src-nodes и max-src-states, однако счётчики будут общими для всех правил.

Общее количество адресов источников, для которых осуществляется глобальный контроль количества строк в таблице состояний, ограничивается при помощи опции src-nodes.

max-src-nodes number

При использовании опции source-track опция max-src-nodes ограничивает количество IP-адресов с которых можно одновременно открыть соединения.

max-src-states number

При использовании опции source-track опция max-src-states ограничивает количество соединений с одного IP-адреса.

max-src-conn number

Ограничение максимального количества TCP соединений прошедших тройное рукопожатие, которые можно открыть с одного IP-адреса.

max-src-conn-rate number / interval

Ограничение скорости с которой можно открывать новые соединения. Задаётся количество соединений за интервал времени.

Обе опции автоматически включают опцию state-track rule и не совместимы с state-track global.

В комбинации с данными опциями можно употреблять более агрессивные опции, для «наказания» «провинившихся».overload

При превышении лимитов занести адрес источника в таблицу.

flash [global]

Уничтожить все записи в таблице состояний соответствующие соединениям с данного IP-адреса. При указании опции global записи в таблице состояний сбрасываются независимо от того, какое правило её создало.

Блокировка брутфорс атак на ssh при помощи sshguard

Нам предстоит защититься от перебора паролей средствами sshguard который контролирует активность на 22м порту.

Sshguard работает с любыми фаервол системами PF, netfilter/iptables, IPFIREWALL/ipfw, IPFILTER. Он следит за количеством и попытками входа и заносит ip адреса атакующих в таблицу.По умолчанию sshguard добавляет ip адрес в таблицу после 4-х неудачных попыток входа за 20-ти минутный период.

Блокировка происходит по следующей схеме:

первый раз блокируется на 420 секунд и удаляется через 7 минут

второй раз на 2*420 у удаляется через 14 минут

третий раз на 2*2*420 и удаляется через 28 минут и тд...

2^(N-1)*420 N-й раз.

Для использования sshguard-pf необходим Packet Filter (pf)

Устанавливаем sshguard-pf:

cd /usr/ports/security/sshguard-pf && make install clean

Редактируем файл конфигурации PF и добавляем эту строку в раздел таблиц:

vi /etc/pf.conf

table <sshguard> persist

Добавляем эту строку в раздел фильтрации:

block in log quick on $ext_if proto tcp from <sshguard> to any port

ssh label "ssh bruteforce"

Если вам необходимо заблокировать весь трафик атакующего ip (а не только SSH) то необходимо добавить эту строку вместо предыдущей:

block in log quick from <sshguard> label "ssh bruteforce"

Перечитаем правила pf

pfctl -f /etc/pf.conf

Просмотрим набор ip адресов, заблокированных sshguard:

pfctl -t sshguard -T show

Удалить ip адрес (например 192.168.1.9), заблокированный sshguard можно так:

pfctl -t sshguard -T delete 192.168.1.9

http://www.ignix.ru/public/protection_ssh

Обновлено: 12.03.2015