- Защита SSH от подбора пароля. Fail2ban
- Установка
- Конфигурационный файл Fail2ban
- Настройка защиты SSH
- Проверка
- Как защитить SSH сервер от атаки методом перебора (грубой силой — брут-форсинга) используя fail2ban
- Установка Fail2ban на Linux
- Для установки fail2ban на CentOS или RHEL, сначала, установите репозиторий EPEL, и затем выполните следующую команду.
- Для установки fail2ban на Fedora, просто запустите:
- Для установки fail2ban на Ubuntu, Debian или Linux Mint:
- Настройка Fail2ban для SSH сервера
- Тестирование защиты с Fail2ban на SSH от атаки перебором паролей
- Проверка статуса Fail2ban и разблокировка заблокированных IP адресов
- Установка Fail2ban на автозагрузку и включении
- Защищаем SSH от брутфорса на любом порту
Защита SSH от подбора пароля. Fail2ban
Для защиты вашего сервера от брутфорс-атак (взломов путем перебора паролей) лучше всего настроить и использовать авторизацию по ключу вместо авторизации по паролю.
Другим способом защиты может быть использование утилиты Fail2ban. Fail2ban анализирует логи служб, работающих на сервере, и при обнаружении подозрительной активности блокирует IP-адреса возможных злоумышленников. Fail2ban может использоваться для защиты Apache, FTP, dovecot и многих других сервисов.
В рамках этой статьи мы рассмотрим базовую настройку Fail2ban для защиты службы SSH от подбора пароля.
Установка
Для установки Fail2ban на Ubuntu/Debian выполните:
Для установки на CentOS:
Добавьте Fail2ban в автозагрузку:
На Ubuntu защита для SSH начнет работать сразу после установки. По умолчанию Fail2ban будет на 10 минут блокировать IP-адреса, с которых в течение 10 минут было выполнено 5 неудачных попыток авторизации.
Эти и другие параметры работы утилиты можно изменить в ее настройках.
Конфигурационный файл Fail2ban
Настройки Fail2ban хранятся в конфигурационном файле /etc/fail2ban/jail.conf .
Настройки разделены по секциям. В [DEFAULT] указываются общие параметры, которые определяют работу Fail2ban в целом и применяются для большинства служб. Специфические настройки для той или иной службы прописываются внутри соответствующей секции (например, [sshd] , [apache-auth] , [vsftpd] ).
Менять какие-либо параметры напрямую в файле jail.conf не рекомендуется. Вместо этого необходимо создать новый файл jail.local , разместив его в той же директории.
Можно либо сделать копию оригинального файла (может быть удобно, если вы планируете настроить Fail2ban для защиты нескольких служб, не только SSH):
Либо создать пустой файл с таким именем и внести нужные параметры в него:
В новом файле будет достаточно указать только те настройки, значения которых вы хотите изменить: для всех параметров, которые вы не пропишете отдельно, Fail2ban будет применять значения по умолчанию.
Настройка защиты SSH
Откройте файл jail.local для редактирования:
Пример настроек, которые можно добавить в файл:
Такая настройка означает, что если с какого-либо IP-адреса, за исключением указанного в ignoreip , в течение 2 минут будут выполнены 3 неудачные попытки авторизоваться, Fail2ban заблокирует этот адрес на 12 часов.
В секции DEFAULT могут быть указаны такие параметры, как период блокировки ( bantime ), количество попыток ( maxretry ) и пр., но в рамках данной инструкции мы пропишем большинство настроек в отдельной секции для SSH, а в раздел DEFAULT включим только параметр ignoreip :
- ignoreip — это «белый список» IP-адресов, то есть те адреса, которые не будут заблокированы при неудачных попытках подключения. Здесь можно прописать ваш собственный IP (если он статический, а не динамический), с которого вы подключаетесь к серверу. Можно указать несколько адресов через пробел или маску подсети.
Если вам не требуется белый список, строку можно просто закомментировать, указав перед ней #.
В секции [sshd] указываются настройки для работы Fail2ban с конкретной службой — SSH. В зависимости от системы, секция может называться [sshd], [ssh] или [ssh-iptables] (можно проверить в файле jail.conf ).
Как упоминалось выше, при отсутствии того или иного параметра в этом файле, Fail2ban будет использовать значения по умолчанию. Соответственно, указать требуется только те настройки, значения которых нужно изменить.
Здесь мы прописали параметры:
- enabled — обязательный параметр, определяющий включение или отключение секции. Для включения должно быть установлено значение true , оно указано по умолчанию. Обратите внимание, что в CentOS этот параметр по умолчанию закомментирован. Если вы работаете с копией основного файла jail.conf , не забудьте раскомментировать эту строку (убрать #), чтобы активировать секцию;
- bantime — продолжительность бана в секундах, то есть период, на который подозрительный IP-адрес будет заблокирован;
- maxretry — количество неудачных попыток в течение периода findtime , после которых будет выполнена блокировка;
- findtime — период в секундах, в течение которого действие (в данном случае — неудачная попытка подключения) должно повториться определенное количество раз ( maxretry ), после чего будет выполнена блокировка.
Дополнительно могут быть настроены и другие параметры, например:
- port — порт, используемый службой, в данном случае SSH. Если SSH у вас работает на нестандартном порту (то есть не 22), пропишите его здесь. Если порт стандартный, указывать эту настройку необязательно.
- logpath — путь к файлу лога, который анализирует Fail2ban. По умолчанию это стандартный путь к логу sshd.
- action — выполняемое действие при блокировке IP. По умолчанию выполняется блок подозрительного IP путем изменения правил iptables .
Чтобы заблокировать все порты для этого IP, можно использовать: action = iptables-allports .
Если на сервере настроен firewalld или ufw , то для фильтрации с их помощью нужно указать соответствующее значение для action: firewallcmd-ipset и ufw , соответственно.
Полный список действий доступен в /etc/fail2ban/action.d .
После сохранения изменений перезапустите Fail2ban:
Проверка
После настройки Fail2ban имеет смысл проверить его работу. Лучше делать это не сразу, а спустя пару часов после сохранения настроек, тогда результат будет более наглядным.
Просмотреть заблокированные IP-адреса можно в iptables:
Также, можно вывести логи работы Fail2ban:
Информацию можно получить и из интерфейса Fail2ban:
Источник
Как защитить SSH сервер от атаки методом перебора (грубой силой — брут-форсинга) используя fail2ban
Одной из распространённых атак на службу 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, просто запустите:
Для установки fail2ban на Ubuntu, Debian или Linux Mint:
Настройка Fail2ban для SSH сервера
Сейчас вы готовы для конфигурирования fail2ban для усиления вашего SSH сервера. Вам нужно отредактировать конфигурационный файл в /etc/fail2ban/jail.conf. Конфигурационный файл содержит секцию «DEFAULT», где вы определяете параметры по умолчанию для всех сервисов, которые мониторятся, и специфичные для каждого сервиса секции, где вы определяете любые специфичные для сервиса джэйлы (например SSH, Apache и т. д.) для перезаписи параметров по умолчанию.
В секции джейлов определённых сервисов (где-то после секции [DEFAULT]) вам нужно задать секцию [ssh-iptables], где вы зададите особые настройки для джэйлов SSH. Текущий бан IP адресов делается iptables.
Последующий пример в /etc/fail2ban/jail.conf, который содержит настройку джэйла «ssh-iptables». Конечно, там могут быть и другие джейлы для разных приложений, в зависимости от ваших нужд.
В соответствии с приведённой конфигурацией, fail2ban будет автоматически банить любые удалённые IP адреса, с которых поступило хотя бы 3 неудачных попытки за последние 10 минут. Однажды забаненный, IP нарушителя будет оставаться заблокированным в течение 24 часов. Уведомление об этом событии будет отправлено по почте.
После того, как конфигурационный файл готов, перезапустите службу fail2ban как показано ниже.
На Debian, Ubuntu или CentOS/RHEL 6:
На Fedora или CentOS/RHEL 7:
Чтобы проверить, успешно ли запущен fail2ban, выполните команду fail2ban-client с аргументом «ping». Если служба fail2ban запущена нормально, вы должны увидеть ответ «pong».
Тестирование защиты с Fail2ban на SSH от атаки перебором паролей
Чтобы проверить, работает ли fail2ban, попробуйте войти на сервер SSH используя неверный пароль для симуляции брут-форс атаки. В то же время, проверяйте /var/log/fail2ban.log, который записывает все интересные события, которые происходят в fail2ban.
Согласно логу выше, fail2ban забанил IP адрес 192.168.1.8, поскольку выявил множественные ошибки в попытка залогиниться на SSH с этого IP адреса.
Проверка статуса Fail2ban и разблокировка заблокированных IP адресов
Джейл «ssh-iptables» в fail2ban использует iptables для блокировки IP адресов нарушителей, вы можете легко проверить бан, посмотрев текущие правила iptables как показано ниже.
Если вы хотите разблокировать IP адреса от fail2ban, вы можете также выполнить команду iptables:
В то время, как вы можете проверять и управлять списком заблокированных IP в fail2ban вручную с помощью команд iptables, как было показано, верным способом, на самом деле, является использование инструмента командной строки ail2ban-client. Этот инструмент позволяет вам управлять не только джэйлом «ssh-iptables», но также любыми другими типами джэйлов fail2ban в унифицированным интерфейсе командной строки.
Для проверки статуса fail2ban (который покажет список активных в настоящее время джейлов):
Чтобы проверить статус конкретного джейла (например, ssh-iptables):
Вышеприведённая команда покажет список забаненных IP адресов.
Для разблокировки конкретного IP адреса:
Обратите внимание, если вы остановите fail2ban, все заблокированные IP адреса будут разблокированы. Когда вы перезапустите fail2ban, он найдёт список IP адресов нарушителей из /var/log/secure (или /var/log/auth.log) и перезабанит эти IP адреса, если не истекло время бана.
Установка Fail2ban на автозагрузку и включении
После того, как вы успешно протестировали fail2ban, последним шагов по задействованию fail2ban является автоматический запуск при включении питания сервера. На основанных на Debian дистрибутивах, автозапуск fail2ban включен по умолчанию. На основанных на Red Hat дистрибутивах, включите автостарт следующим способом.
На CentOS/RHEL 6:
На Fedora или CentOS/RHEL 7:
В этом уроке я продемонстрировал как установить и настроить fail2ban для защиты SSH сервера. Хотя fail2ban может смягчить атаку перебором паролей, пожалуйста помните, он не может защитить SSH сервера против сложных (распределённых) кампаний по брут-форсингу, когда атакующие обходят fail2ban используя тысячи подконтрольных ботам IP адресов.
Источник
Защищаем SSH от брутфорса на любом порту
Сегодня меня заинтересовал опрос надо ли перевешивать SSH на нестандартный порт. Сам опрос не так интересен как способ автора zivot_je_cudo защищать SSH от подбора пароля: после неверной попытки подключения блокировать новые попытки в течение 20 секунд. Задержка, видимо, выбрана эмпирически, исходя их двух противположных пожеланий: чтобы не заблокировать в случае опечатки себя надолго, и в тоже время усложнить жизнь подбиральщика. Я хочу поделиться своим способом противодействия брут-форсу, который применяю уже несколько лет. Он имеет два преимущества:
— дает мне больше попыток для набора правильного пароля
— но при этом блокирует брутфорсеров «навечно».
Как можно достичь этих двух противоположных целей?
Я использую модуль iptables под названием hashlimit, который умеет подсчитывать кол-во пакетов в определенный промежуток времени и через некоторое время сбрасывать счетчик.
Все делается тремя правилами:
iptables -A INPUT -p tcp -m tcp —dport 22 -m state —state NEW -m hashlimit —hashlimit 1/hour —hashlimit-burst 2 —hashlimit-mode srcip —hashlimit-name SSH —hashlimit-htable-expire 60000 -j ACCEPT
iptables -A INPUT -p tcp -m tcp —dport 22 —tcp-flags SYN,RST,ACK SYN -j DROP
iptables -A RH-Firewall-1-INPUT -p tcp -m state —state NEW -m tcp —dport 22 -j ACCEPT
Что делает второе и третье правило понятно. Все самое интересное в первом: оно разрешает 2 попытки подключения в течение часа. Как только вы превышаете 2 попытки за указанное время, правило с -j ACCEPT перестает работать, пользователь вместо этого попадает в следующее правило с -j DROP (точно также можно поставить TARPIT). После этого вы не сможете подключиться, и начинается обратный отсчет 60 000 миллисекунд, после которых информация о вашей попытке «протухает» (параметр —hashlimit-htable-expire). То есть реально вам придеся ждать не 1 час, а всего 1 минуту. Вся военная хитрость состоит в том, что если вы не дождетесь этого времени и попробуете еще раз подключиться, то пакет будет убит, а счетчик снова сброшен в начальное состояние — 1 минуту! Таким образом, если вы нетерпеливый брутфорсер и будете тупо долбать порт после блокировки, то вы с каждой попыткой будете продлевать свой бан! То есть забаните себя навечно!
Добропорядочный же пользователь наборот имеет несколько попыток подключения без ожидания между ними прежде чем попадет в «баню».
Модуль hashlimit сохраняет свое состояние в /proc — поначалу там пусто:
# cat /proc/net/ipt_hashlimit/SSH
после первой попытки подключения туда попадает инфа:
# cat /proc/net/ipt_hashlimit/SSH
55 ХХ.ХХ.ХХ.ХХ:0->0.0.0.0:0 11533000 230400000 115000000
первое число — кол-во оставшихся секунд, можно смотреть как оно равномерно тикает:
# cat /proc/net/ipt_hashlimit/SSH
20 ХХ.ХХ.ХХ.ХХ:0->0.0.0.0:0 117429000 230400000 115000000
После того как я это сделал, мне очень захотелось проверить. И надо же! На ловца зверь бежит! Меня тут же начал брутфорсить какой-то китаец. Первые 4 попытки прошли, а дальше он в течение часа (!) тупо долбился в закрытую дверь. За весь этот час ему удалось проверить всего 4 пароля! Дальше, видимо, надоело.
Таким образом решены две проблемы:
— если пользователь вдруг опечатался, ему не нужно долго ждать новых попыток
— брутфорсеры сами себя загоняют в «вечный» бан.
Что делать, если вы вдруг с нескольких попыток не смогли ввести пароль? Не суетиться — подождать спокойно минуту и попробовать еще несколько раз.
А если уж снова не смогли — то лучше пойти проспаться, в таком состоянии в консоль лучше не лазить :))
P.S. И да, чуть не забыл — у меня SSH на нестандартном порту 🙂
UPD: Немного про настройку hashlimit.
UPD2: Как достичь того же самого с помощью более распространенного модуля recent: раз, два.
UPD3: Само собой способ годится не только для защиты от подбора пароля по SSH, но может быть использован и для различных других сервисов, где слишком частое подключение сигнализирует о чем-то неладном.
UPD4: Ограничение подключений с помощью самого SSHD.
Источник