SSH является де-факто методом подключения к облачному серверу. Он долговечен и расширяем - по мере разработки новых стандартов шифрования они могут использоваться для генерации новых ключей SSH, обеспечивая безопасность основного протокола. Однако ни один протокол или программный стек не является абсолютно надежным, и то, что SSH так широко распространен в Интернете, означает, что он представляет собой очень предсказуемую поверхность атаки или вектор атаки, через который люди могут попытаться получить доступ.
Любая служба, открытая для доступа в сеть, является потенциальной целью. Если вы просмотрите журналы регистрации службы SSH, работающей на любом широко посещаемом сервере, вы часто увидите повторяющиеся, систематические попытки входа в систему, которые представляют собой атаки методом грубой силы как со стороны пользователей, так и со стороны ботов. Хотя вы можете внести некоторые оптимизации в службу SSH, чтобы снизить вероятность успеха таких атак практически до нуля, например, отключить аутентификацию паролей в пользу ключей SSH, они все равно могут представлять собой незначительную постоянную угрозу.
Крупномасштабные производственные развертывания, для которых такая опасность совершенно неприемлема, обычно применяют VPN, такие как WireGuard, перед своей службой SSH, чтобы невозможно было напрямую подключиться к стандартному порту SSH 22 из внешнего интернета без дополнительных программных абстракций или шлюзов. Эти VPN-решения пользуются широким доверием, но добавляют сложности и могут нарушить работу некоторых автоматизаций или других небольших программных крючков.
До или в дополнение к полной настройке VPN, вы можете применить инструмент под названием Fail2ban. Fail2ban может значительно смягчить атаки грубой силы путем создания правил, которые автоматически изменяют конфигурацию брандмауэра, запрещая определенные IP-адреса после определенного количества неудачных попыток входа. Это позволит вашему серверу защититься от таких попыток доступа без вашего вмешательства.
Установка Fail2ban
Fail2ban доступен в репозиториях программного обеспечения Debian. Начните с выполнения следующих команд от имени пользователя без права root, чтобы обновить списки пакетов и установить Fail2ban:
1 2 | sudo apt update sudo apt install fail2ban |
После установки Fail2ban автоматически создаст фоновую службу. Вы можете проверить его статус с помощью команды systemctl:
1 | systemctl status fail2ban.service |
Вы можете продолжать использовать Fail2ban с настройками по умолчанию, но сначала рассмотрим некоторые его возможности.
Конфигурирование Fail2ban
Служба fail2ban хранит свои конфигурационные файлы в каталоге /etc/fail2ban. Там есть файл с настройками по умолчанию под названием jail.conf. Перейдите в этот каталог и распечатайте первые 20 строк этого файла с помощью команды head -20:
1 | cd /etc/fail2ban |
1 | head -20 jail.conf |
Как вы увидите, первые несколько строк этого файла закомментированы - они начинаются с символов #, указывающих на то, что их следует читать как документацию, а не как настройки. Как вы также увидите, эти комментарии указывают вам не изменять этот файл напрямую. Вместо этого у вас есть два варианта: либо создать отдельные профили для Fail2ban в нескольких файлах в каталоге jail.d/, либо создать и собрать все ваши локальные настройки в файле jail.local. Файл jail.conf будет периодически обновляться по мере обновления самого Fail2ban и будет использоваться как источник настроек по умолчанию, для которых вы не создали никаких переопределений.
В этом руководстве вы создадите jail.local. Это можно сделать, скопировав файл jail.conf:
1 | sudo cp jail.conf jail.local |
Теперь вы можете начать вносить изменения в конфигурацию. Откройте файл в nano или вашем любимом текстовом редакторе:
1 | sudo nano jail.local |
Пока вы листаете файл, в этом руководстве будут рассмотрены некоторые параметры, которые вы, возможно, захотите обновить. Настройки, расположенные в разделе [DEFAULT] в верхней части файла, будут применяться ко всем службам, поддерживаемым Fail2ban. В других местах файла есть заголовки для [sshd] и для других служб, которые содержат специфические для каждой службы настройки, которые будут применяться поверх настроек по умолчанию.
1 2 3 4 | [DEFAULT] . . . bantime = 10m . . . |
Параметр bantime устанавливает время, в течение которого клиент будет запрещен, если он не смог правильно пройти аутентификацию. Это время измеряется в секундах. По умолчанию этот параметр установлен на 10 минут.
1 2 3 4 5 | [DEFAULT] . . . findtime = 10m maxretry = 5 . . . |
Следующие два параметра - findtime и maxretry. Они работают вместе, чтобы установить условия, при которых клиент считается нелегитимным пользователем и должен быть запрещен.
Переменная maxretry устанавливает количество попыток аутентификации клиента в течение времени, определенного параметром findtime, прежде чем он будет запрещен. При настройках по умолчанию служба fail2ban запретит клиента, который безуспешно пытается войти в систему 5 раз в течение 10 минут.
1 2 3 4 5 6 | [DEFAULT] . . . destemail = root@localhost sender = root@<fq-hostname> mta = sendmail . . . |
Если вам нужно получать оповещения по электронной почте, когда Fail2ban принимает меры, вам следует оценить параметры destemail, sendername и mta. Параметр destemail задает адрес электронной почты, на который должны приходить сообщения о запрете. Имя отправителя задает значение поля "От" в электронном письме. Параметр mta определяет, какая почтовая служба будет использоваться для отправки почты. По умолчанию это sendmail, но вы можете использовать Postfix или другое почтовое решение.
/etc/fail2ban/jail.local
1 2 3 4 | [DEFAULT] . . . action = $(action_)s . . . |
Этот параметр настраивает действие, которое Fail2ban предпринимает, когда хочет ввести запрет. Значение action_ определено в файле непосредственно перед этим параметром. Действие по умолчанию заключается в обновлении конфигурации брандмауэра, чтобы отклонить трафик от хоста-нарушителя до истечения времени запрета.
Существуют и другие сценарии action_, предоставляемые по умолчанию, которыми вы можете заменить $(action_) выше:
1 2 3 | # запретить и отправить письмо с отчетом whois на destemail. action_mw = %(action_)s %(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"] |
1 2 3 4 | # запретить и отправить электронное письмо с отчетом whois и соответствующими строками журнала. # на адрес destemail. action_mwl = %(action_)s %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"] |
1 2 3 4 | # запретить и отправить письмо xarf по адресу IP-адреса злоумышленника и включить соответствующие строки журнала. # в письмо. action_xarf = %(action_)s xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"] |
1 2 3 4 | # запретить IP на CloudFlare и отправить электронное письмо с отчетом whois и соответствующими строками журнала. # на адрес destemail. action_cf_mwl = cloudflare[cfuser="%(cfemail)s", cftoken="%(cfapikey)s"] %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"] |
Например, action_mw предпринимает действия и отправляет письмо, action_mwl предпринимает действия, отправляет письмо и включает ведение журнала, а action_cf_mwl делает все вышеперечисленное в дополнение к отправке обновления в API Cloudflare, связанный с вашей учетной записью, чтобы запретить нарушителя и там...
Индивидуальные настройки ловушки
Далее следует часть конфигурационного файла, в которой рассматриваются отдельные службы. Они указываются заголовками секций, например [sshd].
Каждый из этих разделов должен быть включен отдельно, добавив строку enabled = true под заголовком с другими настройками.
1 2 3 4 | [jail_to_enable] . . . enabled = true . . . |
По умолчанию служба SSH включена, а все остальные отключены. . Некоторые другие параметры, которые устанавливаются здесь, это фильтр, который будет использоваться для решения вопроса о том, указывает ли строка в журнале на неудачную аутентификацию, и logpath, который указывает fail2ban, где находятся журналы для данной службы.
Значение фильтра фактически является ссылкой на файл, расположенный в каталоге /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. Вам просто нужно добавить параметр enabled:
1 2 3 4 5 | . . . [nginx-http-auth] enabled = true . . . |
Когда вы закончите редактирование, сохраните и закройте файл. Если вы внесли какие-либо изменения, вы можете перезапустить службу Fail2ban с помощью systemctl:
1 | sudo systemctl restart fail2ban |
В следующем шаге вы продемонстрируете работу Fail2ban в действии.
Тестирование политики запрета (необязательно)
С другого сервера, который в будущем не будет нуждаться во входе на ваш сервер Fail2ban, вы можете протестировать правила, запретив этот второй сервер. После входа на второй сервер попробуйте подключиться по SSH к серверу Fail2ban. Вы можете попытаться подключиться, используя несуществующее имя:
1 | ssh blah@[ваш_сервер] |
Введите случайные символы в подсказку пароля. Повторите это несколько раз. В какой-то момент ошибка, которую вы получаете, должна измениться с Permission denied на Connection refused. Это означает, что ваш второй сервер был запрещен на сервере Fail2ban.
На вашем сервере Fail2ban вы можете увидеть новое правило, проверив вывод iptables. iptables - это команда для взаимодействия с низкоуровневыми правилами портов и брандмауэра на вашем сервере. Если вы следовали руководству DigitalOcean по начальной настройке сервера, вы будете использовать ufw для управления правилами брандмауэра на более высоком уровне. Запуск iptables -S покажет вам все правила брандмауэра, которые уже созданы ufw:
1 | sudo iptables -S |
Вывод
1 2 3 4 5 6 7 8 9 | sudo iptables -S -P INPUT DROP -P FORWARD DROP -P OUTPUT ACCEPT -N ufw-before-logging-input -N ufw-before-logging-output -N ufw-before-logging-forward -N ufw-before-input ... |
Если вы передадите вывод iptables -S в grep для поиска в этих правилах строки f2b, вы увидите правила, которые были добавлены fail2ban:
1 | sudo iptables -S | grep f2b |
Вывод
1 2 3 4 5 | sudo iptables -S | grep f2b -N f2b-sshd -A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd -A f2b-sshd -s 2.48.16.101/32 -j REJECT --reject-with icmp-port-unreachable -A f2b-sshd -j RETURN |
Строка, содержащая REJECT --reject-with icmp-port-unreachable, будет добавлена Fail2ban и должна отражать IP-адрес вашего второго сервера.
Заключение
Теперь вы должны быть в состоянии настроить некоторые политики запрета для ваших служб. Fail2ban - это полезный способ защиты любой службы, использующей аутентификацию.