Поиск по сайту:

Как защитить сервер Nginx с помощью Fail2Ban в Ubuntu 14.04


Введение

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

Настройка fail2ban может решить эту проблему. Когда пользователям неоднократно не удается пройти аутентификацию в службе (или они участвуют в других подозрительных действиях), fail2ban может временно заблокировать нарушающий IP-адрес, динамически изменяя текущую политику брандмауэра. Каждая «тюрьма» fail2ban работает путем проверки журналов, записанных службой, на наличие шаблонов, указывающих на неудачные попытки. Настроить fail2ban для мониторинга журналов Nginx довольно просто, используя некоторые из включены фильтры конфигурации, а некоторые мы создадим сами.

В этом руководстве мы покажем, как установить fail2ban и настроить его для отслеживания попыток вторжения в журналы Nginx. Мы будем использовать сервер Ubuntu 14.04.

Предпосылки

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

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

Если вы заинтересованы в защите своего сервера Nginx с помощью fail2ban, возможно, у вас уже настроен и запущен сервер. Если нет, вы можете установить Nginx из стандартных репозиториев Ubuntu, используя apt.

Обновите локальный индекс пакетов и установите, набрав:

  1. sudo apt-get update
  2. sudo apt-get install nginx

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

Установить Fail2Ban

После того, как ваш сервер Nginx запущен и включена аутентификация по паролю, вы можете продолжить и установить fail2ban (здесь мы включаем повторное получение другого репозитория на случай, если вы уже настроили Nginx на предыдущих шагах):

  1. sudo apt-get update
  2. sudo apt-get install fail2ban

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

Изменение общих настроек в Fail2Ban

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

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

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

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

  1. sudo nano /etc/fail2ban/jail.local

Изменение значений по умолчанию

Мы должны начать с оценки значений по умолчанию, установленных в файле, чтобы увидеть, соответствуют ли они нашим потребностям. Их можно найти в разделе [DEFAULT] файла. Эти элементы устанавливают общую политику, и каждый из них может быть переопределен в определенных тюрьмах.

Одним из первых элементов, на который следует обратить внимание, является список клиентов, на которых не распространяются политики fail2ban. Это задается директивой ignoreip. Иногда рекомендуется добавить свой собственный IP-адрес или сеть в список исключений, чтобы не заблокировать себя. Это менее проблематично при входе в систему веб-сервера, если вы можете поддерживать доступ к оболочке, поскольку вы всегда можете вручную отменить запрет. Вы можете добавить дополнительные IP-адреса или сети, разделенные пробелом, в существующий список:

[DEFAULT]

. . .
ignoreip = 127.0.0.1/8 your_home_IP

Еще один элемент, который вы можете настроить, — это bantime, который определяет, на сколько секунд нарушитель будет забанен. Идеально установить это время на достаточно долгое, чтобы нарушить усилия злоумышленника, и в то же время достаточно короткое, чтобы законные пользователи могли исправить ошибки. По умолчанию установлено значение 600 секунд (10 минут). Увеличьте или уменьшите это значение по своему усмотрению:

[DEFAULT]

. . .
bantime = 3600

Следующие два элемента определяют объем строк журнала, используемых для определения клиента-нарушителя. Директива findtime указывает количество времени в секундах, а директива maxretry указывает допустимое количество попыток в течение этого времени. Если клиент сделает больше попыток, чем maxretry в течение времени, установленного findtime, он будет забанен:

[DEFAULT]

. . .
findtime = 3600   # These lines combine to ban clients that fail
maxretry = 6      # to authenticate 6 times within a half hour.

Настройка почтовых уведомлений (необязательно)

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

После того, как вы настроили свой MTA, вам нужно будет настроить некоторые дополнительные параметры в разделе [DEFAULT] файла /etc/fail2ban/jail.local. Начните с установки директивы mta. Если вы настроили Postfix, как показано в приведенном выше руководстве, измените это значение на «mail»:

[DEFAULT]

. . .
mta = mail

Вам необходимо выбрать адрес электронной почты, на который будут приходить уведомления. Измените директиву destemail, указав это значение. Директиву sendername можно использовать для изменения поля \Отправитель в электронных письмах с уведомлением:

[DEFAULT]

. . .
destemail = youraccount@email.com
sendername = Fail2BanAlerts

На языке fail2ban «действие» — это процедура, выполняемая, когда клиент слишком много раз не проходит аутентификацию. Действие по умолчанию (называемое action_) — просто заблокировать IP-адрес. с рассматриваемого порта.Однако есть два других готовых действия, которые можно использовать, если у вас настроена почта.

Вы можете использовать действие action_mw, чтобы заблокировать клиент и отправить уведомление по электронной почте на настроенную учетную запись с отчетом \whois по адресу, нарушающему правила. Вы также можете использовать action_mwl действие, которое делает то же самое, но также включает строки журнала, вызывающие запрет:

[DEFAULT]

. . .
action = %(action_mwl)s

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

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

Каждый джейл в файле конфигурации отмечен заголовком, содержащим имя джейла в квадратных скобках (каждый раздел, кроме раздела [DEFAULT], указывает конкретную конфигурацию джейла). По умолчанию включена только тюрьма [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, включенная в пакет Ubuntu fail2ban. Однако мы можем создать свои собственные джейлы, чтобы добавить дополнительные функции. Вдохновение и некоторые детали реализации этих дополнительных тюрьм пришли отсюда.

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

[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

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

Добавление фильтров для дополнительных джейлов Nginx

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

Начните с перехода в каталог фильтров:

  1. cd /etc/fail2ban/filter.d

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

  1. 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. Мы можем использовать этот файл как есть, но для ясности скопируем его под новым именем. Это соответствует тому, как мы ссылались на фильтр в конфигурации тюрьмы:

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

Далее мы создадим фильтр для нашей тюрьмы [nginx-noscript]:

  1. sudo nano nginx-noscript.conf

Вставьте следующее определение внутрь. Не стесняйтесь настраивать суффиксы сценария, чтобы удалить языковые файлы, которые ваш сервер использует на законных основаниях, или добавить дополнительные суффиксы:

[Definition]

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

ignoreregex =

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

Затем создайте фильтр для джейла [nginx-nohome]:

  1. sudo nano nginx-nohome.conf

Поместите в файл следующую информацию о фильтре:

[Definition]

failregex = ^<HOST> -.*GET .*/~.*

ignoreregex =

Сохраните и закройте файл, когда закончите.

Наконец, мы можем создать фильтр для тюрьмы [nginx-noproxy]:

  1. sudo nano nginx-noproxy.conf

Это определение фильтра будет соответствовать попыткам использовать ваш сервер в качестве прокси:

[Definition]

failregex = ^<HOST> -.*GET http.*

ignoreregex =

Сохраните и закройте файл, когда закончите.

Активация ваших джейлов Nginx

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

  1. sudo service fail2ban restart

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

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

Вы можете просмотреть все включенные джейлы с помощью команды fail2ban-client:

  1. sudo fail2ban-client status

Вы должны увидеть список всех джейлов, которые вы включили:

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

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

  1. sudo iptables -S
Output
-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

Если вы хотите увидеть подробную информацию о банах, применяемых какой-либо одной тюрьмой, вероятно, будет проще снова использовать fail2ban-client:

  1. sudo fail2ban-client status nginx-http-auth
Output
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, чтобы убедиться, что они блокируют трафик должным образом. Например, для запроса аутентификации Nginx вы можете указать неправильные учетные данные несколько раз. После того, как вы превысите лимит, вы должны быть забанены и не сможете получить доступ к сайту. Если вы настроили уведомления по электронной почте, вы должны увидеть сообщения о блокировке в указанной вами учетной записи электронной почты.

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

  1. sudo fail2ban-client status nginx-http-auth
Output
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, набрав:

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

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

Заключение

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

Если вы хотите узнать больше о fail2ban, перейдите по следующим ссылкам:

  • Как работает Fail2Ban для защиты служб на сервере Linux
  • Как защитить SSH с помощью Fail2Ban в Ubuntu 14.04
  • Как защитить сервер Apache с помощью Fail2Ban в Ubuntu 14.04