惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Schneier on Security
P
Proofpoint News Feed
Apple Machine Learning Research
Apple Machine Learning Research
WordPress大学
WordPress大学
博客园 - Franky
V
V2EX
爱范儿
爱范儿
J
Java Code Geeks
小众软件
小众软件
Last Week in AI
Last Week in AI
The Cloudflare Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Hugging Face - Blog
Hugging Face - Blog
T
The Blog of Author Tim Ferriss
酷 壳 – CoolShell
酷 壳 – CoolShell
The Register - Security
The Register - Security
GbyAI
GbyAI
Vercel News
Vercel News
Y
Y Combinator Blog
腾讯CDC
F
Fortinet All Blogs
I
InfoQ
N
Netflix TechBlog - Medium
B
Blog RSS Feed
D
Docker
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
量子位
博客园 - 司徒正美
阮一峰的网络日志
阮一峰的网络日志
The GitHub Blog
The GitHub Blog
Microsoft Security Blog
Microsoft Security Blog
V
Visual Studio Blog
博客园 - 三生石上(FineUI控件)
宝玉的分享
宝玉的分享
Blog — PlanetScale
Blog — PlanetScale
H
Help Net Security
云风的 BLOG
云风的 BLOG
A
About on SuperTechFans
Scott Helme
Scott Helme
T
Tor Project blog
U
Unit 42
Google Online Security Blog
Google Online Security Blog
PCI Perspectives
PCI Perspectives
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
NISL@THU
NISL@THU
D
Darknet – Hacking Tools, Hacker News & Cyber Security
aimingoo的专栏
aimingoo的专栏
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Stack Overflow Blog
Stack Overflow Blog
Security Archives - TechRepublic
Security Archives - TechRepublic

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Fail2Ban больше не нужен? Разбираем PerSourcePenalties в OpenSSH на Ubuntu 26.04
Иван · 2026-05-08 · via Все публикации подряд на Хабре

Простой

6 мин

26K

Начиная с OpenSSH 9.7, sshd умеет автоматически ограничивать на время подозрительные IP без Fail2Ban и iptables. В Ubuntu 26.04 эта функция уже включена по умолчанию — даже если в sshd_config про неё ничего не написано. Предлагаю попробовать разобраться с тем, как это работает.

Disclaimer: статья написана без использования ИИ. Нейросеть использовалась только для стилистической редактуры. Ничего не рекламирую и в ТГ-чаты не зазываю. Гараж не продаю.

Как вы знаете, в прошлом месяце вышла новая LTS-версия Ubuntu 26.04 — Resolute Raccoon. Читая патчноуты (да, существует много людей, которые их читают), в пункте про OpenSSH я обнаружил вот такой интересный момент: новая директива PerSourcePenalties будет «наказывать» адреса клиентов, которые по какой-либо причине не завершают аутентификацию. 

Вообще, функция далеко не новая. Разработчики OpenSSH добавили её ещё в 2024 году (рассылка) и включили по умолчанию в версии 9.7, но эта версия не попала в Ubuntu 24.04.

Проверяем максимальную версию доступную для обновления в Ubuntu 24,04

Проверяем максимальную версию доступную для обновления в Ubuntu 24,04

В Ubuntu 26.04 «из коробки» поставляется OpenSSH версии 10.2p1 от 27 января 2026. Следовательно, по умолчанию теперь всё включено. Я раскатил себе официальный образ, полез смотреть конфиги, и… в них ничего нет! Получается, что функциональность есть и включена, но в конфиге нет ни одного слова про это. И если вы не читали патчноуты, то даже не знаете что оно у вас есть.

В Ubuntu 26.04 проверить, что оно включено, можно командой:

 sshd -T | grep -i persource
Проверяем включено ли.

Проверяем включено ли.

Нас интересует строка:

persourcepenalties crash:90 authfail:5 noauth:1 grace-exceeded:10 refuseconnection:10 max:600 min:15 max-sources4:65536 max-sources6:65536 overflow:permissive overflow6:permissive

Параметры новой директивы

Давайте разберём каждый параметр по порядку.

Основные штрафы (в секундах)

  • crash:90 — самый жёсткий штраф. Присваивается, если клиент вызывает сбой или аномальное завершение процесса sshd. Это защита от потенциальных эксплойтов и нестабильных клиентов.

  • authfail:5 — неудачная аутентификация (неверный пароль, ключ, метод и т. д.). Классический брутфорс. Каждый провал добавляет 5 секунд штрафа.

  • noauth:1 — клиент подключился, не предпринял вообще никаких действий по аутентификации и отключился. Типичное поведение сканеров и «шумов» интернета.

  • grace-exceeded:10 — клиент не успел пройти аутентификацию за время LoginGraceTime (по умолчанию 120 секунд). Добавляет 10 секунд штрафа.

  • refuseconnection:10 — сервер сам отказал в соединении (например, из-за превышения MaxStartups). Также 10 секунд.

Пороги срабатывания

  • min:15 — минимальный накопленный штраф, при котором IP начинает блокироваться. Пока сумма штрафов меньше 15 секунд — соединения принимаются нормально. Это защищает от случайных единичных ошибок.

  • max:600 — максимальный штраф (10 минут). Даже если клиент «наберёт» больше, штраф не превысит это значение.

Ограничения по количеству отслеживаемых источников

  • max-sources4:65536 — максимальное количество IPv4-адресов, за которыми одновременно следит sshd.

  • max-sources6:65536 — то же для IPv6.

Значения по умолчанию очень высокие — по сути, «отслеживать всех».

Поведение при переполнении таблицы

  • overflow:permissive

  • overflow6:permissive

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

/* Delete the soonest-to-expire penalties. */

Сначала я не правильно понял, как работает этот механизм, но в комментах меня поправили. Спасибо за это @firegurafiku

PerSourcePenalties не является заменой Fail2Ban. В отличие от него, механизм не банит IP полностью, а временно замедляет или блокирует подключения пропорционально степени «виновности» источника (если буфер не переполнен).

Как работает PerSourcePenalties

Отказ в соединении инициируется самим процессом sshd (на уровне приложения), а не через правила брандмауэра (iptables/nftables).

Механизм работает следующим образом:

  1. Принятие соединения: основной процесс sshd принимает входящее TCP-соединение (выполняет accept()).

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

  3. Немедленный разрыв: если накопленный штраф для этого IP превышает установленный порог, sshd просто закрывает сокет, не запуская дочерний процесс для аутентификации.

Почему это сделано именно так?

Автономность. Функциональность доступна «из коробки» на любой операционной системе (Linux, BSD, macOS) без необходимости иметь права root для модификации правил фильтрации пакетов.

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

Отсутствие интеграции с ядром. В отличие от того же Fail2Ban, OpenSSH не вызывает внешние команды вроде iptables -A.... Это быстрее и исключает риск того, что ошибка в скрипте заблокирует доступ ко всему серверу.

Важное замечание. PerSourcePenalties работает по IP. А значит, офисы, VPN, мобильные операторы, CGNAT могут случайно «наказывать» сразу группу пользователей.

Рубрика «э-э-эксперименты» 

Давайте протестируем, как это работает на практике. Я попробую подключиться с неверным паролем несколько раз подряд и буду смотреть логи:

IP спрятал, чтобы не привлекать внимание санитаров скрипт-кидди

IP спрятал, чтобы не привлекать внимание санитаров скрипт-кидди

Кстати, в обычном логе этого не видно. Мне пришлось добавить настройку LogLevel VERBOSE в конфиг /etc/ssh/sshd_config.

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

Но вручную никто такого не делает, так что автоматизируем. Я запустил Hydra на стандартных значениях и с rockyou:

Смотрим логи в терминале “жертвы”:

На первом этапе Hydra создала большое количество соединений без попытки аутентификации. За это IP получил минимальный штраф:

srclimit_penalise: ipv4: new х.х.х.11/32 deferred penalty of 1 seconds -  это noauth штраф (1 секунда)

for penalty: connections without attempting authentication

Далее сервер начал отбрасывать избыточные соединения по лимиту MaxStartups.

Затем, когда соединения дошли до стадии ввода пароля, начали накапливаться штрафы за failed authentication. Критический момент наступил, когда накопленный штраф превысил порог:

srclimit_penalise: х.х.х.11/32: activating ipv4 penalty of 19 seconds  - накопленный штраф

srclimit_penalise: х.х.х.11/32: activating ipv4 penalty of 19 seconds  - накопленный штраф

После этого все новые соединения от этого IP стали отбрасываться с сообщением

drop connection ... penalty: failed authentication.

Важный нюанс: С точки зрения атакующего это выглядит как «Connection closed by remote host» сразу после установки TCP-сессии.

Сравнение с Fail2Ban: когда что использовать

Многие администраторы сразу вспоминают Fail2Ban, когда речь заходит о защите SSH. Давайте сравним два подхода.

Параметр

PerSourcePenalties (OpenSSH)

Fail2Ban

Место работы

Встроено в sshd

Внешний демон, парсит логи

Скорость реакции

Мгновенная (в момент события)

Задержка (зависит от частоты проверки логов)

Тип блокировки

Временная, динамическая (секунды — десятки минут)

Обычно жёсткая и долгая (минуты — сутки)

Ресурсоёмкость

Очень низкая

Средняя и выше (постоянный мониторинг логов)

Гибкость штрафов

Высокая (разные штрафы за разные нарушения)

Высокая, но требует написания фильтров

Защита от DoS на саму защиту

Есть (overflow:permissive)

Зависит от конфигурации

Постоянные баны

Не сделать

Легко и привычно

Если смотреть на плюсы обоих подходов, то вот что можно выделить.

  • Работает из коробки и включена по умолчанию в Ubuntu 26.04.

  • Не требует парсинга логов — реакция быстрее и надёжнее.

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

  • Устойчив к атакам на сам механизм защиты.

  • Минимальное потребление ресурсов.

Преимущества Fail2Ban

  • Более привычный и "видимый" инструмент.

  • Можно банить навсегда или на очень долгий срок.

  • Работает с любыми сервисами.

  • Легко интегрируется с iptables/nftables, Fail2Ban-ботами в Telegram, Cloudflare и т.д.

  • Богатая экосистема готовых jail'ов.

Отключать механизм полностью я бы не рекомендовал, но если это всё же необходимо, можно создать отдельный override-конфиг:

/etc/ssh/sshd_config.d/99-pensourcepenalties-disable.conf

Имя файла может быть любым. Числовой префикс определяет порядок загрузки конфигурации.

Полностью отключить механизм можно директивой:

PerSourcePenalties no

Либо отключить только отдельные типы штрафов:

PerSourcePenalties authfail:0 noauth:0

После изменения конфигурации не забудьте перезапустить sshd:

systemctl restart ssh

Выводы и полезный совет

PerSourcePenalties не заменяет Fail2Ban полностью, а отлично дополняет его, как первая линия обороны (быстрая реакция на шум и лёгкий брутфорс).

Fail2Ban — отлично подходит на роль второй линии (долгие баны за упорные атаки, защита других сервисов, удобный мониторинг).

После тестов у меня не появилось ощущения, что PerSourcePenalties должен заменить Fail2Ban. Но теперь SSH-сервер хотя бы умеет самостоятельно отбиваться от самого примитивного шума и брутфорса без внешних костылей. И, честно говоря, для встроенного механизма это работает неожиданно неплохо. Что скажете?