Домашний сервер на Orange Pi — часть 6: используем fail2ban для защиты сервера
Во все времена с момента изобретения глобальной сети шла непримеримая война ммежду теми, кто имеет сервер и хочет защитить его от несанкционированного доступа, и теми, кто хочет получить доступ к ресурсам сервера.
Поэтому сегодня, мы постараемся немного улучшить защиту нашего сервера. Хорошо, что в UNIX-подобных системах, хорошо организована система логирования, поэтому нам остается только систематически проверять логи на наличие "нехороших" записей и отправлять нарушилитей в далекий бан. Опять же, на нашу удачу, сейчас даже самостоятельно парсить кучу логов в системе не надо. Есть отличный Open Source продук с многоговорящим названием - fail2ban.
По своей сути, fail2ban - это демон (мы же помним, что в linux - демоны, а в windows - службы?), который парсит файлы логов в соответсвии с фильтрами и правилами, которые можно создавать самостоятельно, и обнаружив ссответсвие отправляет IP адреса (боты, злоумышленники) в бан.
Установка fail2ban
Установка fail2ban проста так же как и установка любого другого пакета в Ubuntu-производной системе:
sudo apt install fail2ban whois -y
Дополнительно установим пакет whois
для проверки IP-адреса и домена, для составления более подробного отчета отсылаемого на email.
В принципе, приложение уже готово к работе: базовые правила по защите SSH уже включены, сервис активирован и запущен, но мы добавим несколько правил для оптимальной работы приложения.
Конфигурирование fail2ban
Настройка сервиса осуществляется конфигурированием правил - jail'ов (изоляторов), а также фильтров - по необходимости.
Джайлы можно конфигурировать двумя способами:
- Добавлять отдельный jail в каталог
/etc/fail2ban/jail.d/правило.conf
- Составить перечень правил в одном файле:
/etc/fail2ban/jail.local
Мне удобнее иметь один файл конфигурации, в котором будут описаны все правила. Поэтому открываем файл для редактирования:
sudo nano /etc/fail2ban/jail.local
и вносим в него следующий текст.
# общие настройки правил
[DEFAULT]
# Белый список IP-адресов
ignoreip = 127.0.0.1 192.168.1.0/24
# Время блокировки 30 дней
bantime = 2592000
# Время в течение которого отлавливаем неудачные попытки 8 мин
findtime = 43200
# Количество попыток
maxretry = 3
# Каким сервисом производим блокировку
banaction = iptables-multiport
# настройка отправки сообщения на почту
destemail = example@example.ru
sendername = Fail2Ban
mta = sendmail
action = %(action_mwl)s
# Правила для защиты SSH
# [Название правила]
[ssh]
# Включаем правило
enabled = true
# Какой порт проверяем (стандартный порт SSH - 22) и какой будем банить.
port = ssh
# Применяемый фильтр
filter = sshd
# Инструмент для блокировки
action = iptables[name=sshd]
# Какой файл логов отслеживаем
logpath = /var/log/auth.log
# Защищаем WEB-сервер Apache
# Отслеживаем неудачные попытки ввода пароля
[apache]
enabled = true
port = http,https
filter = apache-auth
action = iptables-multiport[name=APACHE, port="http,https", protocol=tcp]
logpath = /var/log/apache*/*error.log
# Отслеживаем сканирование для применения эксплойтов и php уязвимостей
[apache-noscript]
enabled = true
port = http,https
filter = apache-noscript
action = iptables-multiport[name=APACHE-NOSCRIPT, port="http,https", protocol=tcp]
logpath = /var/log/apache*/*error.log
# Отслеживаем попытки переполнения стека Apache
[apache-overflows]
enabled = true
port = http,https
filter = apache-overflows
action = iptables-multiport[name=APACHE-OVERWLOWS, port="http,https", protocol=tcp]
logpath = /var/log/apache*/*error.log
# Здесь мы даем зловреду максимум две попытки
maxretry = 2
# Отслеживаем попытки поиска домашней директории на сервере
[apache-nohome]
enabled = true
port = http,https
filter = apache-nohome
action = iptables-multiport[name=APACHE-NOHOME, port="http,https", protocol=tcp]
logpath = /var/log/apache*/*error.log
maxretry = 2
# включаем защиту wp-admin/wp-login
[wordpress-login]
enabled = true
port = http,https
action = iptables-multiport[name=WP, port="http,https", protocol=tcp]
# Этого фильтра нет, необходимо добавить в /etc/fail2ban/filter.d/wp-login.conf
filter = wordpress-login
logpath = /var/log/apache*/*access.log
maxretry = 2
Теперь создадим фильтр для отслеживания попыток входа в админ-панель WordPress
sudo nano /etc/fail2ban/filter.d/wordpress-login.conf
и вносим следующий текст:
[Definition]
failregex = ^<HOST> .* "POST /wp-login.php
Этот фильтр обеспечит блокировку всех IP адресов, которые обращаются к wp-login.php (адрес администратора внесен в белый список)
сохраняемся, выходим из редактора и для того, что внесенные изменения вступили в силу, нам осталось только перезапустить сервер fail2ban
sudo systemctl restart fail2ban
Всё, настройку мы завершили и наш сервер стал чуть-чуть лучще защищён. Безусловно, если атаку совершает не бот, а человек, то он скорее всего будет использовать proxy-серверы, VPN и мы заблокируем его временный IP-адрес, но новичка это может остановить, а прфессионала точно не остановит. Надо четко осознавать, что неприступных серверов не бывает и рано или поздно наш сервер могут взломать, поэтому смотрим на это философски, максимально обеспечиваем защиту и делалаем регулярные backup'ы.
Работа с сервисом в терминале
Иногда нам может понадобиться работа с сервисом "в ручном" режиме:
- Проверить статус сервиса и правила в частности;
- Самостоятельно заблокировать адрес или разблокировать;
Сейчас рассмотрим несколько примеров работы с утилитой в теминале.
Проверить список правил
sudo fail2ban-client status
Конкретное правило можно проверить командой:
sodo fail2ban-client status apache
Так же, правила блокировки можно проверить с помощью iptables
:
sudo iptables -L
Добавить IP адрес в список блокировок (забанить)
Добавить адрес в список заблокированых адресов можно насколькими способами:
Средствами fail2ban
sudo fail2ban-client set "правило" banip IP адрес
Пример:
sudo fail2ban-client set apache banip 192.168.1.3
Средствами iptables
sudo iptables -I "цепочка правил" -s IP адрес -j DROP
Пример:
sudo iptables -I f2b-APACHE 1 -s 192.168.1.4 -j DROP
Удаление IP адреса из списка блокировки (разбанить)
Удаление заблокированного адреса из списка блокировок, так же можно выполнить несколькими способами:
Средствами fail2ban
sudo fail2ban-client set "правило" unbanip "IP адрес"
Пример:
sudo fail2ban-client set apache unbanip 192.168.1.3
Средствами iptables
sudo iptables -D "цепочка правил" -s IP адрес -j DROP
Пример:
sudo iptables -D f2b-APACHE -s 192.168.1.4 -j DROP
На этом настройка сервиса fail2ban завершена. Надеюсь, что материал поможет начинающим администраторам и домашним айтишникам как я )). Если более опытные товарищи могут как-то дополнить материал или имеют конструктивную критику, то добро пожаловать в комментарии.
Рад был помочь. До скорых встреч.