
Архитектура проходного двора
В прошлом коротком посте я писал, как психанул и неделю жил в режиме «НЕТ». Эффект был неожиданный: прод не упал, а я впервые выжил. Но эксперимент — это одно. А продакшен-решение — другое.
Я сел анализировать, почему вообще этот эксперимент понадобился. И понял: я годами жил с архитектурой Default Allow.
В InfoSec это считается дичью. Представьте админа, который открыл все порты, отключил фаервол и пускает любой пакет, если у того в хедере написано «Ну пожалуйста». Этот сервер ляжет за 5 минут. Но именно так мы строим коммуникацию.
Коллега просит «глянуть» (контекстное переключение)? —
ACCEPT.Заказчик пишет в личку в 22:00? —
ACCEPT.Родственники просят починить утюг в выходной? —
ACCEPT.
Мы боимся отказать, потому что у нас нет протокола отказа. Мы считаем, что «Да» — это норма, а «Нет» — это конфликт. В итоге: мой Uptime падает, Latency растет, а я обслуживаю чужой трафик.
Я решил переписать свой iptables и внедрить политику Default Deny на уровне личности. Вот моя документация.
ШАГ 1: Анализ трафика (Access Logs)
Прежде чем блокировать, надо понять, кто нас DDoS-ит. Я поднял логи (историю чатов и календаря) за месяц. Весь мусорный трафик делится на 3 класса:
«Паразитная нагрузка»: Запросы, которые можно делегировать или вообще не делать. («Пришли отчет, который никто не читает»).
«Асинхронный ад»: Люди, которые не умеют в текст и шлют войсы, или звонят без предупреждения. Это блокирует мой I/O поток.
«Эмоциональный пинг»: Коллеги, которые приходят не за решением, а чтобы слить тревогу. («Ой, всё пропало, мы не успеем»). Они жрут CPU, не принося полезной нагрузки.
ШАГ 2: Конфигурация (Ruleset)
Я написал для себя жесткий конфиг. Это не «личные границы» (психологический термин, который никто не понимает). Это SLA (Service Level Agreement).
Я опубликовал его для команды. Выглядит примерно так (псевдокод):
YAML
# HUMAN_FIREWALL_CONFIG.yaml
policy: DEFAULT_DENY
rules:
- id: jira_ticket_required
match: "Task request without link"
action: DROP
response: "400 Bad Request. Нет тикета — нет задачи. Заведи, пожалуйста."
- id: no_voice_messages
match: "Audio content"
action: REJECT
response: "415 Unsupported Media Type. Я не слушаю войсы. Пиши текстом."
- id: deep_work_window
time: "10:00 - 14:00"
action: DO_NOT_DISTURB
exception: "Critical Production Incident"ШАГ 3: Реализация ответов (HTTP Response Codes)
Самое сложное — внедрить это в живое общение. Сказать «Нет» страшно. Но я нашел хак. Я перестал оправдываться («извини, не могу, у меня кошка рожает») и начал выдавать стандартизированные коды ошибок.
Когда ты отвечаешь как система — четко, нейтрально и предсказуемо — люди не обижаются. Они адаптируются.
Сценарий 1: «Срочно глянь!»
Вместо того чтобы бросать всё и смотреть, я выдаю 503 Service Unavailable.
«Сейчас я занят архитектурой. Вернусь к входящим в 16:00. Если это блокирует релиз — пиши техлиду».
Сценарий 2: Нытье в курилке
Вместо того чтобы включаться и успокаивать, я выдаю 204 No Content. Я просто молчу и киваю. Я не выделяю ресурсы на обработку этого скрипта. Человек видит, что сервер не отвечает, и уходит к другому.
Сценарий 3: Манипуляция («Ты же профессионал, сделай овертайм»)
Это попытка SQL-инъекции в моё чувство вины. Ответ: 403 Forbidden.
«Я не работаю по выходным. Это правило. Можем обсудить в понедельник в 10:00».
Результаты патча
Прошло почти две недели.
Нагрузка на CPU упала на 40%. Я перестал греть воздух.
Окружение обучилось. Нейросетка коллег поняла: «Сюда с мусором нельзя, тут стоит WAF (Web Application Firewall)». Трафик стал чище.
Уважение. Надежный сервер, который работает по правилам, ценят больше, чем глючный, который пытается угодить всем и падает.
Вывод
Ваша безотказность — это уязвимость. Если у вас нет документации к вашему API, пользователи (коллеги, родные) будут тыкаться в вас рандомными запросами, пока не сломают.
Напишите свой конфиг. Опубликуйте его. И держите порт 80 закрытым для всех, кто не прошел авторизацию.
P.S. Если тема инженерного подхода к себе («Личный DevOps») заходит — я собрал свои наработки в PDF-гайд «System Diagnostics». Там есть чек-лист по поиску утечек памяти и базовые настройки «Фаервола». Без маркетинга, чисто мануал. Лежит в моем ТГ-канале (ссылка в профиле).
