Защита ssh от брутфорса. Как защитить SSH подключение на Linux сервере

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

По умолчанию он включен на VPS и выделенных серверах большинства хостинг-провайдеров, так как с его помощью возможно легко и безопасно управлять удаленной машиной. К слову, на сервисе Велл-Веб можно недорого арендовать сервер VPS . Так как SSH поднят на всех VPS, Чтобы при использовании Secure Shell не возникло проблем, необходима правильная защита SSH.

Отключаем доступ от рута

В первую очередь рекомендуется деактивировать возможность удаленного подключения к машине под учетной записью суперпользователя (root). Для этого нужно найти файл sshd_config, который обычно (но не всегда) находится в каталоге /etc/ssh/, и открыть его.

В нем потребуется отыскать пункт PermitRootLogin и заменить его значение на "no", то есть должна получиться такая запись:

PermitRootLogin no

Естественно, это не предотвратит взлом, но все же несколько его затруднит.

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

Смена порта по умолчанию

Так как взлом сервера по SSH обычно происходит через перебор паролей (брутфорс), то рационально будет изменить стандартный 22-й порт на какой-нибудь другой. Сделать это очень легко. В первую очередь нужно открыть уже упомянутый файл sshd_config, и добавить там одну строчку:

Port номер_порта

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

Port 3048

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

Ограничение доступа по IP

Еще один способ защиты, который практически до нуля снизит вероятность несанкционированного подключения – это установка ограничений на авторизацию. SSH можно настроить таким способом, чтобы авторизоваться на сервере можно было только с удаленных машин с определенными IP-адресами. Для этого в файле sshd_config в строке AllowUser к имени каждого пользователя нужно дописать @номер_IP. Запись может иметь, например, такой вид:

AllowUsers [email protected], [email protected]

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

Безопасный пароль

Ну и конечно же стоит использовать стойкий к перебору пароль. Длинный и с как можно более разнообразными символами, желательно с кракозябрами. Это must have.

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

Конфигурационные файлы

  • /etc/ssh/sshd_config - файл конфигурации сервера OpenSSH;
  • /etc/ssh/ssh_config - файл конфигурации клиентской части OpenSSH;
  • ~/.ssh/ - директория, в которой хранятся пользовательские SSH настройки;
  • ~/.ssh/authorized_keys или ~/.ssh/authorized_keys - список ключей (RSA или DSA), которые используются для подключения к пользовательским аккаунтам;
  • /etc/nologin - если данный файл существует в системе, то sshd запретит подключаться всем пользователям кроме root в систему;
  • /etc/hosts.allow и /etc/hosts.deny - система запрета (часть безопасности). Работает по аналогии с ACL;
  • SSH порт по умолчанию - 22

Не нужен - выключай

Если вашему серверу не требуется удаленное подключение по SSH, то обязательно отключите его. В таких системах как CentOS/RHEL делается это так:

Chkconfig sshd off yum erase openssh-server

Используйте SSH второй версии

Протокол SSH первой версии имеет проблемы с безопасностью, которые закрыты во второй версии. Поэтому, используйте вторую версию. Убедитесь, что в файле /etc/ssh/sshd_config указана опция Protocol 2 .

Ограничивайте SSH доступ

По умолчанию, все системные пользователи имеют возможность подключаться к системе по SSH. Рекомендуем ограничить SSH доступ в целях безопасности. Например, разрешить SSH для пользователей root, merion и networks:

AllowUsers root merion networks

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

DenyUsers root merion networks

Время неактивности

Важно указывать время, в течение которого, неактивная сессия будет терминирована (завершена). Это можно сделать следующими опциями:

ClientAliveInterval 300 ClientAliveCountMax 0

В данной настройке мы указали время бездействия равным 300 секунд (5 минут).

Про файлы.rhosts

Дело в том, что данный файл содержит список хостов и пользователей. Если в данном файле содержится комбинация хоста и юзера, то данный пользователь сможет подключиться к системе по SSH без запроса пароля. Рекомендуем отключить эту «замечательную» фичу:

IgnoreRhosts yes

Никакой аутентификации на базе хоста!

Так называемая Host-Based Authentication позволяет пользователю с определенного хоста подключаться к серверу. Отключаем:

HostbasedAuthentication no

Прямое подключение через root

PermitRootLogin no

Сделайте баннер

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

22 порт только изнутри!

Сделайте доступ к 22 порту системы только через цепочку фаервол правил. Лучше всего, оставить доступ только изнутри LAN. Например, в Iptables можно дать доступ для 192.168.11.0/24:

A RH-Firewall-1-INPUT -s 192.168.11.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT

Где слушать

По умолчанию SSH слушает подключения на всех доступных интерфейсах. Мы рекомендуем сменить порт по умолчанию и указать IP – адрес, на котором необходимо ожидать подключения. Например, мы укажем порт 962 и IP – адрес 192.168.11.24

Port 962 ListenAddress 192.168.11.24

Криптостойкие пароли

Используйте устойчивые к защите пароли. В сети множество инструментов, которые сгенерируют криптостойкий пароль онлайн, бесплатно и без смс:)

Запретить пустые пароли

Бывают пользователи без паролей. Их доступ к SSH так же необходимо запретить с помощью опции:

Port 962 PermitEmptyPasswords no

Анализируйте логи

Установите логирование событий в режим INFO или DEBUG – это позволит иметь расширенный контроль над системой:

LogLevel INFO

Полезна ли Вам эта статья?

Пожалуйста, расскажите почему?

Нам жаль, что статья не была полезна для вас:(Пожалуйста, если не затруднит, укажите по какой причине? Мы будем очень благодарны за подробный ответ. Спасибо, что помогаете нам стать лучше!

Одной из распространённых атак на службу SSH является атака методом перебора, когда удалённый атакующий бесконечно пытается залогиниться с различными паролями. Конечно, есть аргументы против аутентификации с помощью паролей для SSH, и есть альтернативные механизмы аутентификации, такие существующие варианты как аутентификация с публичным клюём или двух-факторная аутентификация сведут на нет атаку брут-форсингом. Не в даваясь в дискуссию о преимуществах и недостатках различных методов аутентификации, давайте рассмотрим ситуацию, когда необходима аутентификация паролем. Как вы защитите ваш SSH сервер против атак грубой силой?

fail2ban - это хорошо известный, с открытым кодом фреймворк по предотвращению вторжений для Linux, он мониторит различные лог-файлы системы (например, /var/log/auth.log or /var/log/secure) и автоматически задействуют различные способы защиты против выявленных подозрительных действий. На самом деле, fail2ban может быть очень полезен для защиты против атак по перебору паролей на SSH сервер.

В этом уроке я продемонстрирую как установить и настроить fail2ban для защиты SSH сервера против атак брут-форсингом с удалённых IP адресов .

Установка Fail2ban на Linux

Для установки fail2ban на CentOS или RHEL, сначала, установите репозиторий EPEL, и затем выполните следующую команду.

Для установки fail2ban на Fedora, просто запустите:

$ sudo yum install fail2ban

Для установки fail2ban на Ubuntu, Debian или Linux Mint:

$ sudo apt-get install fail2ban

Настройка Fail2ban для SSH сервера

Сейчас вы готовы для конфигурирования fail2ban для усиления вашего SSH сервера. Вам нужно отредактировать конфигурационный файл в /etc/fail2ban/jail.conf. Конфигурационный файл содержит секцию “DEFAULT”, где вы определяете параметры по умолчанию для всех сервисов, которые мониторятся, и специфичные для каждого сервиса секции, где вы определяете любые специфичные для сервиса джэйлы (например SSH, Apache и т. д.) для перезаписи параметров по умолчанию.

В секции джейлов определённых сервисов (где-то после секции ) вам нужно задать секцию , где вы зададите особые настройки для джэйлов SSH. Текущий бан IP адресов делается iptables.

Последующий пример в /etc/fail2ban/jail.conf, который содержит настройку джэйла “ssh-iptables”. Конечно, там могут быть и другие джейлы для разных приложений, в зависимости от ваших нужд.

$ sudo vi /etc/fail2ban/jail.local # разделённый пробелами список IP адресов, CIDR префиксов или DNS имён хостов # для обхода защиты fail2ban ignoreip = 127.0.0.1 172.31.0.0/24 10.10.0.0/24 192.168.0.0/24 # количество секунд, на которое блокируется клиент bantime = 86400 # количество неудачных попыток, после которых происходит блокировка maxretry = 5 # количество секунд в течение которых накопительно фиксируются неудачные попытки findtime = 600 mta = sendmail enabled = true filter = sshd action = iptables sendmail-whois # для основанных на Debian дистрибутивов logpath = /var/log/auth.log # для основанных на Red Hat дистрибутивах logpath = /var/log/secure # специфичный для ssh порог максимальных попыток maxretry = 3

В соответствии с приведённой конфигурацией, fail2ban будет автоматически банить любые удалённые IP адреса, с которых поступило хотя бы 3 неудачных попытки за последние 10 минут. Однажды забаненный, IP нарушителя будет оставаться заблокированным в течение 24 часов. Уведомление об этом событии будет отправлено по почте.

После того, как конфигурационный файл готов, перезапустите службу fail2ban как показано ниже.

На Debian, Ubuntu или CentOS/RHEL 6:

$ sudo service fail2ban restart

На Fedora или CentOS/RHEL 7:

$ sudo systemctl restart fail2ban

Чтобы проверить, успешно ли запущен fail2ban, выполните команду fail2ban-client с аргументом “ping”. Если служба fail2ban запущена нормально, вы должны увидеть ответ “pong”.

$ sudo fail2ban-client ping Server replied: pong

Тестирование защиты с Fail2ban на SSH от атаки перебором паролей

Чтобы проверить, работает ли fail2ban, попробуйте войти на сервер SSH используя неверный пароль для симуляции брут-форс атаки. В то же время, проверяйте /var/log/fail2ban.log, который записывает все интересные события, которые происходят в fail2ban.

$ sudo tail -f /var/log/fail2ban.log

Согласно логу выше, fail2ban забанил IP адрес 192.168.1.8, поскольку выявил множественные ошибки в попытка залогиниться на SSH с этого IP адреса.

Проверка статуса Fail2ban и разблокировка заблокированных IP адресов

Джейл “ssh-iptables” в fail2ban использует iptables для блокировки IP адресов нарушителей, вы можете легко проверить бан, посмотрев текущие правила iptables как показано ниже.

$ sudo iptables --list -n Chain INPUT (policy ACCEPT) target prot opt source destination fail2ban-SSH tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain fail2ban-SSH (1 references) target prot opt source destination DROP all -- 192.168.1.8 0.0.0.0/0 RETURN all -- 0.0.0.0/0 0.0.0.0/0

Если вы хотите разблокировать IP адреса от fail2ban, вы можете также выполнить команду iptables:

$ sudo iptables -D fail2ban-SSH -s 192.168.1.8 -j DROP

В то время, как вы можете проверять и управлять списком заблокированных IP в fail2ban вручную с помощью команд iptables, как было показано, верным способом, на самом деле, является использование инструмента командной строки ail2ban-client. Этот инструмент позволяет вам управлять не только джэйлом “ssh-iptables”, но также любыми другими типами джэйлов fail2ban в унифицированным интерфейсе командной строки.

Для проверки статуса fail2ban (который покажет список активных в настоящее время джейлов):

$ sudo fail2ban-client status

Чтобы проверить статус конкретного джейла (например, ssh-iptables):

$ sudo fail2ban-client status ssh-iptables

Вышеприведённая команда покажет список забаненных IP адресов.

Для разблокировки конкретного IP адреса:

$ sudo fail2ban-client set ssh-iptables unbanip 192.168.1.8

Обратите внимание, если вы остановите fail2ban, все заблокированные IP адреса будут разблокированы. Когда вы перезапустите fail2ban, он найдёт список IP адресов нарушителей из /var/log/secure (или /var/log/auth.log) и перезабанит эти IP адреса, если не истекло время бана.

Установка Fail2ban на автозагрузку и включении

После того, как вы успешно протестировали fail2ban, последним шагов по задействованию fail2ban является автоматический запуск при включении питания сервера. На основанных на Debian дистрибутивах, автозапуск fail2ban включен по умолчанию. На основанных на Red Hat дистрибутивах, включите автостарт следующим способом.

На CentOS/RHEL 6:

$ sudo chkconfig fail2ban on

На Fedora или CentOS/RHEL 7:

$ sudo systemctl enable fail2ban

Итог

В этом уроке я продемонстрировал как установить и настроить fail2ban для защиты SSH сервера. Хотя fail2ban может смягчить атаку перебором паролей, пожалуйста помните, он не может защитить SSH сервера против сложных (распределённых) кампаний по брут-форсингу, когда атакующие обходят fail2ban используя тысячи подконтрольных ботам IP адресов.

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

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

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

Данное руководство поможет установить и настроить fail2ban на сервере Ubuntu 14.04.

Установка fail2ban

Репозиторий Ubuntu предоставляет пакет fail2ban, потому его можно установить с помощью стандартного пакетного менеджера.

Обновите индекс пакетов и установите fail2ban с помощью этих команд:

sudo apt-get update
sudo apt-get install fail2ban

Теперь можно приступать к настройке утилиты.

Конфигурации fail2ban

Конфигурационные файлы fail2ban хранятся в каталоге /etc/fail2ban. Стандартные параметры можно найти в файле jail.conf.

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

Скопируйте jail.conf и используйте его в качестве основы для файла jail.local. Для этого введите:

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

После этого просмотрите jail.conf:

sudo nano /etc/fail2ban/jail.conf

Некоторые параметры можно обновить в этом файле. Параметры раздела будут применяться ко всем сервисам, которые поддерживает fail2ban (если только эти значения не переопределяются в конфигурационных файлах этих сервисов).


. . .
ignoreip = 127.0.0.1/8
. . .

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


. . .
bantime = 600
. . .

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


. . .
findtime = 600
maxretry = 3
. . .

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

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


. . .
destemail = root@localhost
sendername = Fail2Ban
mta = sendmail
. . .

Параметры destemail, sendername и mta позволяют настроить оповещения по электронной почте. Параметр destemail определяет адрес электронной почты, который должен получать сообщения о заблокированных пользователях. Параметр sendername задает отправителя сообщения. Параметр mta определяет, какая почтовый сервис будет использоваться для отправки почты. Добавьте эти параметры в jail.local в раздел и установите соответствующие значения.


. . .
action = $(action_)s
. . .

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

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

Индивидуальные параметры

Поддержка отдельных сервисов включается в специальных одноименных разделах. Например, параметры сервиса ssh можно указать в разделе .

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


. . .
enabled = true
. . .

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

Эти разделы используют в качестве основы значения, установленные в разделе , и по мере необходимости корректируют их. Чтобы переопределить любые значения, добавьте раздел для соответствующего сервиса в jail.local и измените его значения.

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

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

Просмотреть фильтры можно в этом каталоге:

ls /etc/fail2ban/filter.d

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

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

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

. . .
enabled = true
. . .

После этого нужно перезапустить fail2ban.

Настройка fail2ban

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

Для начала установите необходимое ПО.

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

sudo apt-get update
sudo apt-get install nginx sendmail iptables-persistent

Остановите сервис fail2ban, чтобы настроить базовый брандмауэр.

Настройка брандмауэра

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

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

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

sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT




-A INPUT -j DROP

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

sudo dpkg-reconfigure iptables-persistent

Перезапустите fail2ban:

sudo service fail2ban start

Запросите правила брандмауэра:

sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N 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:

sudo nano /etc/fail2ban/jail.local

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


. . .
bantime = 1800
. . .

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


. . .
destemail = [email protected]
. . .

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

Затем нужно исправить значение action. Можно установить значение action_mw, которое блокирует клиента, а затем отправляет отчет «whois». Значение action_mwl делает то же самое, но также отправляет в сообщении соответствующие строки лога.


. . .
action = %(action_mwl)s
. . .

В разделе SSH в директиве maxretry можно изменить количество неудачных попыток аутентификации. Если вы используете нестандартный порт (не 22), укажите его в параметре port. Как говорилось ранее, этот сервер уже включен.

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

. . .

enabled = true
. . .

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

Перезапуск fail2ban

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

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

sudo service fail2ban stop
sudo service fail2ban start

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

sudo iptables -S
-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-подключение к серверу с помощью несуществующих учетных данных:

ssh blah@fail2ban_server_IP

Введите случайный набор символов в качестве пароля. Повторите несколько раз. В какой-то момент fail2ban запретит доступ и выведет сообщение «Permission denied».

Вернитесь на первый сервер и просмотрите новые правила iptables:

sudo iptables -S
-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

Новое правило выделено красным. Оно блокирует трафик от IP-адреса второго сервера к порту SSH. Вскоре вы получите уведомление о блокировке клиента.

Заключение

Теперь вы знакомы с основами fail2ban и можете создать базовую конфигурацию этого инструмента.

Стоит «засветиться» сервису в общедоступной сети, как мгновенной он становится объектом для атаки. Одна из проблем – попытка получения доступа с помощью перебора паролей (брутфорса). И SSH в данном случае не исключение.

Анализ файла логов аутентификации /var/log/auth.log или аналогов показывает, что попытка подбора пароля обычно производится сразу с нескольких IP и растянута по времени.

Защита от Брутфорса SSH

Защититься от этого можно по-разному:

  • Используя возможности настройки демона SSH
  • Пакетный фильтр
  • Специальные приложения
  • Port knocking

Самый простой и действенный способ – это изменить 22-й порт, используемый по умолчанию, например, на 2002-й, если это не мешает другим задачам. Вносим запись в /etc/ssh/sshd_config:

После этого попытки подбора паролей практически прекращаются. Бывают случаи, когда изменить порт нельзя. Как вариант, можно ограничить доступ по SSH определенным пользователям (в частности, root) или группе. В sshd_config за это отвечает ряд параметров: AllowUsers, AllowGroups, DenyUsers и DenyGroups. Удобно, что с логином можно указать IP или подсеть. Например, разрешим доступ пользователю admin и user, последнему только с одного IP:

Еще один действенный вариант защиты от перебора – использование для аутентификации сертификатов. Причем с помощью специального параметра match можно создать условный блок, в котором переопределить параметры глобальной секции. Например, запретим вход по SSH по паролю для пользователя root, разрешив всем остальным:

# всем разрешаем доступ по паролю
PasswordAuthentication yes
# root будет использовать только сертификат
match user root
PasswordAuthentication no
KbdInteractiveAuthentication no

Используя TCP Wrapper, также можем ограничить доступ к любому сервису только с определенных IP, для этого следует лишь прописать в файл /etc/hosts.allow или /etc/hosts.deny нужное правило. Разрешим в /etc/hosts.allow доступ только с нужной подсети:

sshd: 192.168.1.0/24: allow

Или в /etc/hosts.deny:

sshd: ALL: deny
sshd: ALL EXCEPT 192.168.1.0/24: allow

Пакетный фильтр позволяет очень точно задавать параметры соединений, отбрасывая ненужные пакеты. С его помощью легко ограничить доступ к 22-му порту только определенным адресам. Простой пример:

iptables -A INPUT -s !192.168.0.1 -p tcp -m tcp --dport 22 ↵
-j REJECT -reject-with icmp-port-unreachable

Фильтрация пакетов по портам и IP-адресам не очень эффективна, если Aдмин не привязан к рабочему месту. В этом случае помогут специальные утилиты: Fail2ban , Sshguard . Fail2ban изначально разрабатывался для защиты SSH. Хотя сегодня это уже фреймворк, который можно легко настроить под любые приложения. Принцип работы очень прост. Демон периодически проверяет журналы на наличие записей о любых подозрительных действиях. Затем подозрительный IP-адрес блокируется средствами iptables или TCP Wrapper. Через указанное в настройках время блокировка обычно снимается, чтобы случайно не заблокировать легальный узел. При срабатывании правила записывается событие в журнал /var/log/fail2ban.log, и может быть отправлен email.

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

В Ubuntu и Debian устанавливается командой:

$ sudo apt-get install fail2ban

Все настройки производятся в нескольких файлах, размещенных в каталоге /etc/fail2ban. В fail2ban.conf хранятся параметры запуска самого демона, в jail.conf описываются контролируемые сервисы (внутри секции SSH).

Enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 3

Фильтры и действия прописываются в файлах, размещенных в подкаталогах filter.d и action.d. По умолчанию все файлы имеют расширение.conf, их лучше не трогать (в т.ч. и jail.conf). Все изменения следует заносить в файл с расширением.local (например, jail.local), параметры которого замещают установки из первого, а при обновлении не будут потеряны. Для проверки работы фильтра можно использовать утилиту fail2ban-regex.