Вопрос или проблема
На FreeBSD я пытаюсь заблокировать попытки брутфорса через ssh с помощью pf на порту 22, используя это правило:
table <bruteforce> persist
pass log inet proto tcp from any to any port 22 flags S/SA keep state \
(max-src-conn 3, max-src-conn-rate 3/60, \
overload <bruteforce> flush global)
block in quick from <bruteforce>
Я уже загрузил конфигурацию с помощью doas pfctl -f /etc/pf.conf
и включил pf с помощью doas pfctl -e
.
Я пытаюсь выполнить брутфорс SSH с другого ПК, чем сервер, на котором я настраиваю брандмауэр (используя SSH).
Однако, когда я запускаю команду doas pfctl -t bruteforce -T show
на сервере, я не получаю никаких результатов.
Брутфорс выполняется с помощью этой команды:
hydra -l test -P word.txt 192.168.178.82 ssh
Используя команду doas tcpdump -i em0 port 22
, я вижу запросы.
Файл /etc/pf.conf
настроен следующим образом:
set block-policy return
scrub in all fragment reassemble no-df max-mss 1440
nat on em0 from 10.0.0.0/24 to any -> (em0)
set skip on lo0
block in all
block out all
block in quick inet6 all
block out quick inet6 all
pass in quick proto tcp from 192.168.178.0/24 to any port 22 keep state
pass in quick proto tcp to any port 443 keep state
pass out quick proto tcp to any port 443 keep state
pass in quick proto tcp from 127.0.0.1 to 127.0.0.1 port 8080 keep state
pass out quick proto udp from any to any port 53
pass in quick proto udp from any to any port 53
pass out quick on epair1a
pass in quick on epair1a from em0 to any
pass in quick on em0 from 10.0.0.0/24 to any
pass in quick on lo0
pass out quick on lo0
table <bruteforce> persist
pass log inet proto tcp from any to any port 22 flags S/SA keep state \
(max-src-conn 3, max-src-conn-rate 3/60, \
overload <bruteforce> flush global)
block in quick from <bruteforce>
и файл /etc/rc.conf:
#Система
clear_tmp_enable="YES"
syslogd_flags="-ss"
hostname="test"
keymap="it.kbd"
sshd_enable="YES"
moused_nondefault_enable="NO"
# Установите dumpdev на "AUTO", чтобы включить дампы при крахе, "NO" для отключения
dumpdev="NO"
zfs_enable="YES"
auditd_enable="YES"
#Сеть
ipv6_enable="NO"
ipv6_network_interfaces="none"
ipv6_activate_all_interfaces="NO"
ipv6_gateway_enable="NO"
ifconfig_em0="DHCP"
#Уровень 2 ISO/OSI: ipfw
firewall_enable="YES"
#Уровень 3 ISO/OSI: pf
firewall_enable="YES"
firewall_type="client"
firewall_script="/etc/ipfw.rules"
firewall_logging="YES"
firewall_logif="YES"
# Тюрьмы
cbsd_workdir="/home/user/jails"
cbsdd_enable="YES"
Файл /etc/sysctl.conf:
security.bsd.see_other_uids=0
security.bsd.see_other_gids=0
security.bsd.see_jail_proc=0
security.bsd.unprivileged_read_msgbuf=0
security.bsd.unprivileged_proc_debug=0
kern.randompid=1
vfs.zfs.min_auto_ashift=12
#Сеть
net.inet6.ip6.enable=0
net.inet6.ip6.forwarding="0"
net.inet.ip.fw.verbose_limit=5
#Укрепление
kern.securelevel="1"
hw.kbd.keymap_restrict_change="4" # запрещение изменений раскладки клавиатуры для непривилегированных пользователей
kern.ipc.shm_use_phys="1" # блокировка общей памяти в ОЗУ и предотвращение ее выгрузки в файл подкачки (по умолчанию 0, отключено)
kern.msgbuf_show_timestamp="1" # отображение временной метки в msgbuf (по умолчанию 0)
kern.randompid="1" # создание PID по модулю заданного целого числа, выбор случайного целого числа (по умолчанию 0)
net.inet.icmp.drop_redirect="1" # без перенаправленных ICMP пакетов (по умолчанию 0)
net.inet.ip.check_interface="1" # проверка, что пакет приходит на правильный интерфейс (по умолчанию 0)
net.inet.ip.portrange.first="1024" # использование портов от 1024 до portrange.last для исходящих соединений (по умолчанию 10000)
net.inet.ip.portrange.randomcps="999" # использование случайного выделения портов, если выделяется менее такого количества портов в секунду (по умолчанию 10)
net.inet.ip.random_id="1" # назначение случайного IP id для каждого пакета, выходящего из системы (по умолчанию 0)
net.inet.ip.redirect="0" # не отправлять IP-перенаправления (по умолчанию 1)
net.inet.tcp.always_keepalive="0" # отключение обнаружения tcp keep alive для мертвых пиров, keepalive может быть подделан (по умолчанию 1)
net.inet.tcp.blackhole="2" # сбросить tcp пакеты, направленные на закрытые порты (по умолчанию 0)
net.inet.tcp.drop_synfin="1" # SYN/FIN пакеты сбрасываются при начальном соединении (по умолчанию 0)
net.inet.tcp.ecn.enable="0" # Явное уведомление о заторах отключено, если не используется правильное управление очередями
net.inet.tcp.fast_finwait2_recycle="1" # быстро переработать состояния FIN/WAIT, помогает против DoS, но может вызвать ложные RST
net.inet.tcp.finwait2_timeout="5000" # TCP FIN_WAIT_2 таймаут ожидания пакета FIN от клиента перед закрытием состояния (по умолчанию 60000, 60 сек)
net.inet.tcp.icmp_may_rst="0" # icmp может не отправить RST, чтобы избежать подделанных icmp/udp атак (по умолчанию 1)
net.inet.tcp.keepinit="5000" # установить соединение за пять (5) секунд или прервать попытку (по умолчанию 75000, 75 сек)
net.inet.tcp.msl="2500" # Максимальное время жизни сегмента, время, которое соединение проводит в состоянии TIME_WAIT (по умолчанию 30000, 2*MSL = 60 сек)
net.inet.tcp.nolocaltimewait="1" # удалить состояния TIME_WAIT для интерфейса обратной связи (по умолчанию 0)
net.inet.tcp.path_mtu_discovery="0" # отключить MTU обнаружение, поскольку многие хосты сбрасывают ICMP тип 3 пакетов (по умолчанию 1)
net.inet.tcp.rexmit_slop="70" # уменьшить таймер повторной передачи TCP, мин +slop=100ms (по умолчанию 200ms)
net.inet.udp.blackhole="1" # сбросить udp пакеты, направленные на закрытые сокеты (по умолчанию 0)
security.bsd.hardlink_check_gid="1" # непривилегированные процессы не могут создавать жесткие ссылки на файлы, принадлежащие другим группам (по умолчанию 0)
security.bsd.hardlink_check_uid="1" # непривилегированные процессы не могут создавать жесткие ссылки на файлы, принадлежащие другим пользователям (по умолчанию 0)
security.bsd.see_other_gids="0" # группы видят только свои собственные процессы. root может видеть все (по умолчанию 1)
security.bsd.see_other_uids="0" # пользователи видят только свои собственные процессы. root может видеть все (по умолчанию 1)
security.bsd.stack_guard_page="1" # защита от переполнения стека (SSP), ProPolice, защита от переполнения буфера
security.bsd.unprivileged_proc_debug="0" # непривилегированные процессы не могут использовать отладку процессов (по умолчанию 1)
security.bsd.unprivileged_read_msgbuf="0" # непривилегированные процессы не могут читать буфер сообщений ядра (по умолчанию 1)
Не могли бы вы помочь мне понять, почему я не могу заблокировать запросы через брутфорс и поэтому не вижу их заблокированными с помощью doas pfctl -t bruteforce -T show
?
Заранее благодарю.
Ответ или решение
Чтобы понять, почему вы не видите заблокированные SSH-подключения с помощью pf на FreeBSD, необходимо внимательно рассмотреть вашу конфигурацию и процесс, который вы используете для реализации защиты от брутфорс-атак.
1. Проверка конфигурации pf
Ваши правила pf выглядят следующим образом:
table <bruteforce> persist
pass log inet proto tcp from any to any port 22 flags S/SA keep state \
(max-src-conn 3, max-src-conn-rate 3/60, \
overload <bruteforce> flush global)
block in quick from <bruteforce>
Основное правило pass log
с использованием параметров max-src-conn
и max-src-conn-rate
должно работать, чтобы определять и помещать IP-адреса в таблицу <bruteforce>
. Если вы не видите IP-адреса в таблице, это может быть связано с тем, что правило не срабатывает или не выполняется должным образом.
2. Логи и отладка
Убедитесь, что вы включили логирование. Поскольку вы используете ключ log
в правилах, следите за логами, чтобы понять, действительно ли пакеты проходят через pf. Пожалуйста, используйте команду:
doas tcpdump -n -e -i pflog0
Это покажет корректные логи запретов и разрешений от pf.
3. Соответствие правил
Каждое правило pf обрабатывается в порядке их определения. Правило block in quick from <bruteforce>
может срабатывать раньше, чем пакет попадает в таблицу. Убедитесь, что порядок правил не мешает их выполнению. Возможно, вам нужно будет изменить порядок правил, чтобы в первую очередь проверять на наличие в таблице, а затем блокировать. Убедитесь, что перед блокировкой есть возможность получения информации о запросах.
4. Значение параметров
Проверьте заданные параметры в конфигурации, особенно в правилах. max-src-conn
и max-src-conn-rate
могут не позволять IP-адресу быть добавленным в таблицу, если атака проходит слишком быстро. Проверьте, не превышаете ли вы эти лимиты.
5. Неправильные сетевые интерфейсы
Подтвердите, что все ваши правила относятся к правильному сетевому интерфейсу. Убедитесь, что em0
— это именно тот интерфейс, через который проходит ваш трафик. Для проверки, можете использовать:
ifconfig
Убедитесь, что SSH-устройства находятся в одной подсети с целевым сервером или что пакеты не блокируются другими правилами NAT.
6. Временные ограничения и перезагрузка pf
Если вы внесли изменения в конфигурацию, убедитесь, что вы перезапустили pf для применения изменений. Используйте команды:
doas pfctl -f /etc/pf.conf
doas pfctl -e
Заключение
Если все вышеперечисленное не решит вашу проблему, попробуйте протестировать другую атаку, изменяя единственные параметры атаки и определяя по очереди, где именно может произойти сбой.
Проверьте логи системных сообщений и логи pf, чтобы собрать больше информации о работоспособности системы безопасности. Если проблема сохраняется, может потребоваться более глубокий анализ конфигурации или использование альтернативных инструментов (например, Fail2Ban), чтобы дополнительно укрепить вашу систему защиты.
Обязательно протестируйте конфигурацию в безопасной среде, чтобы избежать нежелательных последствий для важной инфраструктуры.