Защищаем свой сервер Linux с помощью Fail2Ban [Руководство для начинающих]

Если мы включили SSH, проверим историю входа на наш сервер Linux. Мы увидим огромное количество IP-адресов с которых пытаются войти на наш сервер через SSH.

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

Вот тут-то и пригодится такой инструмент, как Fail2Ban. Fail2Ban - это бесплатное программное обеспечение с открытым исходным кодом, которое помогает защитить наш сервер Linux от несанкционированного входа в систему. Fail2Ban заблокирует IP (на определенное время), если существует определенное количество неудачных попыток входа в систему.

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

Заинтригованы? Почему бы не испытать Fail2Ban?

О популярности Fail2Ban можно судить по тому, что он доступен в официальных репозиториях всех основных дистрибутивов Linux. Это делает установку Fail2Ban простой задачей.

Убеждаемся, что наша система обновлена и у нас установлен репозиторий EPEL.

$ sudo yum update && sudo yum install epel-release

Теперь можем установить Fail2Ban с помощью следующей команды:

$ sudo yum install fail2ban

Сначала убеждаемся, что наша система обновлена:

$ sudo apt update && sudo apt upgrade -y

Теперь устанавливаем Fail2Ban с помощью команды:

$ sudo apt install fail2ban

В Fail2Ban есть два основных файла конфигурации: /etc/fail2ban/fail2ban.conf и /etc/fail2ban/jail.conf. Разберемся для чего они.

/etc/fail2ban/fail2ban.conf: это файл конфигурации для рабочих настроек демона Fail2Ban. Здесь определяются настройки, такие как loglevel, log file, socket и pid file.

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

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

Теперь разберемся с файлом jail.conf. Если мы используем команду less для чтения этого большого файла, все покажется довольно запутанным. В файле .conf все объясняется слишком большим количеством комментариев. Итак, давайте упростим.

Файл jail.conf делится на сервисы. Существует раздел [Default], и он применяется ко всем сервисам. В данном файле можно увидеть различные сервисы с соответствующими настройками (если таковые имеются). Все эти сервисы обозначаются квадратными скобками. Вы увидите такие разделы, как [sshd], [apache-auth], [squid] и т.д.

Если удалим комментарии, то раздел по умолчанию будет выглядеть так:

[DEFAULT]
ignorecommand =
bantime = 10m
findtime = 10m
maxretry = 5
backend = auto
usedns = warn
logencoding = auto
enabled = false
mode = normal
filter = %(name)s[mode=%(mode)s]
destemail = root@localhost
sender = root@
mta = sendmail
protocol = tcp
chain =
port = 0:65535
fail2ban_agent = Fail2Ban/%(fail2ban_version)s
banaction = iptables-multiport
banaction_allports = iptables-allports
action_abuseipdb = abuseipdb
action = %(action_)s

Рассмотрим значение некоторых из этих параметров.

  • bantime: установка продолжительности бана. По умолчанию 10 минут.
  • findtime: временное окно, в котором выполняются действие по IP. По умолчанию 10 минут. Предположим, что в 10:30 с определенного IP была предпринята попытка неудачного входа в систему. Если один и тот же IP достигнет максимального количества попыток до 10:40, он будет заблокирован. В противном случае следующая неудачная попытка после 10:40 будет считаться первой неудачной попыткой.
  • maxretry: количество неудачных попыток перед выполнением действия
  • usedns: Параметр «warn» пытается использовать обратный DNS для поиска имени хоста и запретить его с помощью имени хоста. Установка в no запретит IP, а не имя хоста.
  • destemail: адрес электронной почты, на который будут отправляться оповещения (необходимо настроить)
  • sender: имя отправителя в уведомлении по электронной почте
  • mta: агент передачи почты, используемый для уведомлений по электронной почте
  • banaction: этот параметр использует файл /etc/fail2ban/action.d/iptables-multiport.conf, чтобы установить действие после максимального числа неудачных попыток
  • protocol: тип трафика, который будет отброшен после бана

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

Рассмотрим некоторые способы использования Fail2Ban для усиления безопасности Linux.

Используем команды systemd для запуска и включения Fail2Ban на нашем Linux-сервере:

# systemctl start fail2ban
# systemctl enable fail2ban

Как только Fail2Ban включится, можно будет увидеть статус и активные джейлы с помощью команды fail2ban-client:

root@test-server:~# fail2ban-client status
Status
|- Number of jail: 1
`- Jail list: sshd

Джайл sshd включен по умолчанию.

Журнал Fail2Ban находится по адресу /var/log/fail2ban.log. Файлы журнала имеют следующий формат:

2019-03-25 07:09:08,004 fail2ban.filter [25630]: INFO [sshd] Found 139.59.69.76 – 2019-03-25 07:09:07
2019-03-25 07:09:36,756 fail2ban.filter [25630]: INFO [sshd] Found 159.89.205.213 – 2019-03-25 07:09:36
2019-03-25 07:09:36,757 fail2ban.filter [25630]: INFO [sshd] Found 159.89.205.213 – 2019-03-25 07:09:36
2019-03-25 07:09:36,774 fail2ban.actions [25630]: NOTICE [sshd] Ban 159.89.205.213
2019-03-25 07:09:36,956 fail2ban.filter [25630]: INFO [sshd] Found 182.70.253.202 – 2019-03-25 07:09:36
2019-03-25 07:09:36,957 fail2ban.filter [25630]: INFO [sshd] Found 182.70.253.202 – 2019-03-25 07:09:36
2019-03-25 07:09:36,981 fail2ban.actions [25630]: NOTICE [sshd] Ban 182.70.253.202
2019-03-25 07:09:37,247 fail2ban.filter [25630]: INFO [sshd] Found 112.64.214.90 – 2019-03-25 07:09:37
2019-03-25 07:09:37,248 fail2ban.filter [25630]: INFO [sshd] Found 112.64.214.90 – 2019-03-25 07:09:37
2019-03-25 07:09:37,589 fail2ban.actions [25630]: NOTICE [sshd] Ban 112.64.214.90

В этом примере можно увидеть, что Fail2Ban идентифицирует IP-адреса и запрещает их, когда они пересекают порог максимальной повторной попытки.

Одним из способов просмотра является проверка статуса определенного джейла. Для этой цели используется клиент Fail2Ban.

# fail2ban-client status <jail_name>

Например, если нужно увидеть все неудачные подключения по ssh, запрещенные Fail2Ban, можно использовать данный вариант. В выходных данных будет отображено общее количество неудачных попыток и общее количество заблокированных IP-адресов.

root@test-server:~# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 14
| |- Total failed: 715
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 7
|- Total banned: 17
`- Banned IP list: 177.47.115.67 118.130.133.110 68.183.62.73 202.65.154.110 106.12.102.114 61.184.247.3 218.92.1.150

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

ssh: connect to host 93.233.73.133 port 22: Connection refused

К этому моменту мы знаем, что запрет Fail2Ban на IP является временным. По умолчанию это 10 минут, и злоумышленник может попытаться снова войти в систему через 10 минут.

Это создает угрозу безопасности, поскольку злоумышленники могут использовать сценарий, который пытается войти в систему через интервал в 10 минут.

Итак, как ставить постоянный бан с использованием Fail2Ban? На это нет четкого ответа.

Начиная с версии 0.11 Fail2Ban время запрета будет рассчитываться автоматически, а для постоянных IP-адресов время запрета будет увеличиваться в геометрической прогрессии.

Но если проверить версию Fail2Ban, то, в лучшем случае, используется версия 0.10.

root@test-server:~# fail2ban-server --version 
 Fail2Ban v0.10.2
 Copyright (c) 2004-2008 Cyril Jaquier, 2008- Fail2Ban Contributors
 Copyright of modifications held by their respective authors.
 Licensed under the GNU General Public License v2 (GPL).

В более ранних версиях можно было использовать отрицательное время запрета (bantime = -1), и это было бы эквивалентно постоянному бану, но если мы попробуете этот метод сейчас, то, вероятно, увидим ошибку типа ‘Starting fail2ban: ERROR NOK: (‘database disk image is malformed’,)’.

Есть обходной путь - увеличить время запрета до 1 дня, 1 недели, 1 месяца или 1 года. Это поможет временно обойти проблему, пока в не появится новая версия утилиты.

Сначала проверим, заблокирован ли IP или нет. Так как Fail2Ban работает на iptables, вы можете просмотреть iptables для просмотра IP-адресов, запрещенных вашим сервером:

# iptables -n -L

Если заблокировано слишком много IP-адресов, можно использовать команду grep.

Если в списке обнаружится IP-адрес в выводе, значит он заблокирован.

Итак, следующий шаг - найти, какой джейл запрещает указанный IP. Можно использовать команду grep с журналами fail2ban.

Как можно увидеть из примера ниже, IP-адрес забанен sshd джейлом.

root@test-server:~# grep -E ‘Ban.*61.184.247.3’ /var/log/fail2ban.log
2019-03-14 13:09:25,029 fail2ban.actions [25630]: NOTICE [sshd] Ban 61.184.247.3
2019-03-14 13:52:56,745 fail2ban.actions [25630]: NOTICE [sshd] Ban 61.184.247.3

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

# fail2ban-client set <jail_name> unbanip <ip_address> 

Будет не очень хорошо, если мы случайно забаним себя. Чтобы игнорировать запрет IP-адреса текущим сеансом Fail2Ban, мы можем внести в белый список IP-адрес, используя следующую команду:

# fail2ban-client set <JAIL_NAME> addignoreip <IP_Address>

Пример

root@test-server:~# fail2ban-client set sshd addignoreip 203.93.83.113
These IP addresses/networks are ignored:
`- 203.93.83.113

Если необходимо навсегда внести наш IP в белый список, следует отредактировать файл конфигурации джейла. Перейдем в указанный раздел jail и добавим строку ignoreip следующим образом:

ignoreip = 127.0.0.1/8 <IP_В_БЕЛЫЙ_СПИСОК>

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

После необходимо перезапустить Fail2Ban, чтобы изменения вступили в силу.

Можно увидеть все IP-адреса из белого списка с помощью команды:

# fail2ban-client get <JAIL_NAME> ignoreip

Команда должна показать все IP-адреса, игнорируемые Fail2Ban для данного джейла:

root@test-server:~# fail2ban-client get sshd ignoreip
These IP addresses/networks are ignored:
|- 127.0.0.0/8
|- ::1
`- 203.93.83.113

Если необходимо удалить IP-адрес из белого списка определенного джейла, можно использовать следующую команду:

# fail2ban-client set <JAIL_NAME> delignoreip <IP_Address>

Для удаления постоянно игнорируемого IP, следует отредактировать файл /etc/fail2ban/jail.local.

Можно сделать намного больше вещей с Fail2Ban. Эта статья дает только основы для начала работы с Fail2Ban. Здесь не затрагивются такие темы, как действия, почтовые уведомления, фильтры и т.д.

Как только вы изучите основы Fail2Ban, вы можете начать изучать его подробнее. Пока просто поиграйте с ним и добавьте дополнительный уровень безопасности на вашем Linux-сервере.

Источник