DevSecOps и безопасные пайплайны
SAST/DAST/SCA/IAST, харденинг CI/CD, сканирование секретов, защита цепочки поставок, SBOM, сканирование IaC, пиннинг зависимостей, триаж CVE и security quality gates.
14 вопросов
JuniorТеорияОчень частоЧто анализируют SAST, DAST и SCA и когда каждый из них запускается?
Что анализируют SAST, DAST и SCA и когда каждый из них запускается?
SAST читает исходный код, не запуская его, и находит небезопасные пути в коде. DAST опрашивает запущенный экземпляр и видит поведение в рантайме, но не исходники. SCA проверяет объявленные зависимости на известные уязвимые версии. Каждый закрывает свой класс дефектов.
Типичные ошибки
- ✗Считать SAST и DAST взаимозаменяемыми, а не дополняющими друг друга
- ✗Ждать от SAST находок в рантайм- и деплой-конфигурации, которую он не видит
- ✗Думать, что SCA ищет дефекты своего кода, а не известные проблемы зависимостей
Уточняющие вопросы
- →Почему динамическое тестирование
DASTможет пропустить дефект, который находит статический анализSAST? - →Где между этими тремя находится интерактивное тестирование
IAST?
JuniorТеорияОчень частоКак работает сканирование секретов в репозитории и в CI и что оно пропускает?
Как работает сканирование секретов в репозитории и в CI и что оно пропускает?
Сканеры ищут известные шаблоны учётных данных и строки с высокой энтропией — как pre-commit-хук, в CI и по всей истории. Pre-commit ловит рано, но его можно обойти, поэтому заслоном служит проверка в CI. Новые форматы он пропускает и ничего не ротирует.
Типичные ошибки
- ✗Полагаться только на pre-commit-хук, который разработчик может пропустить
- ✗Сканировать только текущее дерево и никогда — историю репозитория
- ✗Считать сам детект устранением вместо ротации учётных данных
Уточняющие вопросы
- →Почему проверка в CI нужна дополнительно к локальному pre-commit-хуку?
- →Как не утопить команду в ложных срабатываниях детекта по энтропии?
MiddleТеорияОчень частоЗачем триажить находки сканеров и как их шум убивает внедрение?
Зачем триажить находки сканеров и как их шум убивает внедрение?
Отчёт сканера — список гипотез, а не багов: статический анализ переоценивает пути, поэтому многие находки недостижимы или уже закрыты. Триаж подтверждает эксплуатируемость, назначает критичность и владельца. Шум приучает игнорировать инструмент.
Типичные ошибки
- ✗Считать каждую находку сканера подтверждённой эксплуатируемой уязвимостью
- ✗Оставлять находки без владельца, отчего бэклог растёт, а доверие падает
- ✗Принимать метку критичности сканера за итоговый бизнес-приоритет
Уточняющие вопросы
- →Как сделать подавление находки аудируемым, а не тихим отбрасыванием?
- →Какой сигнал говорит, что уровень шума сканера уже вредит поставке?
JuniorТеорияЧастоЗачем пиннить версии зависимостей и проверять хеши против supply-chain-типосквоттинга?
Зачем пиннить версии зависимостей и проверять хеши против supply-chain-типосквоттинга?
Lockfile фиксирует точную версию и хеш каждой зависимости, прямой и транзитивной, поэтому пересборка тянет те же байты, а перевыпущенный пакет не проходит проверку. Подписи дают происхождение, а прокси-реестр блокирует похожие имена.
Типичные ошибки
- ✗Пиннить прямые зависимости, оставляя транзитивное дерево плавающим
- ✗Записывать версии без хешей, из-за чего перевыпущенные байты проходят
- ✗Читать подпись как доказательство безопасности, а не происхождения
Уточняющие вопросы
- →Как приватный прокси-реестр снижает риск dependency confusion?
- →Чего стоит пиннинг и как при нём быстро получать патчи безопасности?
JuniorТеорияЧастоAPI-ключ попал в общий репозиторий, потом его убрали force-push. Он в безопасности?
API-ключ попал в общий репозиторий, потом его убрали force-push. Он в безопасности?
Нет. Считайте его скомпрометированным с момента попадания — клоны, форки, логи CI и зеркала уже его держат, и force-push оттуда ничего не убирает. Сначала ротация, затем аудит использования за окно экспозиции. Чистка истории — уборка, а не устранение.
Типичные ошибки
- ✗Считать, что force-push или перезапись истории отменяют утечку
- ✗Тянуть с ротацией до подтверждения, что утечкой воспользовались
- ✗Забывать, что логи CI, кэши, форки и зеркала хранят свою копию
Уточняющие вопросы
- →Почему короткоживущие динамические учётные данные из vault сокращают весь этот сценарий?
- →Что должен показать лог аудита ключа, чтобы закрыть окно экспозиции?
MiddleДизайнЧастоПлатформенная команда держит один общий CI-пайплайн для 60 сервисов с релизным поездом раз в две недели. Сканирование уже встроено — статический анализ на каждый pull request, сканирование зависимостей на каждую сборку, сканирование секретов на push — но сегодня все находки носят рекомендательный характер и никто ничего не чинит. Руководство хочет настоящий гейт. Ограничения — pull request не должен стоять заблокированным дольше, чем идёт скан; дежурный должен уметь выкатить хотфикс в продакшен в три часа ночи; платформенная команда владеет пайплайном, но не бэклогами 60 сервисов; любое подавление находки должно пережить аудит через полгода. Спроектируйте гейт. Укажите, что валит сборку, а что только предупреждает, как устроен break-glass и кто отвечает за его использование, и как избежать исхода, где команды тихо выносят скан из блокирующей джобы.
Платформенная команда держит один общий CI-пайплайн для 60 сервисов с релизным поездом раз в две недели. Сканирование уже встроено — статический анализ на каждый pull request, сканирование зависимостей на каждую сборку, сканирование секретов на push — но сегодня все находки носят рекомендательный характер и никто ничего не чинит. Руководство хочет настоящий гейт. Ограничения — pull request не должен стоять заблокированным дольше, чем идёт скан; дежурный должен уметь выкатить хотфикс в продакшен в три часа ночи; платформенная команда владеет пайплайном, но не бэклогами 60 сервисов; любое подавление находки должно пережить аудит через полгода. Спроектируйте гейт. Укажите, что валит сборку, а что только предупреждает, как устроен break-glass и кто отвечает за его использование, и как избежать исхода, где команды тихо выносят скан из блокирующей джобы.
Блокировать только высокоуверенные критичные классы — подтверждённый секрет, достижимую критическую зависимость — остальное в warn. Break-glass — метка самообслуживания: релиз идёт, но security уведомлён и заводится тикет со сроком. Подавления истекают.
Типичные ошибки
- ✗Блокировать по любой критичности, чем приучают команды обходить гейт
- ✗Не давать break-glass, отчего хотфикс по инциденту стоит за сканом
- ✗Разрешать неучтённые и бессрочные подавления, которые аудит не восстановит
Уточняющие вопросы
- →Какая метрика покажет, что гейт обходят, а не удовлетворяют?
- →Почему блокирующий шаг должен жить в коде пайплайна, которым владеет платформа?
SeniorДизайнЧастоВы принимаете программу безопасности приложений в компании с 200 репозиториями, 30 командами поставки и без сканирования безопасности за пределами двух пилотных репозиториев. Руководство даёт два квартала и ноль дополнительных людей. Ограничения — команды владеют своими пайплайнами и правят их свободно; прошлая попытка провалилась, когда блокирующий сканер выдал сотни находок на репозиторий и команды отключили его за неделю; скорость поставки — отслеживаемая метрика для руководства; CI-платформа одна, но языковых стеков четыре. Спроектируйте раскатку так, чтобы сканирование прижилось. Раскройте порядок подключения репозиториев, как не утопить команды в находках в первые недели, как сделать гейт трудно обходимым без надзора за людьми, что вы просите у команд, а что владеете централизованно, и как покажете руководству, что программа работает.
Вы принимаете программу безопасности приложений в компании с 200 репозиториями, 30 командами поставки и без сканирования безопасности за пределами двух пилотных репозиториев. Руководство даёт два квартала и ноль дополнительных людей. Ограничения — команды владеют своими пайплайнами и правят их свободно; прошлая попытка провалилась, когда блокирующий сканер выдал сотни находок на репозиторий и команды отключили его за неделю; скорость поставки — отслеживаемая метрика для руководства; CI-платформа одна, но языковых стеков четыре. Спроектируйте раскатку так, чтобы сканирование прижилось. Раскройте порядок подключения репозиториев, как не утопить команды в находках в первые недели, как сделать гейт трудно обходимым без надзора за людьми, что вы просите у команд, а что владеете централизованно, и как покажете руководству, что программа работает.
Начать в режиме warn и забаселайнить существующие находки, чтобы команды видели только новые. Сканирование — наследуемый центральный шаблон пайплайна: включено по умолчанию, снятие заметно. Подключать по риску. Отчитываться временем устранения и долей обходов.
Типичные ошибки
- ✗Включать блокирующий гейт до баселайна существующего бэклога
- ✗Позволять каждой команде подключать свой сканер, отчего покрытие непроверяемо
- ✗Отчитываться числом находок вместо времени устранения и доли обходов
Уточняющие вопросы
- →Почему наследуемый шаблон пайплайна лучше документации, которой команды должны следовать?
- →Что заставит вас притормозить раскатку в середине квартала?
SeniorДизайнЧастоВ бэклоге уязвимостей 4000 открытых находок от сканирования зависимостей, контейнеров и облачной конфигурации, и ничего не закрывается. Нужно предложить политику управления уязвимостями, которую инженерная организация действительно выполнит. Ограничения — критичность сегодня берётся прямо из оценки каждого инструмента, поэтому 900 находок помечены критическими; сервисы, смотрящие в интернет, и внутренние лежат в одной очереди; часть находок живёт в базовых образах, которыми владеет платформенная команда, а не команды приложений; аудиторский комитет хочет зафиксированные сроки устранения в письменном виде. Спроектируйте политику. Раскройте, как задавать приоритет помимо оценки критичности, какие есть уровни сроков и к чему они привязаны, как назначать владельца, когда уязвимый код писал не он, что происходит при приближении срыва срока, и как не дать политике просто породить второй бэклог просроченного.
В бэклоге уязвимостей 4000 открытых находок от сканирования зависимостей, контейнеров и облачной конфигурации, и ничего не закрывается. Нужно предложить политику управления уязвимостями, которую инженерная организация действительно выполнит. Ограничения — критичность сегодня берётся прямо из оценки каждого инструмента, поэтому 900 находок помечены критическими; сервисы, смотрящие в интернет, и внутренние лежат в одной очереди; часть находок живёт в базовых образах, которыми владеет платформенная команда, а не команды приложений; аудиторский комитет хочет зафиксированные сроки устранения в письменном виде. Спроектируйте политику. Раскройте, как задавать приоритет помимо оценки критичности, какие есть уровни сроков и к чему они привязаны, как назначать владельца, когда уязвимый код писал не он, что происходит при приближении срыва срока, и как не дать политике просто породить второй бэклог просроченного.
Приоритет — это риск, а не одна оценка критичности: сочетайте критичность с сигналами эксплуатации, достижимостью и экспозицией актива. Уровни сроков привязаны к композитной оценке, а отсчёт идёт с триажа. Находки базовых образов уходят платформенной команде по метаданным владения. Срыв срока — принятие риска со сроком.
Типичные ошибки
- ✗Считать оценку критичности приоритетом, а не одним из входов риска
- ✗Назначать находки базовых образов командам, которые не могут их исправить
- ✗Разрешать бессрочное принятие риска вместо решения с ограниченным сроком
Уточняющие вопросы
- →Почему сигналы эксплуатации вроде каталога известных эксплуатируемых так меняют порядок очереди?
- →От чего защищает старт отсчёта срока с триажа, а не с момента сканирования?
MiddleДебаггингИногдаSecurity-стадия этого пайплайна проходит всегда. Почему и как это исправить?
Security-стадия этого пайплайна проходит всегда. Почему и как это исправить?
Скан не может уронить сборку — continue-on-error: true глотает его код возврата, а шаг Gate жёстко делает exit 0. Плюс токен печатается в лог, а write-all работает на незапиненном экшене. Гейтить по реальному коду возврата, убрать echo, ротировать токен, сузить permissions, запинить по SHA.
Типичные ошибки
- ✗Читать зелёную джобу как пройденный гейт, не проверив путь выхода
- ✗Считать
continue-on-errorнастройкой отзывчивости, а не обходом - ✗Удалять утёкший токен из лога вместо ротации самих учётных данных
Уточняющие вопросы
- →Почему пиннинг экшена на commit SHA важнее пиннинга на тег?
- →Как помешать команде снова добавить
continue-on-errorв джобу security?
MiddleДизайнИногдаПлатформенная группа из 40 инженеров держит всю облачную инфраструктуру как модули Terraform и манифесты Kubernetes в одном монорепозитории. Разбор инцидента показал, что бакет хранилища стал публичным из-за однострочного изменения, прошедшего ревью, а кластер запускал нагрузки от root. Ограничения — один репозиторий обслуживает и продакшен, и sandbox-аккаунты, причём sandbox должен остаться разрешающим; у группы уже тысячи существующих ресурсов, которые сегодня не пройдут строгий набор правил; изменения инфраструктуры должны по-прежнему вливаться за день. Спроектируйте сканирование infrastructure-as-code с policy-as-code. Скажите, где сканирование запускается относительно plan и apply, как выражать правила, чтобы они были тестируемыми и ревьюабельными, как ввести набор правил, не заблокировав в первый же день все изменения, и что помешает кому-то сделать apply с ноутбука в обход пайплайна.
Платформенная группа из 40 инженеров держит всю облачную инфраструктуру как модули Terraform и манифесты Kubernetes в одном монорепозитории. Разбор инцидента показал, что бакет хранилища стал публичным из-за однострочного изменения, прошедшего ревью, а кластер запускал нагрузки от root. Ограничения — один репозиторий обслуживает и продакшен, и sandbox-аккаунты, причём sandbox должен остаться разрешающим; у группы уже тысячи существующих ресурсов, которые сегодня не пройдут строгий набор правил; изменения инфраструктуры должны по-прежнему вливаться за день. Спроектируйте сканирование infrastructure-as-code с policy-as-code. Скажите, где сканирование запускается относительно plan и apply, как выражать правила, чтобы они были тестируемыми и ревьюабельными, как ввести набор правил, не заблокировав в первый же день все изменения, и что помешает кому-то сделать apply с ноутбука в обход пайплайна.
Сканировать не только исходники, но и вывод plan — в pull request и повторно на apply. Правила — версионируемый policy-as-code со своими тестами и разной областью для sandbox и production. Выкатывать в режиме warn с истекающим базовым исключением, а право apply оставить только идентичности пайплайна.
Типичные ошибки
- ✗Сканировать только исходники, упуская то, во что реально разворачивается plan
- ✗Включать строгий набор правил на блокировку против большого унаследованного парка
- ✗Оставлять людям права на apply, отчего гейт на практике необязателен
Уточняющие вопросы
- →Почему сканирование plan ловит то, что пропускает проверка одних манифестов?
- →Как не дать исключениям политики по средам стать постоянными?
MiddleТеорияИногдаВышло критическое уведомление об уязвимости, а исправленной версии ещё нет. Что делать?
Вышло критическое уведомление об уязвимости, а исправленной версии ещё нет. Что делать?
Сначала оцените экспозицию — по описи найдите затронутые артефакты и те, что смотрят в интернет. Патча нет, поэтому выигрывайте время компенсирующими мерами: отключить функцию, фильтровать вход на периметре, сузить egress. Патч — как выйдет релиз.
Типичные ошибки
- ✗Ждать патча вместо того, чтобы сразу применить компенсирующие меры
- ✗Пропускать анализ экспозиции и считать все сервисы одинаково срочными
- ✗Закрывать задачу на митигации и не возвращаться к нормальному патчу
Уточняющие вопросы
- →Почему фильтр на периметре — временная мера, а не исправление уязвимого кода?
- →Как запиненный lockfile ускоряет последующее обновление?
MiddleТеорияИногдаКогда уязвимость в зависимости существует, но недостижима, и как это доказать?
Когда уязвимость в зависимости существует, но недостижима, и как это доказать?
«Существует» и «достижима» — не одно и то же. SCA помечает версию, но уязвимая функция может ни разу не вызываться из вашего кода. Анализ достижимости идёт по графу вызовов от точек входа; нет пути до стока — риск латентный, приоритет ниже, но патч ставится.
Типичные ошибки
- ✗Считать недостижимую находку исправленной, а не пониженной в приоритете
- ✗Полагать, что транзитивные зависимости вообще нельзя эксплуатировать
- ✗Ранжировать находки только по метке критичности, игнорируя пути вызова
Уточняющие вопросы
- →Как опись компонентов сборки
SBOMделает вердикт о достижимости аудируемым позже? - →Что может обесценить вердикт о достижимости — рефлексия, динамическая загрузка, конфигурация?
MiddleТеорияИногдаНа что отвечает SBOM, чего не может дать одно лишь сканирование зависимостей?
На что отвечает SBOM, чего не может дать одно лишь сканирование зависимостей?
SBOM — машиночитаемая опись всех компонентов и их версий, реально попавших в сборку, включая транзитивные, снятая с разрешённого дерева зависимостей. Скан даёт находки на сегодня; SBOM отвечает позже, в каких выпущенных артефактах есть компонент.
Типичные ошибки
- ✗Перечислять только прямые зависимости, опуская транзитивное дерево
- ✗Генерировать SBOM однократно, а не на каждую сборку, отчего он расходится с реальностью
- ✗Путать SBOM (опись компонентов) с отчётом сканера о находках
Уточняющие вопросы
- →Чем на практике различаются форматы описи
SPDXиCycloneDX? - →Почему SBOM генерируют на этапе сборки, а не из файла манифеста?
SeniorДизайнИногдаВ 22:00 раскрывают критическую уязвимость удалённого выполнения кода в библиотеке логирования, которую использует вся отрасль, с публичным proof of concept и активной эксплуатацией. У вас около 200 сервисов в четырёх бизнес-юнитах. Ограничения — описи компонентов на этапе сборки есть примерно у половины парка и отсутствуют у остальных; десяток сервисов — поставляемые вендором контейнерные образы, которые вы не пересоберёте; два бизнес-юнита имеют своё дежурство и вам не подчиняются; полную заморозку продакшена компания не примет. Спроектируйте ответ организации. Раскройте, как за часы установить, что реально затронуто, как выстроить очередь устранения по командам, которыми вы не управляете, что делать с артефактами, которые нельзя пересобрать, как выбирать между митигацией и патчем для каждого сервиса, и что изменить после, чтобы следующее раскрытие обошлось дешевле.
В 22:00 раскрывают критическую уязвимость удалённого выполнения кода в библиотеке логирования, которую использует вся отрасль, с публичным proof of concept и активной эксплуатацией. У вас около 200 сервисов в четырёх бизнес-юнитах. Ограничения — описи компонентов на этапе сборки есть примерно у половины парка и отсутствуют у остальных; десяток сервисов — поставляемые вендором контейнерные образы, которые вы не пересоберёте; два бизнес-юнита имеют своё дежурство и вам не подчиняются; полную заморозку продакшена компания не примет. Спроектируйте ответ организации. Раскройте, как за часы установить, что реально затронуто, как выстроить очередь устранения по командам, которыми вы не управляете, что делать с артефактами, которые нельзя пересобрать, как выбирать между митигацией и патчем для каждого сервиса, и что изменить после, чтобы следующее раскрытие обошлось дешевле.
Объявить инцидент с одним руководителем и одной описью-истиной. Сначала имеющиеся описи, затем скан работающих артефактов. Очередь — по экспозиции, сначала смотрящие в интернет. Вендорские образы — сетевые митигации и давление на поставщика. После — обязательные описи на сборке.
Типичные ошибки
- ✗Полагаться на самоотчёты команд вместо описи как источника истины
- ✗Строить очередь по удобству команд, а не по реальной экспозиции
- ✗Закрывать инцидент на митигации, без патча и без устойчивого исправления
Уточняющие вопросы
- →Что делать с сервисом, чья команда-владелец оспаривает свою экспозицию?
- →Почему покрытие описями на этапе сборки — самое рычажное последующее действие?