Зачем каждому инженеру фундамент безопасности
Безопасность — это образ мышления, а не чек-лист. Урок задаёт рамку всего кластера кибербезопасности через четыре вопроса Шостака, разводит угрозу, уязвимость и риск и показывает, как foundations, red, blue и cloud питают знакомый трек appsec.
Ты выкатываешь фичу: пользователь загружает аватар, а сервис ресайза картинок забирает файл по URL. Ревью в восторге: аккуратный хендлер, валидация content-type, хорошие тесты. Три недели спустя кто-то указывает в качестве «URL картинки» http://169.254.169.254/latest/meta-data/iam/security-credentials/, и твой сервер послушно делает запрос — возвращая IAM-учётные данные, которыми твой EC2-инстанс читает все твои бакеты. Ничто не было сломано. Каждая строка делала ровно то, что ей велели. Пробел был в том, что никто не задал вопрос безопасности: что атакующий может заставить этот код сделать вопреки моему замыслу? Именно этот вопрос — а не отдельный инструмент или чек-лист — весь кластер учит задавать рефлекторно.
К концу урока ты сможешь рассматривать любую систему, которую строишь, через четыре вопроса безопасности, без запинки отличать угрозу от уязвимости и от риска и размещать треки offensive, defensive, cloud и appsec на одной ментальной карте.
Безопасность — это образ мышления, а не фича
Самое дорогое заблуждение, которое компетентный инженер приносит в безопасность, — будто это слой: тут WAF, там сканер, галочка в пайплайне деплоя. Это не так. Безопасность — это враждебный склад ума, который ты применяешь ко всему, что проектируешь. Функциональный инженер спрашивает: «работает ли это при корректном использовании?» Security-компетентный инженер дополнительно спрашивает: «а что будет, если кто-то использует это некорректно нарочно?» Этот единственный дополнительный вопрос и есть разница между кодом, который проходит ревью, и кодом, который выживает при контакте с интернетом.
Адам Шостак, годами руливший моделированием угроз в Microsoft, свёл всю дисциплину к четырём вопросам, которые масштабируются от наброска на доске до мультирегиональной платформы:
- Что мы строим? Нарисуй систему. Где данные входят, где пересекают границу доверия (браузер → сервер, сервис → база, твой код → сторонний API) и где выходят?
- Что может пойти не так? Для каждого компонента и каждой границы перечисли, как атакующий мог бы этим злоупотребить. Ресайзер, забирающий выбранный атакующим URL, — это «что может пойти не так», которое делает видимым шаг «что мы строим».
- Что мы с этим будем делать? Выбери меры защиты — и сознательно принять риск или передать его (страховка, SOC 2 поставщика) тоже считается валидным ответом. Не на каждый риск вешается контроль.
- Хорошо ли мы сработали? Проверь, что меры реально держат. Пентест, ревью, мониторинг. Контроль, который ты ни разу не проверил, — это контроль, которого у тебя нет.
Эти четыре вопроса можно прогнать за пять минут против одного эндпоинта или за два дня против платёжной платформы. Глубина масштабируется; вопросы не меняются. Их усвоение и есть настоящая цель «иметь фундамент безопасности» — всё остальное в кластере навешивается на эту рамку.
Угроза, уязвимость, риск: три слова, которые путают, а зря
Неточный словарь — вот почему разговоры о безопасности ходят по кругу. Эти три слова называют три разные вещи, и старший инженер держит их чёткими, потому что различие диктует, что ты реально делаешь.
- Угроза — это кто и чего он хочет: потенциальный субъект и вредное действие, которое он мог бы совершить. «Заскучавший аутентифицированный пользователь, желающий читать чужие счета.» Угрозы существуют независимо от того, есть ли в твоей системе изъян; это свойство мира, а не твоего кода.
- Уязвимость — это изъян в твоей системе, который угроза могла бы проэксплуатировать. «Эндпоинт счёта делает запрос
WHERE id = ?без проверкиowner_id.» Уязвимости — свойство твоего кода и конфигурации, это та часть, которую ты контролируешь. - Риск — это комбинация: насколько вероятно, что эта угроза встретит эту уязвимость, и насколько плохими будут последствия. По риску ты приоритизируешь, потому что починить всё нельзя. Уязвимость, до которой никто не может дотянуться и которая ничего ценного не раскрывает, — низкий риск; тот же изъян на пути аутентификации — пожар по высшему разряду.
Распространённое сокращение: риск ≈ вероятность × ущерб, где уязвимость поднимает вероятность, а ценность того, что за ней стоит, поднимает ущерб. Практическая выгода — это триаж. Ты чинишь не «больше всего уязвимостей», а снижаешь «больше всего риска». Поэтому опечатка в тексте ошибки (уязвимость — раскрытие информации) стоит ниже неаутентифицированного админ-эндпоинта, хотя технически оба — изъяны.
| Термин | Что это | Чьё это | Пример со счётом |
|---|---|---|---|
| Угроза | Субъект + вредная цель | Мира (удалить нельзя) | Пользователь, желающий читать чужие счета |
| Уязвимость | Изъян, который субъект эксплуатирует | Твоё (код/конфиг) | В запросе нет проверки owner_id |
| Риск | Вероятность × ущерб этой пары | Твоё (это то, что триажишь) | Высокий: легко проэксплуатировать, утекают ПДн |
▸Почему это работает
Зачем зацикливаться на формулировках? Потому что три слова отображаются на три разные задачи, и их смешение отправляет исправления не туда. Угрозу устранить нельзя — заскучавшие пользователи и группы вымогателей существуют независимо от твоего кода, — поэтому попытка «убрать угрозу» — впустую потраченные усилия. Уязвимость ты можешь убрать, а риском ты управляешь, решая, какие уязвимости стоит чинить сейчас. Когда стейкхолдер спрашивает «какой у нас тут риск?», он задаёт вопрос «вероятность × ущерб», и ответ списком уязвимостей (а тем более списком угроз) — вот почему так много security-ревью на ощупь генерируют шум вместо решений.
Глубокая защита: считай, что каждый слой откажет
Четвёртая несущая идея — что ни один отдельный контроль не должен быть единственным, что стоит между атакующим и добычей. Глубокая защита (defense in depth) означает наслаивание независимых контролей так, чтобы отказ любого из них не заканчивал игру. WAF пропустил полезную нагрузку → её ловит валидация ввода. В валидации пробел → параметризованные запросы всё равно обезвреживают инъекцию. Кто-то украл токен → короткое время жизни токена и отзыв ограничивают радиус поражения. Каждый слой исходит из того, что слой перед ним рано или поздно откажет, потому что в проде он рано или поздно отказывает.
Вот практическая причина, почему «что мы будем делать?» редко имеет однострочный ответ. История с ресайзером — урок глубокой защиты: фикс не один, а несколько — проверить, что URL разрешается в публичный адрес, заблокировать link-local диапазон метаданных на сетевом уровне, дать инстансу least-privilege роль, чтобы украденные учётные данные стоили почти ничего, и детектировать аномальный исходящий запрос. Любой из них в одиночку — единая точка отказа.
Как складывается кластер
Когда мышление на месте, остальной кластер кибербезопасности — это просто то, куда ты его направляешь. Foundations — это сама рамка: четыре вопроса, словарь, моделирование угроз — и всё ниже по течению её наследует. Дальше поле дробится на роли, определяемые тем, в каком вопросе они живут:
- Red (offensive) живёт в что может пойти не так. Red-команды и пентестеры намеренно думают как атакующие, находя уязвимости, которые твой дизайн упустил. Их выход — «вот что реально может сделать противник».
- Blue (defensive) живёт в что мы будем делать и хорошо ли мы сработали. Детектирование, мониторинг, реагирование на инциденты, харденинг. Их выход — «мы это поймали, локализовали, и снова это не сработает».
- Purple — это намеренное сотрудничество двух: red показывает blue ровно то, как заходит атака, чтобы blue построил детект, который её ловит. Это не столько отдельная команда, сколько практика замыкания петли между offense и defense.
- Cloud — это современная местность, на которой всё это работает: IAM, сетевая сегментация, проблема эндпоинта метаданных из Hook, управление секретами. Поверхность атаки переехала в конфигурацию, поэтому огромная доля реальных инцидентов сегодня — это инциденты облачной мисконфигурации.
А трек application-security, который ты, возможно, уже знаешь, — OWASP Top 10, OAuth, JWT — это appsec-ступень той же лестницы: мышление foundations, применённое конкретно к слою веб-приложения, который ты строишь каждый день. OWASP Top 10 — это буквально список «что может пойти не так» для веб-приложений, ранжированный по реальным данным. Когда ты изучал IDOR и авторизацию deny-by-default, ты прогонял второй вопрос Шостака против HTTP-эндпоинтов. Этот кластер расширяет ту же линзу на всю систему.
Где ты стоишь
Ты не стартуешь с нуля. Как инженер middle-plus ты уже рассуждаешь о краевых случаях, режимах отказа и недоверенном вводе — безопасность это та же строгость, развёрнутая враждебно. Цель кластера — не сделать тебя фултайм red-тимером или SOC-аналитиком; она в том, чтобы сделать тебя двуязычным: способным думать как атакующий достаточно, чтобы предвидеть злоупотребление, и как защитник достаточно, чтобы построить контроль. Эта беглость и есть то, что позволяет тебе сидеть на ревью дизайна и сказать «погодите — а что мешает кому-то направить этот fetch на эндпоинт метаданных?» до того, как код уедет, а не через три недели после.
Твоя команда обнаружила, что внутренний эндпоинт отчётов возвращает данные любого пользователя, если передать его id, но он доступен только из корпоративного VPN. Кто-то говорит «низкий риск, он внутренний». Как должен это сформулировать security-компетентный инженер?
Коллега говорит: «Вымогатели — это уязвимость, которую надо запатчить.» В чём точная поправка?
В четырёх вопросах Шостака — в каком из них в первую очередь живёт blue-команда (детектирование, мониторинг, реагирование на инциденты)?
Расставь четыре вопроса безопасности Шостака так, как ты прогонял бы их по новой фиче, от первого к последнему:
- 1 Что мы строим? (нарисуй систему и её границы доверия)
- 2 Что может пойти не так? (перечисли, как каждую часть можно злоупотребить)
- 3 Что мы будем делать? (выбери меры, либо прими/передай)
- 4 Хорошо ли мы сработали? (проверь, что контроли реально держат)
- 01Назови четыре вопроса безопасности Шостака по порядку и объясни, почему их усвоение — а не запоминание инструментов — и есть настоящий «фундамент безопасности».
- 02Дай определения угрозы, уязвимости и риска так, чтобы их нельзя было спутать, и объясни, почему различие меняет то, что ты реально делаешь.
- 03Нарисуй карту кластера кибербезопасности: как соотносятся foundations, red, blue, cloud и трек appsec?
Безопасность — это образ мышления, а не фича, которую прикручивают: security-компетентный инженер спрашивает не только «работает ли это корректно?», но и «что атакующий может заставить это сделать вопреки моему замыслу?». Четыре вопроса Адама Шостака — что мы строим, что может пойти не так, что мы будем делать, хорошо ли мы сработали — это рамка, масштабирующаяся от одного эндпоинта до целой платформы, и их усвоение и есть то, что в действительности значит «иметь фундамент безопасности». Держи три слова чёткими: угроза — это субъект с целью (удалить нельзя), уязвимость — изъян в твоём коде (убрать можно), а риск — вероятность × ущерб их встречи (по нему ты триажишь). Глубокая защита исходит из того, что каждый слой рано или поздно откажет, поэтому ты наслаиваешь независимые контроли. На карте foundations — это мышление; red живёт в «что может пойти не так», blue — в «что делаем» и «сработало ли», purple замыкает петлю между ними, а cloud — это местность, тогда как трек appsec (OWASP/OAuth/JWT) — то же мышление, применённое к веб-слою, который ты уже строишь. Цель — быть двуязычным в мышлении атакующего и защитника, чтобы поймать вопрос про эндпоинт метаданных на ревью дизайна, а не в канале инцидентов.
Практика
Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.