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

Вступление

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

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

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

Предпосылки

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

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

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

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

sudo apt-get update
sudo apt-get install nginx

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

Установить Fail2Ban

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

sudo apt-get update
sudo apt-get install fail2ban

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

Настройка общих настроек в Fail2Ban

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

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

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

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

sudo nano /etc/fail2ban/jail.local

Изменение настроек по умолчанию

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

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

/etc/fail2ban/jail.local

[DEFAULT]

. . .
ignoreip = 127.0.0.1/8 your_home_IP

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

/etc/fail2ban/jail.local

[DEFAULT]

. . .
bantime = 3600

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

/etc/fail2ban/jail.local

[DEFAULT]

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

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

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

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

/etc/fail2ban/jail.local

[DEFAULT]

. . .
mta = mail

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

/etc/fail2ban/jail.local

[DEFAULT]

. . .
destemail = [email protected]
sendername = Fail2BanAlerts

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

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

/etc/fail2ban/jail.local

[DEFAULT]

. . .
action = %(action_mwl)s

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

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

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

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

/etc/fail2ban/jail.local

[nginx-http-auth]

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

Это единственная тюрьма для Nginx, включенная в пакет Ubuntufail2ban. Тем не менее, мы можем создавать свои собственные тюрьмы, чтобы добавить дополнительную функциональность. Вдохновением для создания и некоторых деталей реализации этих дополнительных тюрем послужилиhere иhere.

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

/etc/fail2ban/jail.local

[nginx-noscript]

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

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

/etc/fail2ban/jail.local

[nginx-badbots]

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

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

/etc/fail2ban/jail.local

[nginx-nohome]

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

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

/etc/fail2ban/jail.local

[nginx-noproxy]

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

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

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

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

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

cd /etc/fail2ban/filter.d

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

sudo nano nginx-http-auth.conf

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

/etc/fail2ban/filter.d/nginx-http-auth.conf

[Definition]


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

ignoreregex =

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

Затем мы можем скопировать файлapache-badbots.conf для использования с Nginx. Мы можем использовать этот файл как есть, но для ясности мы скопируем его в новое имя. Это соответствует тому, как мы ссылались на фильтр в конфигурации тюрьмы:

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

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

sudo nano nginx-noscript.conf

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

/etc/fail2ban/filter.d/nginx-noscript.conf

[Definition]

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

ignoreregex =

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

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

sudo nano nginx-nohome.conf

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

/etc/fail2ban/filter.d/nginx-nohome.conf

[Definition]

failregex = ^ -.*GET .*/~.*

ignoreregex =

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

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

sudo nano nginx-noproxy.conf

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

/etc/fail2ban/filter.d/nginx-noproxy.conf

[Definition]

failregex = ^ -.*GET http.*

ignoreregex =

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

Активация ваших джинов Nginx

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

sudo service fail2ban restart

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

Получение информации о включенных тюрьмах

Вы можете увидеть все свои включенные тюрьмы, используя командуfail2ban-client:

sudo fail2ban-client status

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

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

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

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:

sudo fail2ban-client status nginx-http-auth
OutputStatus 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-адрес заблокирован для доступа к сайту:

sudo fail2ban-client status nginx-http-auth
OutputStatus 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 для защиты вашего сервера Nginx довольно просто в простейшем случае. Однакоfail2ban обеспечивает большую гибкость для создания политик, которые будут соответствовать вашим конкретным потребностям безопасности. Взглянув на переменные и шаблоны в файле/etc/fail2ban/jail.local, а также на файлы, от которых он зависит, в каталогах/etc/fail2ban/filter.d и/etc/fail2ban/action.d, вы можете найти множество элементов, которые можно настроить и изменить по мере необходимости. необходимо развиваться. Изучение основ защиты сервера с помощьюfail2ban может обеспечить большую безопасность с минимальными усилиями.

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

Related