Если мы включили 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
Рассмотрим значение некоторых из этих параметров.
Таким образом если мы хотим внести какие-либо изменения, такие как максимальное количество повторных попыток, время запрета, время поиска и т.д., нам следует отредактировать файл 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-сервере.