Защита Nginx с помощью fail2ban Ubuntu 14.04

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

Утилита fail2ban может значительно снизить вероятность подобных атак. Если пользователь не может пройти аутентификацию за определенное количество попыток, fail2ban временно заблокирует его IP-адрес, динамически изменяя действующую политику брандмауэра. Утилита хранит настройки в jail; эти конфигурационные файлы проверяют логи сервисов на наличие сообщений о неудачных попытках аутентификации. Настроить fail2ban для поддержки Nginx довольно просто, так как утилита предлагает встроенные фильтры.

Данное руководство научит вас устанавливать fail2ban и настраивать утилиту для мониторинга Nginx в Ubuntu 14.04.

Требования

Установка Nginx и настройка парольной аутентификации

Примечание: Если веб-сервер Nginx уже установлен и защищен паролем, пропустите этот раздел.

Веб-сервер Nginx можно установить с помощью пакетного менеджера apt.

Обновите индекс пакетов:

sudo apt-get update
sudo apt-get install nginx

Сервис fail2ban помогает защитить точки входа в систему. Настройте парольную аутентификацию хотя бы на нескольких страницах сайта. В этом вам поможет руководство Настройка авторизации на основе пароля на Nginx в Ubuntu 14.04.

Установка fail2ban

Установив Nginx и настроив аутентификацию, можно приступать к установке утилиты fail2ban.

sudo apt-get update
sudo apt-get install fail2ban

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

Настройка общих параметров fail2ban

Для начала нужно отредактировать параметры, с помощью которых утилита fail2ban понимает, какие логи приложений она должна мониторить и что делать в случае обнаружения попыток взлома. Все базовые настройки хранятся в файле /etc/fail2ban/jail.conf.

Чтобы внести изменения в настройки, нужно скопировать этот файл в /etc/fail2ban/jail.local. Это предотвратит перезапись пользовательских параметров при автоматическом обновлении пакета.

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Откройте jail.local, чтобы добавить настройки для мониторинга Nginx.

sudo nano /etc/fail2ban/jail.local

Отладка стандартных параметров

Для начала нужно рассмотреть раздел [DEFAULT]. Параметры этого раздела будут применяться ко всем сервисам, которые поддерживает fail2ban (если только эти значения не переопределяются в конфигурационных файлах этих сервисов).

Сначала следует определить здесь список клиентов, на которые политика fail2ban не должна распространяться. Директива ignoreip настраивает исходные адреса, которые fail2ban будет игнорировать. В работе с веб-серверами она не так важна, поскольку вы всегда можете вручную отменить блокировку. По умолчанию она пропускает любой трафик, поступающий с локальной машины.  Вы можете добавить другие адреса, которые нужно игнорировать, поместив их в конец директивы ignoreip через пробел.

[DEFAULT]
. . .
ignoreip = 127.0.0.1/8 your_home_IP

Параметр bantime устанавливает время, в течение которого клиент будет заблокирован, если он не смог пройти аутентификацию. В идеале значение этой директивы должно быть достаточно большим, чтобы заблокировать вредоносных пользователей, и в то же время позволять обычным пользователям исправлять свои ошибки. Значение bantime измеряется в секундах. По умолчанию установлено значение 600 секунд (10 минут).

[DEFAULT]
. . .
bantime = 3600

Следующие два параметра – findtime и maxretry – определяют условия, при которых будут блокироваться вредоносные пользователи.

Директива maxretry задает количество попыток входа, а findtime – интервал времени, в течение которого пользователь должен пройти аутентификацию. Если клиент превысил любой из этих показателей, он будет заблокирован.

[DEFAULT]
. . .
findtime = 3600   # эти параметры заблокируют пользователей
maxretry = 6      # которые не смогли предоставить учетные данные 6 раз в течение 30 минут

Настройка электронных уведомлений (опционально)

Вы можете включить отправку уведомлений по электронной почте. Для этого необходимо сначала настроить на своем сервере MTA, чтобы он мог отправлять электронную почту. Чтобы узнать, как использовать для этого Postfix, следуйте этому руководству.

Установив MTA-сервер, найдите раздел [DEFAULT] в файле /etc/fail2ban/jail.local. Если вы установили Postfix, укажите в директиве mta значение mail.

[DEFAULT]
. . .
mta = mail

Параметр destemail определяет адрес электронной почты, который должен получать сообщения о заблокированных пользователях. Параметр sendername задает отправителя сообщения. Добавьте эти параметры в jail.local в раздел [DEFAULT] и установите соответствующие значения.

[DEFAULT]
. . .
destemail = youraccount@email.com
sendername = Fail2BanAlerts

Параметр action настраивает действие fail2ban в случае блокировки. Действие по умолчанию заблокирует трафик, исходящий от IP-адреса злоумышленника, до истечения времени бана путем перенастройки брандмауэра.

Если вы хотите настроить оповещения по электронной почте, добавьте или раскомментируйте элемент action в файл jail.local и измените его значение с action_ на action_mw. Если вы хотите, чтобы письмо включало соответствующие строки из логов, вы можете указать значение action_mwl. Если вы решили использовать электронные оповещения, убедитесь, что настройки почты их поддерживают.

[DEFAULT]
. . .
action = %(action_mwl)s

Настройка fail2ban для мониторинга логов Nginx

Определив общие параметры fail2ban, можно приступать к настройке поддержки логов Nginx.

Для определения индивидуальных параметров сервисов утилита fail2ban использует jail – это раздел специальных директив в конфигурационном файле утилиты. Каждый такой раздел отмечается заголовком в квадратных скобках; исключение – раздел [DEFAULT], который хранит общие настройки утилиты. По умолчанию поддерживается только jail для [ssh].

Чтобы включить поддержку мониторинга логов Nginx, нужно включить раздел [nginx-http-auth]. Для этого найдите в этом разделе директиву enabled и измените ее значение на true.

[nginx-http-auth]
enabled  = true
filter   = nginx-http-auth
port     = http,https
logpath  = /var/log/nginx/error.log
. . .

Это единственный раздел Nginx, который идет в комплекте с пакетом fail2ban от Ubuntu. Вы можете создавать собственные разделы jail для определения дополнительных функций.

Для примера можно попробовать создать раздел [nginx-noscript], который будет банить клиентов, которые ищут на веб-сайте уязвимые сценарии. Если вы не используете PHP или какой-либо другой язык программирования вместе с веб-сервером, вы можете добавить этот раздел, чтобы забанить тех, кто запрашивает эти типы ресурсов. Добавьте в jail.local:

[nginx-noscript]
enabled  = true
port     = http,https
filter   = nginx-noscript
logpath  = /var/log/nginx/access.log
maxretry = 6
. . .

Раздел [nginx-badbots] может распознавать известные шаблоны запросов вредоносных ботов и блокировать их:

[nginx-badbots]
enabled  = true
port     = http,https
filter   = nginx-badbots
logpath  = /var/log/nginx/access.log
maxretry = 2

Если в вашей настройке Nginx не предоставляет доступа к веб-контенту в домашних каталогах пользователей, вы можете заблокировать пользователей, которые запрашивают эти ресурсы, добавив раздел [nginx-nohome]:

[nginx-nohome]
enabled  = true
port     = http,https
filter   = nginx-nohome
logpath  = /var/log/nginx/access.log
maxretry = 2

Также следует блокировать клиентов, которые пытаются использовать Nginx как открытый прокси-сервер. Для этого добавьте раздел [nginx-noproxy].

[nginx-noproxy]
enabled  = true
port     = http,https
filter   = nginx-noproxy
logpath  = /var/log/nginx/access.log
maxretry = 2

Добавив все необходимые настройки, сохраните и закройте файл. Теперь нужно добавить фильтры.

Настройка фильтров fail2ban

Вы расширили файл /etc/fail2ban/jail.local дополнительными разделами, чтобы утилита могла блокировать больший диапазон вредоносных действий. Теперь нужно создать файлы фильтров для этих разделов. Эти файлы будут определять шаблоны для поиска в логах Nginx.

Создайте каталог для фильтров:

cd /etc/fail2ban/filter.d

Можно начать с настройки предварительно установленного фильтра аутентификации Nginx, который должен соответствовать дополнительному шаблону неудачной аутентификации в логе. Откройте файл:

sudo nano nginx-http-auth.conf

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

[Definition]
failregex = ^ \[error\] \d+#\d+: \*\d+ user "\S+":? (password mismatch|was not found in ".*"), client: <HOST>, server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$
^ \[error\] \d+#\d+: \*\d+ no user/password was provided for basic authentication, client: <HOST>, server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$
ignoreregex =

Сохраните и закройте файл.

Теперь скопируйте apache-badbots.conf и используйте его для Nginx. В целом можно использовать исходную версию файла apache-badbots.conf, но для чистоты настройки лучше создать копию. Он совпадает со ссылкой на фильтр в конфигурации jail.

sudo cp apache-badbots.conf nginx-badbots.conf

Теперь создайте фильтр для раздела [nginx-noscript].

sudo nano nginx-noscript.conf

Вставьте в файл следующее определение.

Суффиксы сценария можно свободно менять.

[Definition]
failregex = ^<HOST> -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\.scgi)
ignoreregex =

Сохраните и закройте файл.

Создайте фильтр для раздела [nginx-nohome]:

sudo nano nginx-nohome.conf

Поместите в файл следующий код:

[Definition]
failregex = ^<HOST> -.*GET .*/~.*
ignoreregex =

Сохраните и закройте файл.

Теперь создайте фильтр для [nginx-noproxy]:

sudo nano nginx-noproxy.conf

Этот фильтр будет определять попытки использовать сервер как прокси.

[Definition]
failregex = ^<HOST> -.*GET http.*
ignoreregex =

Сохраните и закройте файл.

Перезапуск fail2ban

Чтобы обновить настройки утилиты, перезапустите fail2ban:

sudo service fail2ban restart

Сервис перезапустится и применит новые политики запрета, которые вы настроили.

Получение информации о включенных разделах jail

Вы можете просмотреть все активированные разделы с помощью этой команды:

sudo fail2ban-client status
Status
|- Number of jail:      6
`- Jail list:           nginx-noproxy, nginx-noscript, nginx-nohome, nginx-http-auth, nginx-badbots, ssh

Вы можете запросить текущие правила iptables, чтобы увидеть, как fail2ban изменил правила брандмауэра, чтобы создать структуру для блокировки клиентов. Теперь fail2ban сможет выборочно блокировать клиентов, добавляя их в специальные цепочки брандмауэра:

sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N fail2ban-nginx-badbots
-N fail2ban-nginx-http-auth
-N fail2ban-nginx-nohome
-N fail2ban-nginx-noproxy
-N fail2ban-nginx-noscript
-N fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-noproxy
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-nohome
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-badbots
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-noscript
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A fail2ban-nginx-badbots -j RETURN
-A fail2ban-nginx-http-auth -j RETURN
-A fail2ban-nginx-nohome -j RETURN
-A fail2ban-nginx-noproxy -j RETURN
-A fail2ban-nginx-noscript -j RETURN
-A fail2ban-ssh -j RETURN

Чтобы просмотреть подробности блокировки клиентов одним из разделов jail, можно ввести:

sudo fail2ban-client status nginx-http-auth
Status for the jail: nginx-http-auth
|- filter
|  |- File list:        /var/log/nginx/error.log
|  |- Currently failed: 0
|  `- Total failed:     0
`- action
|- Currently banned: 0
|  `- IP list:
`- Total banned:     0

Тестирование политик fail2ban

Важно проверить работу политик fail2ban, чтобы утилита блокировала трафик должным образом. Для этого попробуйте несколько раз ввести неверные учетные данные. После того, как вы превысите предел, вы должны быть заблокированы и не сможете получить доступ к сайту. Если вы настроили уведомления по электронной почте, вы должны получить сообщение о блокировке.

Проверьте состояние с помощью fail2ban-client. Вы должны увидеть свой IP в списке заблокированных.

sudo fail2ban-client status nginx-http-auth
Status for the jail: nginx-http-auth
|- filter
|  |- File list:        /var/log/nginx/error.log
|  |- Currently failed: 0
|  `- Total failed:     12
`- action
|- Currently banned: 1
|  `- IP list:       111.111.111.111
`- Total banned:     1

Убедившись, что утилита работает правильно, разблокируйте свой IP вручную с помощью fail2ban-client.

sudo fail2ban-client set nginx-http-auth unbanip 111.111.111.111

Теперь можно снова попробовать пройти аутентификацию.

Заключение

fail2ban – очень гибкий инструмент. Он позволяет разрабатывать политики, которые будут соответствовать конкретным требованиям безопасности. Вы можете самостоятельно ознакомиться с остальными переменными и шаблонами в файле /etc/fail2ban/jail.local и в каталогах /etc/fail2ban/filter.d и /etc/fail2ban/action.d, Знание основ защиты сервера с помощью fail2ban может обеспечить вашей машине более высокий уровень безопасности.

Читайте также:

Tags: , ,