Защита Linux-серверов от брутфорса SSH

Остановите брутфорс SSH на ваших Linux-серверах

SSH Protector - легковесный демон для Linux, который останавливает брутфорс-атаки на SSH: он разбирает журналы аутентификации в реальном времени и автоматически отбрасывает адреса атакующих правилами nftables/iptables на уровне ядра, занимая менее 10 МБ резидентной памяти. Демон SSH Protector читает systemd-journald - или /var/log/auth.log на хостах, где ещё работает rsyslog, - считает события Failed password и Invalid user по исходным адресам, и как только источник переходит заданный порог, демон фиксирует одно правило netfilter, накрывающее всю подсеть /24 атакующего. Каждое решение вычисляется на самом защищаемом хосте, поэтому защита от брутфорса SSH продолжает работать при недоступности панели, а набор правил восстанавливается с диска после перезагрузки.

Установить одной командой
curl -fsSL https://sshprotector.com/download/installer | sudo sh

Бесплатная версия включает в себя полную защиту для одного сервера.

Один статический бинарник, любой systemd-дистрибутив Linux

Debian · Ubuntu · FedoraRHEL · Alma · Rocky · Alpinex86-64 · ARM64 · бэкенды nftables и iptablesменее 10 МБ RSS · CPU близко к нулю
00

Установите агент

Один бинарник для всех, аккаунт для скачивания не нужен. Установите сейчас, а сервер подключите когда удобно - агент попросит токен из панели и до этого ничего не защищает.

Скачать скрипт установки

Любой современный Linux на systemd - Debian, Ubuntu, RHEL/CentOS/Alma/Rocky, Fedora - на x86-64 или ARM64. Скрипт ставит ту же службу и удобен для парка серверов.

01Зачем

Открытый порт SSH круглосуточно принимает трафик подбора учётных данных

Сканирующие ботнеты обходят всё маршрутизируемое адресное пространство IPv4 и перебирают списки паролей на каждом хосте, который отвечает на TCP/22. Демон SSH, доступный из интернета, получает этот трафик независимо от того, корпоративный это бастион или единственный VPS.

Тысячи неудачных аутентификаций в сутки
Новый хост, отвечающий на TCP/22, начинает записывать неудачные SSH-аутентификации уже через несколько часов после того, как его адрес стал маршрутизируемым. Типичный сервер с выходом в интернет фиксирует в systemd-journald тысячи событий Failed password и Invalid user в сутки, и приходят они из диапазонов, которые сменяются быстрее, чем один администратор способен их просмотреть.
CPU, память и записи в журнал тратятся на трафик, который никогда не пройдёт аутентификацию
Каждая попытка SSH-аутентификации стоит TCP-рукопожатия, обмена ключами SSH, обращения к стеку PAM через /etc/pam.d/sshd и одной синхронной записи в systemd-journald. Непрерывный поток брутфорса тем самым держит постоянную фоновую нагрузку на хосте, раздувает хранилище журнала и оттесняет настоящие административные подключения в очередь sshd MaxStartups - и ничего из этого атакующему не требуется проходить аутентификацию, чтобы получить.
Один угаданный пароль - это полная компрометация
Единственный верный пароль даёт интерактивную оболочку с правами этой учётной записи: разворачивание шифровальщика, выгрузка данных или рассылка спама от имени адреса самого хоста. Слабые или переиспользованные из публичных утечек пароли ломаются словарным перебором за считаные дни, и журнал аутентификации записывает удачную попытку ровно так же, как любую другую строку.
pam_faillock превращает атаку в блокировку настоящего администратора
Стек PAM, описанный в /etc/pam.d/sshd, считает последовательные неудачи модулем pam_faillock и блокирует учётную запись при достижении порога deny. Атакующий, который угадал только существующее имя пользователя - но не пароль, - может намеренно выбить этот счётчик и запереть настоящего администратора снаружи хоста. Получается отказ в обслуживании, произведённый целиком самим защитным механизмом.

SSH Protector переносит решение из пространства пользователя в input-хук netfilter

Демон SSH Protector сопоставляет неудачные события аутентификации по исходной сети и фиксирует одно правило nftables, отбрасывающее всю подсеть /24 атакующего. Как только это правило существует, netfilter отбрасывает пакеты в input-хуке ядра - до того как sshd примет соединение, до обращения к PAM и до любой записи в журнал. Нагрузка на CPU, объём журнала и число попыток, доходящих до проверки пароля, падают одновременно.

02Как это остановить

Как остановить брутфорс-атаки на SSH в Linux (3 способа)

Три изменения конфигурации уменьшают то, что доходит до sshd, и они складываются. Первым двум не нужно ничего, кроме OpenSSH и межсетевого экрана хоста; на третьем конкурируют Fail2ban, CrowdSec, SSHGuard и SSH Protector. Делать их стоит именно в этом порядке.

  1. 01Отключить парольную аутентификацию в sshd_config

    Атаке подбора пароля нечего подбирать, как только sshd полностью перестаёт принимать пароли. Директивы PasswordAuthentication no и KbdInteractiveAuthentication no в drop-in файле под /etc/ssh/sshd_config.d/ убирают всю поверхность подбора учётных данных, а PermitRootLogin prohibit-password сохраняет доступ root по ключу, закрывая при этом самое атакуемое имя учётной записи. Порядок действий важнее самих директив: сначала установить публичный ключ, затем во второй, ещё открытой сессии убедиться, что ключ проходит аутентификацию, и только после этого перезагрузить sshd - опечатка, применённая в неверном порядке, запирает администратора снаружи удалённого хоста без пути назад.

    # /etc/ssh/sshd_config.d/10-keys-only.conf
    PasswordAuthentication no
    KbdInteractiveAuthentication no
    PermitRootLogin prohibit-password
    Полное руководство
  2. 02Сократить долю интернета, которая вообще достаёт до порта

    Перенос sshd на нестандартный порт директивой Port убирает нецелевой трафик сканеров и больше ничего; сканирование всего диапазона портов находит демон заново за секунды, так что смена порта покупает тишину в журналах, а не безопасность. Фильтрация порта убирает уже самого атакующего: правило nftables, принимающее SSH-порт только из диапазона VPN или фиксированного офисного префикса, означает, что источник не из списка даже не завершит TCP-рукопожатие. Директива AllowGroups в sshd_config сужает ту же экспозицию на уровне демона, ограничивая, какие локальные учётные записи вообще могут проходить аутентификацию. На хосте с известным составом администраторов в конфигурации должно быть и то и другое.

    # /etc/ssh/sshd_config.d/20-exposure.conf
    Port 2202
    AllowGroups ssh-admins
    
    # nftables: only the VPN and the office reach it at all
    nft add rule inet filter input tcp dport 2202 \
      ip saddr { 10.8.0.0/24, 203.0.113.7 } accept
    Полное руководство
  3. 03Блокировать сеть-источник до того, как она наберёт достаточно попыток

    Fail2ban - стандартный первый ответ, и вполне разумный: процесс fail2ban-server разбирает журнал аутентификации, считает неудачи внутри findtime и вызывает действие, программирующее iptables или nftables на срок bantime. Ограничения этой конструкции структурные, а не случайные: типовой jail банит по одному адресу за раз, бан истекает по таймеру, между хостами ничего не разделяется, а регулярное выражение jail может тихо перестать совпадать после смены формата журнала - без единого сигнала о том, что защита прекратилась. CrowdSec отвечает на проблему обмена данными общим блок-листом сообщества и отдельным процессом-bouncer; SSHGuard держит состояние в памяти; DenyHosts пишет в /etc/hosts.deny, что опирается на TCP wrappers, с которыми текущие сборки OpenSSH больше не линкуются. Демон SSH Protector банит всю подсеть /24 атакующего одним правилом nftables, сохраняет набор правил через перезагрузки и делится тем, что узнал один защищённый хост, со всеми остальными.

    # /etc/fail2ban/jail.d/sshd.local
    [sshd]
    enabled  = true
    backend  = systemd
    maxretry = 4
    findtime = 10m
    bantime  = 1h
    Полное руководство

Что закрывает одно правило на подсеть

Подвигайте ползунки. Это арифметика, а не бенчмарк.

Бан по одному адресу

32 правил firewall

128 попыток всё ещё доходит до sshd

Бан всей подсети /24

1 правил firewall

4 попыток всё ещё доходит до sshd

В /24 помещается 256 адресов. Когда бан идёт по адресу, бот при переходе на следующий получает свежий лимит каждый раз; когда бан закрывает диапазон — ни разу. Здесь ничего не измерено, это тот же подсчёт, который делает агент.

03Сравнение

SSH Protector, Fail2ban, CrowdSec, SSHGuard, DenyHosts и Wazuh

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

ИнструментЕдиница банаСостояние после перезагрузкиИсточник журналаТочка примененияРепутация между хостами
SSH ProtectorВся подсеть /24, с учётом ASNНабор правил восстанавливается с дискаAPI systemd-journald, auth.log, журналы FTP-демонаНабор nftables в input-хуке netfilterДа - агрегируется по всем защищённым хостам
Fail2banОдин адрес в типовом jailБаза SQLite, восстанавливается при старте до истечения bantimeОпрос auth.log, pyinotify или backend = systemdiptables, nftables или ipset через actionНет - каждый хост решает сам
CrowdSecАдрес или диапазон, в зависимости от сценарияЛокальная база решений, восстанавливаетсяСбор журналов через настроенные парсерыnftables или iptables через отдельный процесс-bouncerДа - общий блок-лист сообщества
SSHGuardОдин адресХранится в памяти; сохраняется только при явном файле блок-листаПоток журнала из journald или файла syslogБэкенд nftables, iptables, pf или ipfwНет
DenyHostsОдин адрес/etc/hosts.deny, сохраняется как файлТолько auth.log, только SSHTCP wrappers, с которыми текущие сборки OpenSSH больше не линкуютсяНеобязательный центральный сервер синхронизации
WazuhОдин адресActive response истекает по собственному таймеруСборщик журналов агента, передающий центральному менеджеруСкрипт active-response firewall-drop на агентеЦентральный менеджер - ценой его эксплуатации

Каждая ячейка описывает поведение по умолчанию. Fail2ban можно заставить банить префикс CIDR собственным action, bouncer CrowdSec можно направить в ipset, а SSHGuard можно выдать файл блок-листа - столбец говорит о том, что происходит без этой работы. Строка SSH Protector - единственная, которую этот сайт может проверить изнутри; остальные прочитаны из документации самих проектов и разобраны в гайде ниже.

Полное сравнение с Fail2ban
04Как это устроено

Где на самом деле останавливается попытка брутфорса SSH в Linux

Все инструменты этой категории - Fail2ban, CrowdSec, SSHGuard, DenyHosts, Wazuh и демон SSH Protector - читают одни и те же журналы и пишут в один и тот же межсетевой экран. Различает их то, на какой стадии пути аутентификации Linux действует каждый и сколько хост успел потратить к этому моменту.

sshd и стек PAM
Входящее соединение доходит до sshd, который завершает TCP-рукопожатие и обмен ключами SSH ещё до того, как будут рассмотрены какие-либо учётные данные, а затем передаёт их стеку PAM, объявленному в /etc/pam.d/sshd: pam_unix проверяет пароль, pam_faillock считает последовательные неудачи. Ничто на этом пути не отказывает трафику - к моменту проверки первого пароля sshd уже выделил сессию и потратил процессорное время. MaxAuthTries и LoginGraceTime ограничивают то, что может попробовать одно соединение, а не то, сколько соединений открывает атакующий, - поэтому один только sshd_config не отвечает на распределённую брутфорс-атаку.
systemd-journald и /var/log/auth.log
Каждый исход аутентификации записывается в systemd-journald, а на хостах, где ещё работает rsyslog, те же записи попадают в /var/log/auth.log на Debian и Ubuntu либо в /var/log/secure на RHEL, CentOS, AlmaLinux и Rocky Linux. Журнал аутентификации - единственное место, где факт «этот источник сорок раз ошибся за две минуты» вообще становится известен, потому что пакет в ядре не несёт исхода аутентификации. Накладные расходы на разбор журнала - цена этого знания, и платят её все инструменты категории: демон SSH Protector читает журнал через нативный API, а не хвостом текстового файла, что снимает стоимость регулярного выражения на строку и убирает класс отказов, при котором дистрибутив меняет формат журнала, а jail тихо перестаёт совпадать.
netfilter: nftables, iptables и наборы
Бан существует только тогда, когда в ядре существует правило. И nftables, и более старый iptables программируют netfilter, чей input-хук выполняется до того, как пакет вообще будет поставлен в очередь к сокету sshd, поэтому отброшенный пакет не стоит ни процесса в пространстве пользователя, ни сессии, ни записи в журнал. Набор nftables - или ipset за iptables - держит множество префиксов за одним поиском по правилу, поэтому реальная стоимость схемы IP blacklisting на пакетной скорости определяется числом правил, а не числом заблокированных адресов. SSH Protector пишет по одной записи набора nftables на каждую забаненную /24 и сохраняет набор, так что попакетную работу выполняет фильтрация на уровне ядра, а не демон.
eBPF и XDP - и что они не решают
Программы eBPF, подключённые на XDP, отбрасывают пакет в сетевом драйвере, раньше netfilter и на более высокой пакетной скорости, что делает eBPF правильным инструментом против объёмного флуда. Но программа XDP не может прочитать /var/log/auth.log, не видит результата PAM и не отличает неверный пароль от верного, поэтому решение о том, какой префикс отбрасывать, в любой конструкции по-прежнему рождается в анализе журналов в пространстве пользователя. Для трафика брутфорса SSH - низкая пакетная скорость при высокой ценности каждой попытки аутентификации - input-хук netfilter отбрасывает трафик задолго до того, как хост заметит нагрузку, а вся инженерная сложность сидит в решении о том, что именно отбрасывать.
IP blacklisting и почему важна единица бана
IP blacklisting держится ровно до тех пор, пока атакующий сохраняет адрес, который заработал бан. Сканирующие ботнеты ротируются внутри выделенного блока, поэтому бан по адресу выдаёт каждому следующему адресу той же /24 полный свежий запас попыток - до 256 запасов на диапазон. Бан, выраженный префиксом CIDR, выдаёт этот запас ровно один раз на весь диапазон. Это арифметика, а не бенчмарк, и калькулятор ниже показывает тот же счёт, который ведёт демон SSH Protector.
05Как работает

От скачивания до защищённого сервера за несколько минут

Никаких конфигов и командной строки: скачайте установщик, запустите его и подтвердите запрос sudo.

  1. Создайте аккаунт

    Регистрация по email или через Google/GitHub. Банковская карта не нужна.

  2. Скачайте установщик

    Вы получаете персональный подписанный установщик с уже вшитым токеном доступа.

  3. Запустите его на сервере

    Агент сам определит порт SSH и добавит ваш текущий IP в вайтлист, чтобы вы не заблокировали сами себя.

  4. Готово

    Через несколько секунд сервер появится в панели со статусом «онлайн» и начнёт блокировать атакующих с разумными настройками по умолчанию.

06Возможности

Защита от брутфорса, общая репутация, гео-политика и управление парком

Фильтрация пакетов на уровне ядра, управляемая анализом журнала аутентификации, и поверх - межарендаторская репутация атакующих, географическая политика, доступ по запросу и централизованное управление парком серверов.

Защита SSH, SFTP и FTP от брутфорса01

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

Бан префикса CIDR вместо бана по адресу02

Сканирующие ботнеты ротируют адреса внутри одного выделенного блока, поэтому бан по адресу выдаёт каждому следующему адресу свежий запас попыток. SSH Protector сопоставляет источник с анонсируемым префиксом по данным ASN и банит всю /24 одной записью в едином наборе nftables.

Межарендаторская репутация атакующих03

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

Географическая политика, вычисляемая локально04

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

Доступ по запросу с MFA05

Доступ по запросу держит порт SSH закрытым по умолчанию и открывает его для одного адреса после подтверждённого MFA запроса - с таймером и автоматическим закрытием. Правило nftables снимается по истечении таймера независимо от того, вспомнил ли кто-нибудь его отозвать.

Белый список и строгий режим06

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

Оповещения и журнал аудита только на дозапись07

Всплески частоты банов, уход агента в офлайн и дрейф конфигурации доставляются по email, в Telegram, Slack или на вебхук. Каждое изменение политики, бан, разбан и правка белого списка записываются в журнал аудита только на дозапись, вместе с автором и адресом источника.

Один статический бинарник, менее 10 МБ резидентно08

Агент - один статически слинкованный исполняемый файл, работающий как unit systemd, с резидентным набором менее 10 МБ и потреблением CPU, близким к нулю между событиями аутентификации. Тот же бинарник покрывает все systemd-дистрибутивы на x86-64 и ARM64: ни интерпретатора, ни рантайма Python, ни пакетных зависимостей разрешать не нужно.

Централизованное управление без входящих портов09

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

Постоянная защита от блокировки pam_faillock10

Постоянная защита от блокировки гарантирует, что pam_faillock не будет обращён против учётной записи, администрирующей хост: демон SSH Protector банит префикс источника раньше, чем будет достигнут порог deny в /etc/pam.d/sshd, и сбрасывает счётчик faillock для защищённых учётных записей. Поведение включено по умолчанию на всех тарифах, включая Free.

07Тарифы

Фиксированные тарифы без доплат за каждый сервер

Free остаётся бесплатным навсегда, карта не нужна. У платных тарифов фиксированная цена и заранее известное число серверов.

Free

1 сервер
0 ₽/мес

Базовая защита SSH для одного сервера.

  • Защита SSH от перебора паролей
  • Мягкий вайтлист
  • Минимальная статистика

Solo

1 сервер
600 ₽/мес

Полная защита одного боевого сервера.

  • Всё из Free
  • Защита FTP от перебора паролей
  • Полная статистика
  • Email-уведомления
  • Базовый аудит

Pro

ПопулярныйДо 5 серверов
1 000 ₽/мес

Для команд и небольших парков серверов.

  • Всё из Solo
  • Строгий вайтлист и группы
  • Полный аудит с экспортом
  • Расширенная статистика
  • Общий блок-лист по поведению

Enterprise

До 50 серверов
7 000 ₽/мес

Для компаний с большим парком серверов.

  • Всё из Pro
  • Назначение администраторов и модераторов
  • Приоритетная поддержка
  • Общий блок-лист по поведению

Нужен ещё один сервер сверх тарифа? Докупайте серверы по одному - $3 за сервер в месяц, без перехода на старший тариф.

14 дней Pro бесплатно - без карты

Зарегистрируйтесь и попробуйте на своём сервере бан подсетей, уведомления в Telegram, GeoIP и общую базу угроз. По окончании аккаунт сам вернётся на Free, защита продолжит работать. Ничего не спишется, отменять нечего.

Включить пробный период
08Случаи

Когда защита Linux-сервера действительно необходима

Пятнадцать ситуаций, в которых удалённый доступ к Linux-машине перестаёт быть теоретическим риском и становится ежедневным. Если вы узнаёте в одной из них свой сервер - пароли к нему уже подбирают.

0.0.0.0/022 · 21LISTEN 0.0.0.0$sshduptime 412dno consoleone host · always on

Когда необходимо защитить SSH-сервер на Linux

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

  1. 01

    SSH доступен откуда угодно, и пароли всё ещё работают

    Порт 22 отвечает любому адресу в мире - без VPN перед ним и без бастиона. Для арендованной машины это состояние по умолчанию: провайдер выдаёт публичный адрес, сервер настраивают именно по SSH, и после настройки порт просто остаётся там, где был, - как правило, с включённой парольной аутентификацией рядом с ключами.

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

    • VPS или облачная машина, доступная по публичному адресу
    • Офисная машина за роутером, на которую проброшен порт 22
    • Сервер, который «временно» открыли ради миграции и так и не закрыли
    • Машина, чей адрес нигде не публиковали, но он всё равно попадает в сканируемый диапазон
  2. 02

    В облачном образе уже есть имя пользователя, известное всем

    Образы дистрибутивов и провайдеров приходят с заранее известной первой учётной записью: root на голом VPS, ubuntu в Ubuntu, ec2-user, debian, admin, pi. Половина задачи подбора - найти существующий логин - решена ещё до того, как машина закончила первую загрузку.

    Именно поэтому открытый сервер целыми сутками видит в журнале один и тот же короткий список имён. Атакующему ничего не нужно выяснять: учётная запись стандартна, она есть на огромной доле Linux-хостов в интернете, и на многих из них под ней до сих пор можно войти напрямую.

  3. 03

    На одном арендованном VPS живут сайт, база и резервные копии

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

    Защита провайдера сюда не распространяется. Хостинги фильтруют объёмные потоки трафика, а не подбор паролей: несколько попыток в секунду с постоянно меняющихся адресов выглядят для сети как обычный трафик, и служба поддержки их попросту не увидит.

    • Запаса нет: при компрометации проект не деградирует, а останавливается
    • Резервные копии часто лежат на том же диске - именно на это и рассчитан шифровальщик
    • Читать auth.log некому, и попытки копятся незамеченными
  4. 04

    Linux-машина - это роутер, NAS или прибор, который никто не считает сервером

    Межсетевой экран, сетевое хранилище, Raspberry Pi с кассовой программой магазина, контроллер в серверной, мини-ПК под столом, делающий резервные копии, - всё это Linux, на всём этом включён SSH, и ничего из этого не попадает ни в один список серверов.

    Именно такие машины и забывают. Их настроили один раз, они продолжают работать, и между днём, когда выбирали пароль, и днём, когда на них снова посмотрят, проходят годы. А порт всё это время отвечает интернету.

  5. 05

    На том же хосте слушает FTP

    Linux-сервер редко публикует одну службу. FTP для обмена файлами с заказчиком или дизайнером и SSH для администрирования обычно живут вместе на одном адресе, причём учётные записи FTP, как правило, старше всего остального на машине.

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

    • Учётные записи FTP заводят подрядчику один раз и больше не пересматривают
    • Обычный FTP передаёт пароль по сети в открытом виде
    • Общая учётная запись для загрузки файлов, пароль от которой знает половина офиса
users triedrootadminubuntudeploypostgrestestpassword:PasswordAuthentication yesfailed9 999

Когда учётные записи и ключи перестают быть под контролем

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

  1. 06

    У разработчиков и подрядчиков свои логины

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

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

    • Ключи, добавленные ради одной выкладки и не удалённые после неё
    • Одна учётная запись на всех сотрудников подрядчика вместо записи на человека
    • О смене персонала у подрядчика вам никто не сообщает
  2. 07

    Учётные записи для деплоя и автоматизации не могут использовать второй фактор

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

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

  3. 08

    Парольный вход оставили «на всякий случай»

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

    Подбору всё равно, что ключи существуют. Пока PasswordAuthentication стоит в yes хотя бы для одной учётной записи на машине, у словарной атаки есть путь внутрь, и самый стойкий ключ на сервере не замедляет её ни на секунду.

  4. 09

    Пароль уже есть в базе утечек

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

    Подбор перестаёт быть вопросом вероятности и становится вопросом расписания: правильный пароль уже в списке, вопрос только в том, когда бот доберётся до вашего адреса. Требования к сложности здесь не помогают - такой пароль вполне может удовлетворять всем правилам, которые вы написали.

    • Пароль, одинаковый для серверной учётной записи и личного сервиса
    • Учётные данные, утёкшие из систем подрядчика, а не из ваших
    • Шаблоны, которые политика принимает, а словарь уже содержит: Лето2024!, Компания1
  5. 10

    Приватный ключ без пароля на чьём-то ноутбуке

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

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

/var/log/auth.log22:0023:0124:0225:0326:0427:0528:0629:07this month12 480blockedexported · signed

Когда вопрос ставят журнал, аудитор или хостер

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

  1. 11

    Аудитор, страховщик или заказчик спрашивает, как защищён удалённый доступ

    Анкеты киберстрахования, опросники безопасности от корпоративных клиентов и регуляторные требования к обработке платёжных и персональных данных спрашивают об одном и том же разными словами: что останавливает многократный подбор пароля к вашему удалённому доступу и откуда вы знаете, что оно работает.

    Ответ «мы используем ключи» не выдерживает уточняющего вопроса, потому что уточнение будет про учётные записи, которые всё ещё принимают пароли, и про попытки, которые в любом случае доходят до порта. Нужна мера, существующая независимо от любых конкретных учётных данных, и запись, показывающая, что она действовала весь проверяемый период.

    • Анкета киберстрахования перед выпуском или продлением полиса
    • Проверка поставщика крупным заказчиком перед подписанием договора
    • Требования к платёжным или персональным данным, предписывающие защиту от перебора
  2. 12

    auth.log и диск заполняются неудачными входами

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

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

  3. 13

    Списки блокировок, которые ведут вручную, стали отдельной работой

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

    На деле парку нужна одна политика, решённая однажды и применённая везде, исключения, которые записаны, а не удерживаются в памяти, и блокировки, которые не приходится восстанавливать руками после каждой пересборки сервера.

  4. 14

    Один администратор обслуживает серверы разных заказчиков

    Сервисные компании, приходящие системные администраторы и небольшие хостинговые фирмы ведут десятки Linux-машин у разных заказчиков, у разных провайдеров и в разных сетевых схемах. У каждой свои правила, свои учётные записи и своя терпимость к простою.

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

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

    Связь с сервером ненадёжна, а защита должна держаться всё равно

    Каналы падают, провайдеры перестраивают маршруты, ломается DNS, и машина в удалённой стойке может часами не иметь маршрута наружу. Атаки на это время не приостанавливаются - скорее наоборот, сетевая авария и есть тот момент, когда за сервером меньше всего наблюдают.

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

09Вопросы

FAQ: когда нужна защита SSH от брутфорса

Безопасно ли ставить SSH Protector на продакшен-сервер?

Безопасно ли ставить SSH Protector на продакшен-сервер?

Да. Агент SSH Protector читает журнал аутентификации собственной операционной системы и пишет правила nftables, фильтрующие входящий трафик к защищаемым портам на этом же хосте. Агент не открывает слушающих сокетов, не имеет канала удалённых команд и инициирует только исходящий HTTPS. Ничто в агенте не может действовать против другой машины.

Чем SSH Protector отличается от Fail2ban?

Чем SSH Protector отличается от Fail2ban?

Fail2ban разбирает журнал аутентификации, считает неудачи внутри findtime и программирует межсетевой экран на срок bantime - по одному адресу за раз и только на этом хосте. SSH Protector сопоставляет источник с анонсируемым префиксом и банит всю /24 одной записью набора nftables, сохраняет набор через перезагрузки вместо истечения по таймеру, читает systemd-journald через нативный API вместо сопоставления текстовых строк регулярным выражением и делится полученной репутацией со всеми остальными защищёнными хостами. Таблица выше ставит оба поведения по умолчанию рядом, а /guides/fail2ban-limitations разбирает различия целиком.

SSH Protector использует iptables или nftables?

SSH Protector использует iptables или nftables?

По умолчанию SSH Protector программирует nftables, используя именованный набор, чтобы множество забаненных префиксов стояло за одним поиском по правилу в input-хуке netfilter. На хостах, где ядро или дистрибутив всё ещё работают по легаси-пути, агент откатывается на iptables с ipset, что даёт то же поведение на уровне пакетов. Агент определяет используемый бэкенд, а не предполагает его, и никогда не сбрасывает правила, которые создал не он.

Каковы объём памяти и стоимость по CPU?

Каковы объём памяти и стоимость по CPU?

Агент - один статически слинкованный исполняемый файл с резидентным набором менее 10 МБ и потреблением CPU, близким к нулю между событиями аутентификации, потому что попакетная работа происходит в ядре, а не в агенте. Накладные расходы на разбор журнала ограничены чтением systemd-journald через нативный API вместо построчного хвоста и регулярных выражений по /var/log/auth.log.

Работает ли защита без подключения к интернету?

Работает ли защита без подключения к интернету?

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

Почему не eBPF или XDP?

Почему не eBPF или XDP?

Программа eBPF, подключённая на XDP, отбрасывает пакеты в сетевом драйвере - это правильный ответ на объёмный флуд. Но программа XDP не может прочитать /var/log/auth.log, не наблюдает результата PAM и не отличает неверный пароль от верного, поэтому решение о том, какой префикс отбрасывать, по-прежнему приходит из анализа журналов в пространстве пользователя. Трафик брутфорса SSH - это низкая пакетная скорость при высокой ценности попытки аутентификации, и input-хук netfilter отбрасывает его задолго до того, как пакетная скорость станет ограничением.

Что будет, если порт SSH изменён?

Что будет, если порт SSH изменён?

Агент читает действующий порт из sshd_config, его drop-in файлов под /etc/ssh/sshd_config.d/ и слушающих сокетов хоста, после чего перестраивает свои правила nftables при смене порта. Порт FTP-демона определяется так же, поэтому нестандартный порт обнаруживается, а не настраивается.

Может ли SSH Protector запереть администратора снаружи?

Может ли SSH Protector запереть администратора снаружи?

Нет. Установщик добавляет в белый список адрес, с которого выполнялась установка, ещё до фиксации первого правила, а источники из белого списка проверяются раньше любого блокирующего пути. Постоянная защита от блокировки дополнительно банит атакующий префикс до достижения порога deny у pam_faillock в /etc/pam.d/sshd, поэтому брутфорс не может заблокировать и настоящую учётную запись.

Какие дистрибутивы Linux поддерживаются?

Какие дистрибутивы Linux поддерживаются?

Любой systemd-дистрибутив на x86-64 или ARM64: Debian, Ubuntu, RHEL, CentOS, AlmaLinux, Rocky Linux, Fedora и Alpine с systemd. Агент поставляется одним статически слинкованным бинарником, поэтому на защищаемом хосте не нужно разрешать ни интерпретатор, ни рантайм Python, ни пакетные зависимости.

Как устроена оплата?

Как устроена оплата?

Международные платежи проводит PayPro Global как merchant of record, платежи внутри России - ЮKassa, криптовалюта доступна как запасной вариант. Тариф Free постоянный, покрывает один сервер с полной защитой от брутфорса и не требует карты.

Защита SSH с включённой парольной аутентификацией

Я оставил PasswordAuthentication включённой, а SSH слушает на публичном адресе Linux-сервера. В auth.log идут тысячи Failed password с разных IP и логинов, перенос порта 22 не помогает, а полностью закрыть доступ нельзя. Как мне настроить защиту SSH от перебора паролей до успешного входа?

С SSH Protector я устанавливаю агент как systemd-службу: он локально читает журнал аутентификации, определяет фактический порт sshd и после порога за окно времени блокирует сеть источника в системном фаерволе. Я заранее добавляю свой адрес или VPN в whitelist, контролирую историю в панели и сохраняю последнюю политику при потере интернета.

Бесплатно без SSH Protector я отключаю PasswordAuthentication и PermitRootLogin, оставляю ключи Ed25519, ограничиваю AllowUsers/AllowGroups и разрешаю порт только из VPN или доверенных CIDR. Если пароль временно обязателен, я настраиваю fail2ban по journald/auth.log, проверяю nftables/iptables, задаю findtime, maxretry и bantime и регулярно тестирую исключения с резервной консоли.

Защита стандартного логина облачного Linux-образа

Я развернул Ubuntu/Debian/RHEL из публичного cloud image, поэтому имя пользователя ubuntu, debian, ec2-user или root заранее известно ботам. Даже при хорошем пароле журнал заполнен целевыми попытками, а один ошибочно оставленный пароль делает аккаунт уязвимым. Как мне защитить SSH на облачном VPS со стандартным логином?

С SSH Protector я блокирую источник по реальным неудачным входам независимо от того, какое имя он перебирает, и могу распространить запрет на сеть атакующего. Я проверяю найденный порт SSH, добавляю административный VPN в whitelist и использую локальное решение агента, чтобы защита не зависела от доступности панели.

Бесплатно я запрещаю парольный и root-вход, создаю отдельного пользователя с sudo, загружаю уникальный ключ через cloud-init и закрываю Security Group до VPN/своих сетей. Я удаляю неиспользуемые authorized_keys, включаю MFA на bastion, настраиваю fail2ban и алерты по Accepted password/publickey для неизвестных источников; смену порта считаю только уменьшением шума.

Защита единственного Linux VPS с сайтом и базой

У меня один Linux VPS, где одновременно работают сайт, база данных и резервные копии, а SSH нужен для администрирования. Успешный вход под sudo-пользователем даст атакующему доступ ко всем слоям и позволит удалить локальные backup-файлы. Как мне защитить SSH на критичном VPS с минимальной нагрузкой?

С SSH Protector я ставлю статический агент, который читает локальные события и блокирует источник в фаерволе до компрометации учётной записи. Я использую бесплатную защиту первого сервера, включаю whitelist для своего канала и проверяю, что агент продолжает работать офлайн; резервное копирование и least privilege оставляю отдельными слоями.

Бесплатно я закрываю SSH за WireGuard/Tailscale, отключаю пароли и root, требую ключ с passphrase и ограничиваю sudo. Я храню резервные копии вне VPS с отдельными credentials, включаю автоматические security updates, fail2ban и аудит успешных входов; аварийную консоль провайдера проверяю до ужесточения фаервола.

Защита SSH на роутере, NAS и Linux-приборе

Я управляю Linux-роутером, NAS или ARM-устройством, которое не считаю полноценным сервером, но на нём работает sshd и порт доступен из внешней сети. Устройство редко обновляется, ресурсов мало, а компрометация даст опору внутри локальной сети. Как мне защитить SSH на маломощном Linux-устройстве?

С SSH Protector я использую поддерживаемый статический бинарник для подходящей архитектуры и systemd, включаю локальный анализ журнала и firewall-блокировку без входящего управляющего порта. Я проверяю совместимость ОС и фаервола до установки, задаю whitelist управления и слежу, чтобы агент не вытеснял ограниченные ресурсы устройства.

Бесплатно я вообще не публикую SSH наружу: подключаю устройство через VPN, запрещаю пароль и root, разрешаю один ключ и одну управляющую подсеть. Я обновляю прошивку, отключаю неиспользуемые службы, ставлю минимальный fail2ban только если хватает памяти и сохраняю конфигурацию фаервола; для неподдерживаемой ОС выбираю внешний шлюз, а не неизвестный бинарник.

Единая защита SSH и FTP на Linux

На Linux-хосте у меня открыты SSH и FTP, и боты перебирают оба сервиса через разные журналы. IP, заблокированный скриптом для sshd, продолжает атаковать FTP, а ручные iptables-цепочки расходятся. Как мне централизованно блокировать перебор паролей по SSH и FTP?

С SSH Protector я включаю чтение поддерживаемых журналов SSH и FTP, позволяю агенту определить порты и применяю единое локальное правило к сети источника. Я добавляю доверенные интеграции в whitelist, проверяю историю в панели и учитываю, что расширенная защита FTP и дополнительные функции могут зависеть от тарифа.

Бесплатно я заменяю обычный FTP на SFTP поверх SSH или FTPS, если протокол действительно нужен, и закрываю сервис от всего интернета. Я создаю отдельные jail fail2ban для sshd и FTP, направляю их в одну nftables set с timeout, проверяю формат журналов после обновлений и запрещаю общие учётные записи.

Контроль SSH-логинов разработчиков и подрядчиков

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

С SSH Protector я оставляю автоматическую сетевую блокировку на всех внешних источниках и вношу в whitelist только контролируемый VPN, а не каждый домашний IP. Я использую панель для атак, но идентичность сохраняю в отдельных Unix-аккаунтах и ключах: агент защищает периметр, а отзыв доступа выполняю удалением конкретного ключа.

Бесплатно я веду authorized_keys централизованно через Ansible, выдаю по одному ключу на человека и устройство с понятным comment, запрещаю общий аккаунт и ограничиваю sudo. Я включаю VPN/MFA на bastion, задаю срок доступа в inventory, собираю Accepted publickey с fingerprint в SIEM и автоматически удаляю ключ по окончании договора.

Защита служебных SSH-аккаунтов без MFA

У меня есть deploy/backup-аккаунты, которыми пользуется CI и автоматизация, поэтому интерактивный MFA к ним неприменим. Их ключи должны работать без оператора, но компрометация runner или повторные пароли могут открыть сервер. Как мне защитить машинный SSH-доступ и не сломать deployment?

С SSH Protector я отделяю доверенные адреса runner через точный whitelist, а все остальные источники оставляю под блокировкой по неудачным входам. Я не считаю это заменой контроля ключа: агент сокращает перебор снаружи, пока ограничения самого служебного аккаунта сдерживают последствия успешной аутентификации.

Бесплатно я использую отдельный Ed25519-ключ на job, храню его в secret store, ограничиваю в authorized_keys через from=, command=, no-port-forwarding, no-agent-forwarding и no-pty. Я разрешаю SSH только из сети runner, выдаю минимальные sudo-команды, регулярно ротирую ключ и фиксирую fingerprint в журнале деплоя.

Безопасное отключение парольного входа по SSH

Я оставил парольный SSH-вход «на всякий случай», потому что боюсь потерять ключ или заблокировать себя после изменения sshd_config. В итоге PasswordAuthentication yes остаётся годами, а auth.log постоянно показывает подбор. Как мне перейти на SSH-ключи без риска потерять доступ к серверу?

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

Бесплатно я открываю вторую SSH-сессию и консоль провайдера, добавляю уникальный ключ, проверяю права ~/.ssh 700 и authorized_keys 600, запускаю sshd -t и reload, не закрывая первую сессию. Затем ставлю PasswordAuthentication no, KbdInteractiveAuthentication no и PermitRootLogin no, проверяю новый вход и сохраняю аварийный ключ отдельно.

Реакция на пароль SSH из утечки

Я узнал, что пароль Linux-пользователя есть в утечке, а в auth.log появились попытки с его именем из нескольких стран. Я не уверен, был ли успешный вход, потому что сервером пользуются из разных сетей. Как мне срочно закрыть перебор SSH и проверить компрометацию?

С SSH Protector я немедленно блокирую активные источники и сети, сверяю историю атак и оставляю доступ только через доверенный whitelist. Затем я меняю пароль/ключ, завершаю сеансы и отдельно анализирую Accepted password/publickey; блокировка уменьшает окно атаки, но не доказывает отсутствие уже успешного входа.

Бесплатно я временно закрываю SSH Security Group или nftables до VPN, блокирую пользователя, отзываю ключи и меняю связанные секреты. Я проверяю last/lastlog, journalctl, sudo, новые users/keys, cron/systemd units, процессы и сетевые соединения, затем восстанавливаю доступ только по ключам и запрещаю повторно используемые пароли.

Защита приватного SSH-ключа без passphrase

Я обнаружил приватный SSH-ключ без passphrase на ноутбуке сотрудника; ключ разрешён на нескольких серверах и мог попасть в backup или malware. Такой вход не создаст серию неверных паролей, поэтому обычный антибрутфорс его не остановит. Как мне ограничить ущерб и правильно защитить SSH-ключи?

С SSH Protector я продолжаю блокировать внешний перебор и вижу подозрительные источники, но не полагаюсь на него против корректного украденного ключа. Я немедленно удаляю fingerprint со всех серверов, выдаю новый ключ с passphrase и оставляю whitelist только для VPN; успешные входы расследую отдельно.

Бесплатно я ищу старый публичный ключ по всем authorized_keys, отзываю его конфигурационным управлением и проверяю Accepted publickey по fingerprint и источнику. Я выдаю аппаратный FIDO2/ed25519-sk или ключ с passphrase и ssh-agent timeout, запрещаю agent forwarding без необходимости и храню реестр владельца, устройства и даты ротации.

Подтверждение защиты SSH для аудита

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

С SSH Protector я прикладываю историю атак и блокировок, параметры политики, список защищаемых сервисов и утверждённые исключения. Я документирую локальное решение агента, исходящий TLS-канал и отсутствие входящего управляющего порта, затем выполняю контролируемые неверные входы и сохраняю строки журнала, правило фаервола и уведомление.

Бесплатно я экспортирую sshd_config, nftables/ufw, fail2ban jail и журнал изменений из Git, а auth.log/journald отправляю в защищённое хранилище. Я ежемесячно проверяю PasswordAuthentication, PermitRootLogin, MFA/VPN и отзыв тестового ключа, подписываю результат и храню evidence за требуемый период.

Снижение объёма auth.log из-за SSH-брутфорса

Мой auth.log или journald заполняется Failed password и Invalid user, из-за ротации теряется полезная история, а парсер логов тратит ресурсы. Я не хочу отключать аудит, потому что успешный вход нужно расследовать. Как мне сократить поток событий перебора SSH?

С SSH Protector я блокирую источник в фаерволе после серии отказов, поэтому следующие TCP-соединения не доходят до sshd и не создают столько записей. Я сохраняю системный аудит, отдельно контролирую размер/retention journald и использую историю атак в панели как индекс, а не как замену исходному журналу.

Бесплатно я закрываю SSH до VPN/allowlist, отключаю пароли и стандартные логины, а fail2ban направляю в nftables set с timeout. Я настраиваю SystemMaxUse и ротацию journald/rsyslog, отправляю Accepted и ключевые Failed-события на внешний syslog и не уменьшаю LogLevel ниже значения, нужного для расследования.

Автоматизация Linux-блокировок вместо ручного blacklist

Я вручную копирую IP из auth.log в ufw/iptables, но адреса быстро меняются, старые правила не удаляются, цепочка растёт и одна ошибка может закрыть мой доступ. Поддержка blacklist стала отдельной ежедневной работой. Как мне автоматизировать блокировку SSH-брутфорса безопасно?

С SSH Protector я задаю порог и окно один раз, после чего агент локально создаёт и снимает блокировки, а whitelist имеет приоритет. Я использую бан сети там, где атакующий ротирует соседние адреса, проверяю изменения в панели и сохраняю резервную консоль перед первой политикой.

Бесплатно я заменяю отдельные вечные iptables rules на nftables set с timeout или fail2ban action, задаю maxretry/findtime/bantime и ignoreip для VPN. Я тестирую фильтр на реальных строках журнала, включаю recidive осторожно, ограничиваю размер набора и мониторю ошибки reload после обновления дистрибутива.

Управление защитой SSH у нескольких клиентов

Я обслуживаю Linux-серверы нескольких заказчиков на Debian, Ubuntu, RHEL и ARM, у каждого свои порты, доверенные сети и контакты. Локальные fail2ban и firewall-конфиги расходятся, а общий whitelist между клиентами недопустим. Как мне централизовать защиту SSH в мультиклиентском парке?

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

Бесплатно я описываю sshd, fail2ban и nftables ролями Ansible с отдельным inventory и vault каждого клиента, проверяю изменения в CI и собираю журналы в Wazuh/центральный syslog с tenant-тегами. Я автоматически сравниваю конфиг с baseline и никогда не объединяю ключи, CIDR и секреты разных заказчиков.

Автономная защита SSH при нестабильном интернете

Мой Linux-сервер стоит в филиале или за нестабильным каналом: облачная панель и DNS иногда недоступны, но SSH внутри или через проброшенный порт продолжает отвечать. Защита не должна ждать удалённого API для каждого решения. Как мне сохранить блокировку SSH-брутфорса офлайн?

С SSH Protector я заранее применяю политику на агенте; он продолжает читать локальный журнал и менять системный фаервол по последней конфигурации, когда связь с панелью потеряна. Я синхронизирую whitelist до отключения, проверяю накопленную историю после восстановления и не открываю входящий порт управления агентом.

Бесплатно я делаю контроль полностью локальным: nftables/ufw разрешает SSH только с VPN или нужных подсетей, а fail2ban работает по journald без внешней сети. Я сохраняю правила на загрузку, ставлю локальную очередь для уведомлений, тестирую перезапуск без DNS и оставляю физическую/провайдерскую консоль для восстановления ошибочного правила.

Замена fail2ban без разрыва в защите

На этом Linux-сервере fail2ban работает два года, jail для sshd исправен. Хочу попробовать вместо него управляемый агент, но оставить порт 22 без защиты даже на несколько минут нельзя, и не хочется, чтобы два инструмента дрались за одни и те же правила firewall. Как заменить fail2ban на SSH Protector без простоя?

Я ставлю агент SSH Protector, не останавливая fail2ban. У агента своя отдельная таблица nftables (inet sshprotector, на старых хостах — пространство имён ipset с префиксом), и он перестраивает только её, поэтому цепочек fail2ban не касается и ни один из двоих не откатывает другого. При установке я сразу добавляю свой адрес в белый список, затем сутки смотрю в панели, ловит ли агент те же источники, что и jail. Только после этого останавливаю fail2ban и убираю его правила. Если передумаю, удаление агента забирает его правила с собой и оставляет firewall прежним.

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

Выбор между CrowdSec и управляемым агентом

Сравниваю варианты защиты от брутфорса SSH для небольшого парка Linux-серверов, и всё время всплывает CrowdSec: открытый исходный код, общий блок-лист сообщества, охват шире, чем один SSH. Что SSH Protector делает такого, чего не делает CrowdSec, и как между ними выбирать?

Они решают пересекающиеся задачи с разных сторон, и я выбираю по форме, а не по баллам. CrowdSec — это движок с языком сценариев, отдельно устанавливаемыми компонентами блокировки и блок-листом, который наполняют все, кто его запускает; охват далеко выходит за SSH. SSH Protector — один бинарник, делающий одно: читает лог аутентификации SSH, SFTP и FTP, банит всю подсеть /24 атакующего в собственной таблице nftables, сохраняет бан после перезагрузки, определяет настоящий порт sshd вместо предположения о 22 и отчитывается в панель, которая скажет, когда защищённый сервер замолчал. Репутация делится между защищёнными аккаунтами, а не со всем интернетом.

То есть решение — про то, что у меня на самом деле есть. Нужна широта — HTTP, базы, произвольные источники логов, собственные сценарии детекта — у CrowdSec для этого есть место, и запуск ничего не стоит. Если же у меня несколько Linux-машин с открытым портом SSH и некому поддерживать стек детекта, мне нужна узкая вещь, которая права без настройки. Я не гонял их друг против друга на одном хосте, поэтому не выбираю по цифрам производительности — и тем, кто ими размахивает, тоже не стоит.

Защитите свой первый сервер уже сегодня

Тариф Free остаётся бесплатным навсегда. Перейти на платный тариф можно в один клик, когда понадобится.

10Доверие

Кто это пишет, кому вы платите и что агент может сделать на вашем сервере

Три вопроса, на которые стоит получить ответ до того, как ставить на боевой сервер что-либо с правами администратора.

Кто это пишет01

SSH Protector пишет Виктор Г. Бобров, ведущий специалист по безопасности серверов в Recovery Toolbox: 20+ лет в системной разработке и безопасности, сертификаты Microsoft MCSD/MCDBA. Правила обнаружения, логика банов и статьи на этом сайте - его работа, опубликованная под его именем, а не под безымянным брендом. Об авторе →

Кому вы платите02

Поставщик - File Master LLC, компания, зарегистрированная в Болгарии (ЕС): Bulstat/VAT 180842207, офис в Варне, доступна по телефону и почте. Платежи проводит PayPro Global как merchant of record; оферта, политика конфиденциальности и соглашение об обработке данных опубликованы полностью, а не в пересказе. Условия использования · Политика конфиденциальности · DPA

Что агент может и чего не может03

Агент читает журнал аутентификации SSH своего же хоста и пишет правила nftables на нём же. Он не открывает входящих портов, не имеет канала удалённых команд и наружу ходит только по HTTPS. Атакующих возможностей у него нет: ничем внутри него нельзя атаковать другую машину. Решение о бане принимается локально, поэтому защита работает и без связи с облаком, а ваш текущий IP попадает в белый список при установке - агент не может закрыть вам доступ к вашему же серверу. Установщик подписан. Как это работает →

11Ресурсы

Ресурсы: протокол, атаки и стандарты, внутри которых всё это находится

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

Ссылки ведут на сами источники: Wikidata там, где у сущности есть идентификатор, и первоисточник там, где его нет.

Recovery Toolbox / File Master LLC

Связаться с Recovery Toolbox

Контакты Recovery Toolbox и File Master LLC, а также профиль Виктора Г. Боброва, ведущего специалиста компании по безопасности.

Офис компании

File Master LLC - юридическое лицо, которое стоит за онлайн-сервисами и программными продуктами Recovery Toolbox.

File Master LLC
Serena app., office C13
Golden Sands, Varna, 9007
Болгария, Европейский союз
Булстат/НДС
180842207
Телефон
+359 88 2253194

О Recovery Toolbox

File Master LLC разрабатывает и поддерживает онлайн-сервисы и программные продукты Recovery Toolbox для восстановления повреждённых файлов, баз данных и почтовых форматов. Компания создаёт практичные инструменты восстановления для пользователей, ИТ-специалистов и бизнеса, которым нужно вернуть доступ к повреждённым данным.

Мы будем рады вашим замечаниям и предложениям. Пожалуйста, присылайте отзывы о сайте по электронной почте: webmaster@recoverytoolbox.com

Victor G. Bobrov, server security specialist and author of SSH Protector
Специалист по безопасности

Victor G. Bobrov

Специалист по безопасности серверов · 20+ лет в системной разработке и безопасности

Виктор Г. Бобров отвечает за безопасность в File Master LLC / Recovery Toolbox. Он проектирует логику обнаружения и блокировки в SSH Protector: чтение журнала аутентификации SSH, отличие брутфорса и распыления паролей от обычной опечатки, бан атакующей подсети одним правилом nftables и обмен репутацией атакующих между защищёнными парками серверов.

  • Защита от брутфорса
  • Харденинг Linux и SSH
  • nftables и сетевые политики
  • MCSD
  • MCDBA
Об авторе →

Сертификаты Microsoft

Microsoft Certified Solutions Developer - MCSD. Microsoft Certified Database Administrator - MCDBA.

MCSD MCDBA