Как улучшить безопасность кода проекта с точки зрения DevOps?

«Как улучшить безопасность кода проекта с точки зрения DevOps?» — вопрос из категории Безопасность, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В DevOps-практиках безопасность кода (DevSecOps) внедряется на всех этапах жизненного цикла. Вот ключевые меры, которые я реализую в своих пайплайнах:

1. Автоматизированный статический анализ (SAST):

  • Интегрирую инструменты в CI/CD (например, SonarQube, Checkmarx, Semgrep) для сканирования исходного кода на уязвимости (инъекции, XSS, чувствительные данные в логах).
  • Настраиваю качественные ворота (quality gates), чтобы сборка падала при обнаружении критических проблем.

2. Анализ зависимостей (SCA):

  • Использую OWASP Dependency-Check, Trivy, Snyk для сканирования зависимостей проекта (npm, pip, Maven) на известные уязвимости (CVE).
  • Конфигурирую регулярные (например, еженедельные) проверки и автоматические PR с обновлениями патчей.

3. Безопасная обработка секретов:

  • Никогда не храню секреты в коде или в переменных окружения CI/CD как plain text.
  • Использую специализированные хранилища: HashiCorp Vault, AWS Secrets Manager, Azure Key Vault.
  • В GitLab CI/CD применяю File type переменные для сертификатов и Masked переменные для токенов.

4. Безопасность контейнеров и инфраструктуры:

  • Сканирую Docker-образы на этапе сборки с помощью Trivy или Grype на наличие уязвимостей в базовых слоях.
  • Использую минимальные базовые образы (например, scratch, alpine).
  • В IaC (Terraform, CloudFormation) применяю Checkov или Tfsec для проверки конфигураций на соответствие best practices (например, открытые S3 bucket'ы).

5. Принцип наименьших привилегий в инфраструктуре:

  • Для сервисных аккаунтов и ролей в облаке (AWS IAM, Azure RBAC) настраиваю строго необходимый набор permissions.
  • В Kubernetes использую Pod Security Standards и сервисные аккаунты с ограниченными правами.

Пример этапа в GitLab CI .gitlab-ci.yml:

stages:
  - test
  - security

sast:
  stage: security
  image: registry.gitlab.com/gitlab-org/security-products/sast:latest
  script:
    - /analyzer run
  artifacts:
    reports:
      sast: gl-sast-report.json

dependency_scanning:
  stage: security
  image: registry.gitlab.com/gitlab-org/security-products/dependency-scanning:latest
  script:
    - /analyzer run
  artifacts:
    reports:
      dependency_scanning: gl-dependency-scanning-report.json

container_scanning:
  stage: security
  image: registry.gitlab.com/gitlab-org/security-products/container-scanning:latest
  variables:
    DOCKER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
  script:
    - /analyzer run
  artifacts:
    reports:
      container_scanning: gl-container-scanning-report.json