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)
#===так лучше
pass in on $int_if proto tcp from $int_if:network to $int_if port ssh \
keep 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 записи в таблице состояний сбрасываются независимо от того, какое правило её создало.