4. Безопасность — общая ответственность
SSDLC не должен строиться по принципу, при котором разработчики создают продукт, а специалисты ИБ исключительно ищут в нем ошибки.
Более эффективная модель предполагает распределение обязанностей.
Разработчики отвечают за соблюдение установленных требований при создании и изменении кода. Специалисты ИБ определяют критерии безопасности, помогают разбирать сложные проблемы, совершенствуют инструменты и контролируют риски.
DevOps- и платформенные команды обеспечивают безопасность инфраструктуры сборки, доставки и эксплуатации ПО.
При этом важно назначать конкретных владельцев процессов, чтобы общая ответственность не превращалась в отсутствие ответственных.
Как интегрировать безопасность в существующий процесс разработки
Один из ключевых подходов SSDLC — выполнение проверок в тех инструментах и рабочих процессах, которыми команда уже пользуется.
Разработчик не должен каждый раз переходить в отдельную систему, чтобы узнать об обнаруженной уязвимости.
Результаты проверок могут отображаться в GitLab, GitHub, Jenkins и других инструментах разработки и CI/CD, а задачи на устранение — попадать в используемый командой трекер.
Для этого применяются несколько классов решений.
SAST: анализ исходного кода
Static Application Security Testing (SAST) — статический анализ безопасности исходного кода, а в отдельных реализациях также промежуточного представления или скомпилированных компонентов приложения.
SAST позволяет обнаруживать определенные потенциально опасные конструкции без запуска приложения.
Например, инструмент может выявить:
- небезопасное формирование SQL-запросов;
- потенциально опасную обработку пользовательского ввода;
- использование небезопасных криптографических алгоритмов;
- отдельные ошибки управления памятью;
- небезопасные способы выполнения системных команд.
Статический анализ удобно запускать при изменении кода или в CI/CD.
Однако результаты SAST необходимо оценивать с учетом контекста. Инструменты могут выдавать ложные предупреждения и не обнаруживать ошибки бизнес-логики.
SCA: проверка сторонних компонентов
Software Composition Analysis (SCA) — анализ программных зависимостей и используемых сторонних компонентов.
Современные приложения часто включают большое количество библиотек, фреймворков и пакетов с открытым исходным кодом.
SCA помогает определять состав зависимостей и сопоставлять используемые версии с известными уязвимостями.
Например, если в проекте используется библиотека с критической уязвимостью, инструмент может предупредить о необходимости обновления.
При этом сам факт наличия уязвимой версии не всегда означает, что соответствующий код доступен для эксплуатации в конкретном приложении.
Поэтому результаты следует анализировать с учетом используемой функциональности, зависимостей и условий эксплуатации.
DAST: динамическое тестирование приложений
Dynamic Application Security Testing (DAST) — анализ безопасности работающего приложения.
В отличие от SAST, динамические инструменты взаимодействуют с запущенной системой и проверяют ее поведение.
DAST может использоваться для обнаружения определенных проблем конфигурации, обработки запросов, управления сессиями и других уязвимостей.
Такие проверки обычно выполняются в специально подготовленной тестовой среде.
Их необходимо настраивать с учетом возможного влияния на приложение: некоторые тесты могут изменять данные, создавать нагрузку или вызывать ошибки в работе сервисов.
Secret Scanning: поиск учетных данных и ключей
Одна из типовых проблем безопасности разработки — случайная публикация паролей, токенов и API-ключей в репозиториях.
Инструменты Secret Scanning позволяют обнаруживать потенциальные секреты в изменениях исходного кода и истории репозитория.
Особенно полезно выполнять такие проверки до включения изменений в основную ветку.
Если действующий секрет уже оказался в репозитории, простого удаления строки из последнего коммита недостаточно. Необходимо отозвать или заменить соответствующий ключ и проверить возможное несанкционированное использование.
Безопасность контейнеров и инфраструктуры
При использовании контейнеризации и Infrastructure as Code в SSDLC также включаются проверки Docker-образов, Kubernetes-манифестов, Terraform и других конфигураций.
Они помогают выявлять:
- избыточные права доступа;
- небезопасные параметры контейнеров;
- использование уязвимых базовых образов;
- некорректные сетевые настройки;
- доступность административных интерфейсов;
- потенциально опасные настройки облачной инфраструктуры.
Однако безопасность CI/CD не ограничивается сканированием артефактов. Необходимо защищать сами системы сборки, репозитории, учетные данные и механизмы доставки ПО.
Когда DevSecOps и SSDLC работают вместе
SSDLC и DevSecOps тесно связаны, но не являются полными синонимами.
SSDLC описывает организацию безопасной разработки на протяжении жизненного цикла программного обеспечения.
DevSecOps делает акцент на интеграции безопасности в совместную работу команд разработки, эксплуатации и информационной безопасности, включая автоматизацию процессов.
Условно SSDLC определяет, какие мероприятия необходимы, а практики DevSecOps помогают встроить многие из них в ежедневную работу команды.
Например, SSDLC может устанавливать требование проверять сторонние зависимости перед выпуском продукта.
В рамках DevSecOps это требование реализуется через автоматический запуск SCA в CI/CD, создание задач на устранение подтвержденных уязвимостей и применение согласованных правил выпуска.
При правильно организованном взаимодействии разработчики получают результаты проверок достаточно рано, специалисты ИБ концентрируются на сложных рисках, а DevOps-команда поддерживает надежную инфраструктуру автоматизации.
Роль Security Champions
Для улучшения взаимодействия может использоваться модель Security Champions.
Security Champion — участник команды разработки, который дополнительно помогает внедрять практики безопасности в рамках своего продукта или направления.
Он может участвовать в обсуждении архитектуры, разъяснять требования, помогать коллегам разбирать предупреждения анализаторов и взаимодействовать с подразделением ИБ.
При этом Security Champion не заменяет специалиста по безопасности и не должен единолично отвечать за все риски приложения.
Такая модель особенно полезна для организаций с большим количеством команд, когда централизованное подразделение ИБ физически не может участвовать в каждом техническом обсуждении.
Как выглядит SSDLC без барьеров на практике
Рассмотрим условный пример разработки нового функционала корпоративного веб-приложения.
Компания планирует добавить возможность загрузки документов через личный кабинет клиента.
Функция должна быть доступна авторизованным пользователям, а загруженные файлы — храниться с учетом требований конфиденциальности и разграничения доступа.
Этап 1. Обсуждение требований
На этапе постановки задачи команда определяет основные риски.
Например:
- загрузка потенциально вредоносных файлов;
- доступ одного клиента к документам другого;
- использование механизма загрузки для исчерпания ресурсов сервера;
- некорректное хранение конфиденциальных данных;
- раскрытие файлов через прямые ссылки.
Эти сценарии учитываются при формировании технических требований.
Команде не обязательно проводить полномасштабную процедуру моделирования угроз для каждого небольшого изменения. Однако функциональность, связанная с загрузкой файлов и обработкой конфиденциальной информации, требует соответствующего анализа.
Этап 2. Проектирование безопасной архитектуры
До начала реализации определяются механизмы проверки прав доступа, ограничения типов и размеров файлов, принципы хранения документов и необходимые журналы событий.
Например, система должна проверять право пользователя на доступ к документу при каждой операции скачивания, а не полагаться исключительно на то, что ссылка содержит трудно угадываемый идентификатор.
Также определяются требования к обработке потенциально опасных файлов.
В результате разработчики получают конкретные технические условия, а не общее требование «обеспечить безопасность загрузки».
Этап 3. Реализация и автоматические проверки
Разработчик создает функциональность и отправляет изменения в репозиторий.
CI/CD автоматически выполняет предусмотренные проверки:
- анализ измененного кода;
- поиск секретов;
- проверку зависимостей;
- запуск модульных и интеграционных тестов;
- выполнение применимых проверок безопасности.
Если система обнаруживает значимую проблему, разработчик получает предупреждение непосредственно в интерфейсе проекта.
Например, SAST может указать на потенциально опасную обработку имени файла, а интеграционный тест — выявить возможность скачивания документа другого пользователя.
Проблемы исправляются до объединения изменений с основной веткой.
Этап 4. Дополнительное тестирование
После сборки приложения команда выполняет проверки, которые сложно полностью заменить статическим анализом.
В частности, тестируется:
- разграничение доступа между пользователями;
- загрузка недопустимых типов файлов;
- обработка некорректных имен и путей;
- соблюдение ограничений на размер файлов;
- поведение приложения при ошибках;
- доступность загруженных документов через внешние интерфейсы.
Часть сценариев может быть автоматизирована, а сложные случаи требуют ручного тестирования.
Если обнаружена критичная уязвимость, выпуск соответствующего изменения приостанавливается до исправления либо принятия документированного решения в соответствии с установленным процессом управления рисками.
Этап 5. Выпуск и сопровождение
После прохождения проверок функциональность разворачивается в рабочей среде.
Система мониторинга отслеживает ошибки, подозрительную активность и события, которые могут свидетельствовать о попытках эксплуатации.
При появлении новых уязвимостей в используемых компонентах команда получает уведомления и оценивает необходимость обновления.
Таким образом, работа с безопасностью не заканчивается после релиза.
Важно, что на большинстве этапов разработчику не требуется проходить отдельную процедуру ручного согласования. Базовые проверки выполняются внутри существующего процесса, а специалисты ИБ подключаются к действительно значимым вопросам.
Как внедрить SSDLC в существующей компании
Внедрение безопасной разработки лучше начинать с оценки текущих процессов и наиболее существенных рисков, а не с одновременного подключения всех доступных инструментов.
В качестве основы можно использовать NIST SSDF и OWASP SAMM.
NIST SSDF содержит набор практик безопасной разработки, а OWASP Software Assurance Maturity Model (SAMM) помогает оценивать состояние процессов и планировать их последовательное развитие.
Практическое внедрение можно организовать в несколько этапов.
1. Оценить текущий процесс разработки
Необходимо определить, как формируются требования, кто принимает архитектурные решения, какие проверки уже выполняются, как организованы CI/CD и управление уязвимостями.
Отдельное внимание следует уделить существующим проблемам: позднему обнаружению ошибок, ручным согласованиям, повторяющимся уязвимостям и отсутствию владельцев исправлений.
2. Определить минимальные обязательные требования
Для начала достаточно сформировать базовый набор правил, применимых ко всем проектам.
Например:
- обязательная проверка изменений перед включением в основную ветку;
- запрет хранения действующих секретов в исходном коде;
- контроль сторонних зависимостей;
- проверка критичных механизмов авторизации;
- применение согласованного процесса устранения уязвимостей;
- защита репозиториев и инфраструктуры CI/CD.
Дополнительные требования вводятся с учетом критичности приложения и обрабатываемых данных.
3. Автоматизировать типовые проверки
Следующий шаг — интеграция подходящих инструментов в существующий CI/CD.
При этом важно не только включить сканирование, но и настроить обработку результатов.
Разработчик должен понимать, почему обнаружена проблема, насколько она опасна и как ее исправить.
Особое внимание стоит уделить настройке правил и уменьшению количества ложных срабатываний.
4. Организовать управление уязвимостями
Обнаруженные проблемы должны попадать в общий процесс учета задач.
Для каждой подтвержденной уязвимости необходимо определить:
- критичность и возможные последствия;
- затронутые системы;
- ответственного за исправление;
- согласованный срок устранения;
- порядок проверки результата;
- процедуру принятия исключений и остаточного риска.
Сроки исправления следует устанавливать с учетом риска и применимых требований, а не только формальной оценки сканера.
5. Постепенно расширять практики безопасности
После стабилизации базовых проверок можно развивать моделирование угроз, анализ архитектуры, безопасность программных компонентов, контроль цепочки поставки ПО и расширенное тестирование.
Важно учитывать реальные возможности команды и не внедрять процедуры, для выполнения которых отсутствуют необходимые ресурсы.
Как измерять эффективность SSDLC
Оценка безопасной разработки не должна ограничиваться количеством выполненных сканирований или найденных уязвимостей.
Рост числа обнаруженных проблем иногда свидетельствует об улучшении качества проверок, а не об ухудшении состояния безопасности.
Поэтому показатели необходимо рассматривать в контексте.