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

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


Введение

Хотя подключение к вашему серверу через SSH может быть очень безопасным, сам демон SSH является службой, которая должна быть подключена к Интернету для правильной работы. Это сопряжено с определенным риском и создает вектор атаки для потенциальных злоумышленников.

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

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

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

Установите Fail2Ban на Ubuntu 14.04

Процесс установки этого инструмента прост, потому что команда упаковки Ubuntu поддерживает пакет в репозиториях по умолчанию.

Во-первых, нам нужно обновить наш локальный индекс пакета, а затем мы можем использовать apt для загрузки и установки пакета:

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

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

Настройте Fail2Ban с помощью настроек службы.

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

Поскольку этот файл может быть изменен при обновлении пакета, мы не должны редактировать этот файл на месте, а скорее копируем его, чтобы мы могли безопасно вносить наши изменения. Чтобы эти два файла успешно работали вместе, лучше всего включать только те настройки, которые вы хотите переопределить, в файл jail.local. Все параметры по умолчанию будут взяты из файла jail.conf.

Хотя в файл jail.local следует включать только отклонения от значения по умолчанию, проще создать файл jail.local на основе существующего jail. conf файл. Поэтому мы скопируем этот файл с закомментированным содержимым в качестве основы для файла jail.local. Вы можете сделать это, набрав:

  1. awk '{ printf "# "; print; }' /etc/fail2ban/jail.conf | sudo tee /etc/fail2ban/jail.local

Как только файл скопирован, мы можем открыть исходный файл jail.conf, чтобы увидеть, как все настроено по умолчанию.

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

В этом файле есть несколько настроек, которые вы можете настроить. Настройки, расположенные в разделе [DEFAULT], будут применяться ко всем службам, включенным для fail2ban, которые не переопределены в собственном разделе службы.

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

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

[DEFAULT]
. . .
bantime = 600
. . .

Параметр bantime устанавливает период времени, в течение которого клиент будет заблокирован, если ему не удалось правильно пройти аутентификацию. Это измеряется в секундах. По умолчанию установлено значение 600 секунд или 10 минут.

[DEFAULT]
. . .
findtime = 600
maxretry = 3
. . .

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

Переменная maxretry устанавливает количество попыток аутентификации клиента в течение временного интервала, определенного findtime, прежде чем он будет заблокирован. С настройками по умолчанию служба fail2ban заблокирует клиента, который безуспешно пытается войти в систему 3 раза в течение 10-минутного окна.

[DEFAULT]
. . .
destemail = root@localhost
sendername = Fail2Ban
mta = sendmail
. . .

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

[DEFAULT]
. . .
action = $(action_)s
. . .

Этот параметр настраивает действие, которое выполняет fail2ban, когда хочет установить запрет. Значение action_ определено в файле незадолго до этого параметра. Действие по умолчанию — просто настроить брандмауэр так, чтобы он отклонял трафик от хоста-нарушителя до тех пор, пока не истечет время запрета.

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

Индивидуальные настройки тюрьмы

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

Каждый из этих разделов можно включить, раскомментировав заголовок в jail.local и изменив строку enabled на \true:

[jail_to_enable]
. . .
enabled = true
. . .

По умолчанию служба SSH включена, а все остальные отключены.

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

Некоторые другие настройки, которые устанавливаются здесь, — это filter, который будет использоваться, чтобы решить, указывает ли строка в журнале на неудачную аутентификацию, и logpath, который сообщает fail2ban, где журналы для эта конкретная служба находится.

Значение filter на самом деле является ссылкой на файл, расположенный в каталоге /etc/fail2ban/filter.d, с удаленным расширением .conf. . Эти файлы содержат регулярные выражения, которые определяют, является ли строка в журнале неудачной попыткой аутентификации. Мы не будем подробно рассматривать эти файлы в этом руководстве, потому что они довольно сложны, а предопределенные настройки хорошо соответствуют соответствующим строкам.

Однако вы можете увидеть, какие фильтры доступны, заглянув в этот каталог:

  1. ls /etc/fail2ban/filter.d

Если вы видите файл, который, похоже, связан с используемой вами службой, вам следует открыть его в текстовом редакторе. Большинство файлов довольно хорошо прокомментированы, и вы должны хотя бы сказать, от какого типа условий был разработан сценарий. У большинства этих фильтров есть соответствующие (отключенные) разделы в файле jail.conf, которые при желании можно включить в файле jail.local.

Например, представьте, что мы обслуживаем веб-сайт с помощью Nginx, и поймем, что защищенная паролем часть нашего сайта перекрывается попытками входа в систему. Мы можем указать fail2ban использовать файл nginx-http-auth.conf для проверки этого условия в файле /var/log/nginx/error.log.

На самом деле это уже настроено в разделе с именем [nginx-http-auth] в нашем файле /etc/fail2ban/jail.conf. Нам просто нужно раскомментировать раздел в файле jail.local и изменить параметр enabled, чтобы защитить наш сервис:

. . .
[nginx-http-auth]

enabled = true
. . .

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

Собираем все вместе

Теперь, когда вы понимаете основную идею fail2ban, давайте рассмотрим базовую настройку.

Мы собираемся настроить политику автоматического запрета для SSH и Nginx, как мы описали выше. Мы хотим, чтобы fail2ban сообщал нам по электронной почте, когда IP-адрес заблокирован.

Во-первых, давайте установим все необходимое программное обеспечение.

Если у вас его еще нет, вам понадобится nginx, поскольку мы собираемся отслеживать его журналы, и вам понадобится sendmail, чтобы отправлять нам уведомления. Мы также возьмем iptables-persistent, чтобы позволить серверу автоматически настраивать правила брандмауэра при загрузке. Их можно получить из стандартных репозиториев Ubuntu:

  1. sudo apt-get update
  2. sudo apt-get install nginx sendmail iptables-persistent

На мгновение остановите службу fail2ban, чтобы мы могли установить базовый брандмауэр без добавляемых им правил:

  1. sudo service fail2ban stop

Установите базовый брандмауэр

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

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

  1. sudo iptables -A INPUT -i lo -j ACCEPT
  2. sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
  3. sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  4. sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
  5. sudo iptables -A INPUT -j DROP

Эти команды будут реализовывать указанную выше политику. Мы можем увидеть наши текущие правила брандмауэра, набрав:

  1. sudo iptables -S
Output
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -j DROP

Вы можете сохранить брандмауэры, чтобы они пережили перезагрузку, набрав:

  1. sudo dpkg-reconfigure iptables-persistent

После этого вы можете перезапустить fail2ban, чтобы применить правила переноса:

  1. sudo service fail2ban start

Мы можем увидеть наши текущие правила брандмауэра, набрав:

  1. sudo iptables -S
Output
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -N fail2ban-ssh -A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -j DROP -A fail2ban-ssh -j RETURN

У нас есть политика по умолчанию для каждой из наших цепочек, а затем пять базовых правил, которые мы установили. Красным цветом у нас также есть структура по умолчанию, настроенная fail2ban, поскольку она уже реализует политики запрета SSH по умолчанию. Сначала они могут отображаться, а могут и не отображаться, поскольку иногда fail2ban не добавляет структуру до тех пор, пока не будет реализован первый бан.

Настройка конфигурации Fail2ban

Теперь нам нужно настроить fail2ban, используя нужные параметры. Откройте файл jail.local:

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

Здесь мы можем установить более строгое время бана. Найдите и раскомментируйте заголовок [DEFAULT]. Под заголовком по умолчанию измените настройку bantime, чтобы наш сервис банил клиентов на полчаса:

[DEFAULT]
. . .
bantime = 1800
. . .

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

[DEFAULT]
. . .
destemail = admin@example.com
. . .

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

Двигаясь вниз, нам нужно настроить параметр action на одно из действий, которое отправляет нам электронное письмо. Можно выбрать между action_mw, который устанавливает запрет, а затем отправляет нам по электронной почте отчет \whois о хосте-нарушителе, или action_mwl, который делает вышеперечисленное, но также отправляет по электронной почте соответствующие строки журнала.

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

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

Переходя к нашему разделу SSH, если мы хотим настроить количество неудачных попыток, которые должны быть разрешены до того, как будет установлен запрет, вы можете отредактировать запись maxretry. Если вы используете порт, отличный от \22, вам нужно соответствующим образом настроить параметр port. Как мы уже говорили, эта служба уже включена, поэтому нам не нужно изменять что.

Затем найдите раздел nginx-http-auth. Раскомментируйте заголовок и измените параметр enabled на \true.

. . .
[nginx-http-auth]

enabled = true
. . .

Это должно быть все, что вам нужно сделать в этом разделе, если только ваш веб-сервер не работает с нестандартными портами или если вы изменили путь журнала ошибок по умолчанию.

Перезапуск службы Fail2ban

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

Теперь запустите или перезапустите службу fail2ban. Иногда лучше полностью отключить службу, а затем запустить ее снова:

  1. sudo service fail2ban stop

Теперь мы можем перезапустить его, набрав:

  1. sudo service fail2ban start

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

  1. sudo iptables -S
Output
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -N fail2ban-nginx-http-auth -N fail2ban-ssh -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 INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -j DROP -A fail2ban-nginx-http-auth -j RETURN -A fail2ban-ssh -j RETURN

Красные линии — это те, которые были созданы нашими политиками fail2ban. Прямо сейчас они просто направляют трафик в новые, почти пустые цепочки, а затем позволяют трафику течь обратно в цепочку INPUT.

Однако именно в эти новые сети будут добавлены правила запрета.

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

С другого сервера, которому не нужно будет входить на ваш сервер fail2ban, мы можем проверить правила, заблокировав наш второй сервер.

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

  1. ssh blah@fail2ban_server_IP

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

На вашем сервере fail2ban вы можете увидеть новое правило, снова проверив наши iptables:

  1. sudo iptables -S
Output
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -N fail2ban-nginx-http-auth -N fail2ban-ssh -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 INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -j DROP -A fail2ban-nginx-http-auth -j RETURN -A fail2ban-ssh -s 203.0.113.14/32 -j REJECT --reject-with icmp-port-unreachable -A fail2ban-ssh -j RETURN

Как вы можете видеть в выделенной строке, у нас есть новое правило в нашей конфигурации, которое отклоняет трафик на порт SSH, поступающий с IP-адреса нашего второго сервера. Вы также должны были получить электронное письмо о блокировке настроенного вами аккаунта.

Заключение

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

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

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

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