Суть Читайте реальный конфиг, сниппет распределённого rate-лимитера, настройку HTTP/2-сервера и строку лога WAF — предскажите поведение под атакой и выберите фикс с наибольшим рычагом.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 14 min
Инциденты безопасности диагностируются в конфигах, коде лимитеров и строках логов — а не в слайдах. Читайте каждый артефакт, предсказывайте его поведение под атакой и выбирайте фикс, который сеньор сделает первым.
Цель
Отработайте цикл, который вы проходите в каждом инциденте: прочитать артефакт, найти разрыв между тем, что он делает, и тем, что предполагал оператор, и взяться за изменение с наибольшим рычагом.
Инженер «захардил» хост, увеличив SYN backlog до 4096, и оставил tcp_syncookies=0. Что происходит под спуфнутым SYN-flood и какой фикс имеет наибольший рычаг?
Heads-up Размер backlog — линейный запас; flood в миллионы SYN/sec насыщает любой фиксированный backlog за миллисекунды. Структурный фикс — SYN cookies, а не больший стол.
Heads-up Больше ретраев держит спуфнутые полуоткрытые записи дольше, усугубляя истощение. Их надо убирать быстрее, а cookies убирают слот совсем.
Heads-up SYN cookies — это резерв, включающийся только при переполнении backlog, и совместимый с обычными клиентами; реальная цена — небольшое вычисление хэша на ACK, а не сломанные клиенты за NAT.
Сниппет 2 — распределённый token bucket
-- лимитер на запрос, вызывается на каждом хите APIlocal count = redis.call("INCR", key)if count == 1 then redis.call("EXPIRE", key, window_seconds)endif count > limit then return DENYendreturn ALLOW
Викторина
Completed
Этот лимитер на Redis вызывается на каждом запросе по флоту app-серверов. Под атакой 100k req/sec в чём операционная проблема и какова стандартная митигация?
Heads-up INCR в Redis атомарен — именно поэтому его здесь используют. Проблема в латентности сети на запрос и в том, что Redis становится узким местом, а не в атомарности.
Heads-up Установка EXPIRE при первом инкременте — корректная идиома fixed window; TTL окна задаётся один раз на окно. Утечки нет.
Heads-up Они корректны, но не бесплатны — каждое решение стоит round-trip. При высоких req/sec митигируют локальными счётчиками плюс периодическая глобальная синхронизация.
Сниппет 3 — конфиг HTTP/2-сервера
http2_max_concurrent_streams 128;# нет лимита на rate создания / сброса стримовkeepalive_requests 100000;
Викторина
Completed
Этот конфиг ограничивает конкурентные стримы 128, но никогда не лимитирует rate создания стримов. Почему он остаётся уязвим к HTTP/2 Rapid Reset (CVE-2023-44487)?
Heads-up Атака намеренно держится ниже лимита конкурентности, мгновенно отменяя каждый стрим; цена — в churn create/reset, который сервер всё равно платит и который лимит не видит.
Heads-up Счётчик keepalive соединения не связан; Rapid Reset злоупотребляет жизненным циклом стримов внутри соединения. Фикс — ограничение rate создания/сброса стримов.
Heads-up Rapid Reset — атака истощения ресурсов прикладного уровня (L7) на машину состояний стримов HTTP/2; серверное ограничение rate стримов — именно та митигация, что вендоры выпустили в 2023.
Читая эту хронологию anomaly-scoring WAF (блок при score ≥ threshold=5), какое прочтение верно?
Heads-up К 14:24 p50 равен 6.1 — выше порога 5 — а p99 равен 28.5. Всё распределение сдвинулось в зону атаки; это не здоровый трафик.
Heads-up Блокировка 380k из flood 450k/sec — это работа WAF. Беспокоят 70k, что всё ещё проходят при таком высоком p99 — это зазор тюнинга, а не поломка.
Heads-up Порог — это отсечка anomaly-score (блок при сумме score правил ≥ 5), а не процент трафика.
Итог
Любая защита читается в конфигах и логах. Больший SYN backlog — линейный запас; SYN cookies — структурный фикс. Лимитер на Redis корректен, но каждое решение — round-trip; митигируйте локальным быстрым путём плюс периодическая синхронизация. Лимиты конкурентности не останавливают Rapid Reset; нужно ограничивать rate создания стримов, включая сбросы. А лог anomaly WAF говорит сразу, сдвинулось ли распределение score в зону атаки и пропускает ли ваш порог трафик. Прочитайте артефакт, найдите разрыв между замыслом и поведением, почините самый рычажный первым.