Ответ
В DevOps-контексте security-тестирование инфраструктуры — это непрерывный процесс, интегрированный в CI/CD, а не разовая акция. Мой подход включает несколько уровней:
1. Статический анализ (SAST) и зависимостей:
- Инфраструктура как код (Terraform, Ansible): Использую
tfsec,checkovилиterrascanдля поиска небезопасных конфигураций (открытые S3 buckets, security groups с правилом 0.0.0.0/0). - Контейнеры:
trivyилиgrypeдля сканирования образов Docker на наличие уязвимостей в базовых слоях и зависимостях. - Зависимости приложений:
OWASP Dependency-Checkилиsnykв пайплайне сборки.
2. Динамический анализ и сканирование конфигураций (DAST/CIS):
- Сканирование запущенных кластеров K8s: Инструменты вроде
kube-benchпроверяют соответствие кластера рекомендациям CIS Benchmark для Kubernetes. - Сетевое сканирование: Использую
nmapв рамках утвержденных пентестов для проверки открытых портов на неожиданных сервисах. - Сканирование веб-приложений: Интегрирую
OWASP ZAPв пайплайн для базового автоматизированного тестирования развернутых в staging-окружении приложений.
3. Практические примеры и "алгоритм под капотом": Инструменты работают на основе:
- Базы уязвимостей (CVE): Сравнивают версии ПО в вашей системе с публичными базами уязвимостей.
- Политики/бенчмарки: Сравнивают ваши конфигурации с набором правил безопасности (например, "контейнер не должен работать от root", "pod должен иметь securityContext" ).
Пример пайплайна GitLab CI:
security_scan:
stage: test
image: alpine:latest
script:
- apk add trivy
- trivy image --exit-code 1 --severity HIGH,CRITICAL $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
- wget -qO- https://raw.githubusercontent.com/aquasecurity/kube-bench/main/job.yaml | kubectl apply -f - && kubectl wait --for=condition=complete job/kube-bench
Ключевой принцип — Shift Left: находить и фиксировать уязвимости как можно раньше, на этапе написания кода инфраструктуры и сборки образов, а не в продакшене.