Повышение безопасности для FreeBSD с использованием IPFW и SSHGuard

VPS-серверы часто становятся объектами нападок. Распространенный тип атаки обнаруживается в системных журналах как сотни несанкционированных попыток входа по ssh. Настройка брандмауэра очень полезна, но сама по себе может неадекватно контролировать попытки взлома.

В этом руководстве показано, как создать расширенный барьер проникновения для FreeBSD с помощью двух программ: ipfwбрандмауэра и sshguard. SSHGuard - это небольшая дополнительная программа, которая отслеживает системные журналы на предмет «оскорбительных» записей. Когда нарушители пытаются получить доступ, sshguardдает указание ipfwзаблокировать трафик, исходящий с IP-адреса нарушителя. Правонарушителя тогда фактически закрывают.

Как только вы поймете, как работают эти программы, управлять защитой сервера довольно просто. Хотя это руководство посвящено настройке FreeBSD, его части относятся к другим программным обеспечением ОС и брандмауэров.

Шаг 1. Настройка IPFW

FreeBSD предоставляет 3 брандмауэра в GENERICядре по умолчанию ( ) ipfw, pfи ipfilter. У каждого есть свои преимущества и преимущества, но ipfwэто программное обеспечение брандмауэра FBSD, и его довольно просто использовать в наших целях. Стоит отметить, что ipfwмногие вещи, как показывает его страница руководства, однако такие возможности, как NAT, формирование трафика и т. Д., Не требуются для типичной ситуации VPS. К счастью, основные функции брандмауэра легко отвечают нашим требованиям.

Чтобы запустить брандмауэр во время загрузки, добавьте следующее /etc/rc.conf:

firewall_enable="YES"
firewall_script="/usr/local/etc/IPFW.rules"
firewall_logging="YES"

Команда serviceдоступна для запуска / остановки брандмауэра вручную:

[user@vultr ~]$ sudo service ipfw start

Естественно, ipfwничего не будет делать, пока он не добавит правила, часто из файла, в этом примере, расположенном по адресу /usr/local/etc/IPFW.rules. Файл правил может фактически находиться где угодно или иметь любое имя, если он соответствует параметру "firewall_script". Файл правил подробно описан ниже.

Шаг 2. Установите и настройте SSHGuard

sshguardпоставляется в нескольких вариантах для использования с различными брандмауэрами. Используйте pkgутилиту для загрузки и установки sshguard-ipfw:

[user@vultr ~]$ sudo pkg install sshguard-ipfw

В большинстве случаев это все, что нужно сделать. Соответствующая переменная автоматически вставляется /etc/rc.confдля запуска при загрузке:

sshguard_enable="YES"

Стандартные настройки обычно работают хорошо. Если необходимы разные значения, на sshguardстранице руководства вы найдете подробную информацию о параметрах:

# sshguard--program defaults, so don't need to be in rc.conf unless assigning different value
# sshguard_pidfile="/var/run/sshguard.pid"
# sshguard_watch_logs="/var/log/auth.log:/var/log/mail"
# sshguard_blacklist="40:/var/db/sshguard/blacklist.db"
# sshguard_safety_thresh="40"
# sshguard_pardon_min_interval="420"
# sshguard_prescribe_interval="1200"

Вы можете начать sshguardс обычного serviceвызова:

[user@vultr ~]$ sudo service sshguard start

Шаг 3. Создайте скрипт правил

Самое сложное - это создание набора правил брандмауэра. ipfwМожно использовать предоставленный /etc/rc.firewallсценарий, но его необходимо изменить, чтобы он соответствовал SSHGuard, а также различным рабочим сценариям. Ряд веб-страниц и руководство по FreeBSD содержат полезную информацию об этом. Тем не менее, написание файла правил не так сложно, кроме того, пользовательский набор правил может быть легче понять и изменить при необходимости.

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

[user@vultr /usr/local/etc]$ sudo ./IPFW.rules

Как правило, файл правил определяет переменную для ipfwкоманды, затем очищает текущие правила, выпускает общие правила, затем переходит к заданию правил «out», а затем правил «in». Страница справочника ipfw и другие ресурсы содержат обширную информацию о структуре правил и опциях, которые, по меньшей мере, многочисленны.

Поскольку версия FreeBSD sshguard была обновлена ​​до версии 1.6.2, изменился способ вставки правил блокировки для нарушителей. Теперь адреса нарушителей хранятся в таблице ipfw (точнее, в таблице 22), а не вставляются в правила выше 55000, как раньше.

К счастью, настроить файл правил для использования таблицы довольно просто. Это просто вопрос размещения правила таблицы в правильном месте и использования правильного синтаксиса при написании правила.

Когда sshguardнаходит нарушителя, он помещает адрес нарушителя в свой черный список, а также вставляет адрес в ipfwтаблицу, чтобы он «инициировал» отказ в доступе. Это правило будет достигать следующих целей:

01000 deny ip from table\(22\) to any

В этом случае все еще необходимо установить правила, разрешающие входящие услуги выше 01000. Например, предположим, что адрес 10.20.30.40является нарушителем в таблице 22, и у нас есть это правило ipfw:

56420 allow tcp from any to me dst-port 22 in via $vif

Поскольку ipfwвстреча править 01000 перед тем правилом 56420 , 10.20.30.40будет заблокировано . Это никогда не будет замечено правилом «позволять 22 в» вообще. Если бы у правила разрешения был «обычный» номер, такой как 00420 , плохой трафик был бы пропущен и никогда не блокировался (потому что 00420 меньше 01000 и «выигрывает первое совпадение»).

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

На этом этапе, вероятно, целесообразно показать полный ipfwнабор правил, измененный для sshguard. Комментарии должны облегчить следование логике правила:

#!/bin/sh

# ipfw config/rules
# from FBSD Handbook, rc.firewall, et. al.

# Flush all rules before we begin.
ipfw -q -f flush

# Set rules command prefix
cmd="ipfw -q add "

vif="vtnet0"

# allow all for localhost
$cmd 00010 allow ip from any to any via lo0

# checks stateful rules.  If marked as "keep-state" the packet has
# already passed through filters and is "OK" without futher
# rule matching
$cmd 00101 check-state

# allow DNS out
$cmd 00110 allow tcp from me to any dst-port 53 out via $vif setup keep-state
$cmd 00111 allow udp from me to any dst-port 53 out via $vif keep-state

# allow dhclient connection out (port numbers are important)
$cmd 00120 allow udp from me 68 to any dst-port 67 out via $vif keep-state

# allow HTTP HTTPS replies
$cmd 00200 allow tcp from any to any dst-port 80 out via $vif setup keep-state
$cmd 00220 allow tcp from any to any dst-port 443 out via $vif setup keep-state

# allow outbound mail
$cmd 00230 allow tcp from any to any dst-port 25 out via $vif setup keep-state
$cmd 00231 allow tcp from any to any dst-port 465 out via $vif setup keep-state
$cmd 00232 allow tcp from any to any dst-port 587 out via $vif setup keep-state

# allow icmp re: ping, et. al. 
# comment this out to disable ping, et.al.
$cmd 00250 allow icmp from any to any out via $vif keep-state

# alllow timeserver out
$cmd 00260 allow tcp from any to any dst-port 37 out via $vif setup keep-state

# allow ntp out
$cmd 00270 allow udp from any to any dst-port 123 out via $vif keep-state

# allow outbound SSH traffic
$cmd 00280 allow tcp from any to any dst-port 22 out via $vif setup keep-state

# otherwise deny outbound packets
# outbound catchall.  
$cmd 00299 deny log ip from any to any out via $vif

# inbound rules
# deny inbound traffic to restricted addresses
$cmd 00300 deny ip from 192.168.0.0/16 to any in via $vif
$cmd 00301 deny ip from 172.16.0.0/12 to any in via $vif
$cmd 00302 deny ip from 10.0.0.0/8 to any in via $vif
$cmd 00303 deny ip from 127.0.0.0/8 to any in via $vif
$cmd 00304 deny ip from 0.0.0.0/8 to any in via $vif
$cmd 00305 deny ip from 169.254.0.0/16 to any in via $vif
$cmd 00306 deny ip from 192.0.2.0/24 to any in via $vif
$cmd 00307 deny ip from 204.152.64.0/23 to any in via $vif
$cmd 00308 deny ip from 224.0.0.0/3 to any in via $vif

# deny inbound packets on these ports
# auth 113, netbios (services) 137/138/139, hosts-nameserver 81 
$cmd 00315 deny tcp from any to any dst-port 113 in via $vif
$cmd 00320 deny tcp from any to any dst-port 137 in via $vif
$cmd 00321 deny tcp from any to any dst-port 138 in via $vif
$cmd 00322 deny tcp from any to any dst-port 139 in via $vif
$cmd 00323 deny tcp from any to any dst-port 81 in via $vif

# deny partial packets
$cmd 00330 deny ip from any to any frag in via $vif
$cmd 00332 deny tcp from any to any established in via $vif

# allowing icmp re: ping, etc.
$cmd 00310 allow icmp from any to any in via $vif

# allowing inbound mail, dhcp, http, https
$cmd 00350 allow udp from any 53 to me in via $vif
$cmd 00360 allow tcp from any 53 to me in via $vif
$cmd 00370 allow udp from any 67 to me dst-port 68 in via $vif keep-state

$cmd 00400 allow tcp from any to me dst-port 80 in via $vif setup limit src-addr 2
$cmd 00410 allow tcp from any to me dst-port 443 in via $vif setup limit src-addr 2

# SSHguard puts offender addresses in table 22. Set up the table rule
# Please note the '\(22\)' syntax, necessary since it's run as shell command
$cmd 01000 deny ip from table\(22\) to any

# allow inbound ssh, mail. PROTECTED SERVICES: numbered ABOVE sshguard blacklist range 
$cmd 56420 allow tcp from any to me dst-port 22 in via $vif setup limit src-addr 2
$cmd 56530 allow tcp from any to any dst-port 25 in via $vif setup keep-state
$cmd 56531 allow tcp from any to any dst-port 465 in via $vif setup keep-state
$cmd 56532 allow tcp from any to any dst-port 587 in via $vif setup keep-state

# deny everything else, and log it
# inbound catchall
$cmd 56599 deny log ip from any to any in via $vif

# ipfw built-in default, don't uncomment
# $cmd 65535 deny ip from any to any

Шаг 4. Запуск и тестирование

Системные потребности различаются, и различные варианты портов для блокировки или разблокировки отражаются в наборе правил. После завершения набора правил сохраните файл /usr/local/etc/IPFW.rulesи запустите службы FBSD:

 # service ipfw start
 # service sshguard start

Теперь должен работать запущенный брандмауэр! Проверьте sshguard:

 [user@vultr ~]$ sudo pgrep -lfa ssh

Если sshguardработает, его pid и полная командная строка отображаются:

720 /usr/local/sbin/sshguard -b 40:/var/db/sshguard/blacklist.db -l /var/log/auth.log -l /var/log/maillog -a 40 -p 420 -s 1200 -w /usr/local/etc/sshguard.whitelist -i /var/run/sshguard.pid

Это показывает набор правил межсетевого экрана со статистикой и последний раз, когда пакет соответствовал правилу:

 [user@vultr ~]$ sudo ipfw -cat list

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

ipfw table 22 list

Результат печатается как:

10.10.10.118/32 0
10.10.10.72/32 0
...

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

Шаг 5. Сохранение бдительности ...

Рекомендуется периодически проверять журналы, чтобы убедиться, что вторжения контролируются. В общем /var/log/auth.logи /var/log/securityинформативно. Пробелы или ошибки в покрытии сетевых услуг могут стать очевидными. При необходимости изменение набора правил брандмауэра является обычной частью администрирования сервера.

В предыдущих версиях sshguard, когда размер /var/db/sshguard/blacklist.dbфайла увеличивался, он мог помешать sshguardзапуску при загрузке системы. Удаление или переименование файла черного списка разрешено sshguardзапускать. Эта проблема, похоже, исправлена ​​в последней версии sshguard, поэтому этот обходной путь, вероятно, больше не нужен.

Обязательно внесите в белый список IP-адрес, с которого вы подключены к сеансу SSH. Если вы случайно заблокировали себя, вы всегда можете подключиться к консоли noVNC по адресу https://my.vultr.com и внести в белый список свой IP-адрес.

Подводя итог, используя комбинацию ipfwи sshguardпомогая поддерживать вашу систему FreeBSD в безопасности и выполнять свою работу. Минимизация навязчивой сетевой активности имеет дополнительное преимущество: меньший «шум» облегчает отслеживание и настройку работы системы, способствуя созданию более безопасного и лучше работающего сервера.

Эффективная защита системы / сервера FreeBSD не особенно сложна. Несмотря на то, что для его запуска требуется скромное усилие, оно окупается значительно большей VPS и безопасностью проекта.


Tags: #BSD #Security

Изучение 26 методов анализа больших данных: часть 1

Изучение 26 методов анализа больших данных: часть 1

Изучение 26 методов анализа больших данных: часть 1

6 невероятных фактов о Nintendo Switch

6 невероятных фактов о Nintendo Switch

Многие из вас знают Switch, который выйдет в марте 2017 года, и его новые функции. Для тех, кто не знает, мы подготовили список функций, которые делают «Switch» обязательным гаджетом.

Технические обещания, которые все еще не выполнены

Технические обещания, которые все еще не выполнены

Вы ждете, когда технологические гиганты выполнят свои обещания? проверить, что осталось недоставленным.

Функциональные возможности уровней эталонной архитектуры больших данных

Функциональные возможности уровней эталонной архитектуры больших данных

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

Как ИИ может вывести автоматизацию процессов на новый уровень?

Как ИИ может вывести автоматизацию процессов на новый уровень?

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

CAPTCHA: как долго она может оставаться жизнеспособным методом различения между человеком и ИИ?

CAPTCHA: как долго она может оставаться жизнеспособным методом различения между человеком и ИИ?

CAPTCHA стало довольно сложно решать пользователям за последние несколько лет. Сможет ли он оставаться эффективным в обнаружении спама и ботов в ближайшем будущем?

Технологическая сингулярность: далекое будущее человеческой цивилизации?

Технологическая сингулярность: далекое будущее человеческой цивилизации?

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

Телемедицина и удаленное здравоохранение: будущее уже здесь

Телемедицина и удаленное здравоохранение: будущее уже здесь

Что такое телемедицина, дистанционное здравоохранение и их влияние на будущее поколение? Это хорошее место или нет в ситуации пандемии? Прочтите блог, чтобы узнать мнение!

Вы когда-нибудь задумывались, как хакеры зарабатывают деньги?

Вы когда-нибудь задумывались, как хакеры зарабатывают деньги?

Возможно, вы слышали, что хакеры зарабатывают много денег, но задумывались ли вы когда-нибудь о том, как они зарабатывают такие деньги? Давайте обсудим.

Обновление дополнения к macOS Catalina 10.15.4 вызывает больше проблем, чем решает

Обновление дополнения к macOS Catalina 10.15.4 вызывает больше проблем, чем решает

Недавно Apple выпустила macOS Catalina 10.15.4, дополнительное обновление для исправления проблем, но похоже, что это обновление вызывает больше проблем, приводящих к поломке компьютеров Mac. Прочтите эту статью, чтобы узнать больше