[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-bezopasnost-konteynerov-kak-vstroit-proverki-bezopasnosti-v-ci-cd-payplayn":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":22,"progress":23,"seo":24},327,"kak-vstroit-proverki-bezopasnosti-v-ci-cd-payplayn",9,"bezopasnost-konteynerov","Безопасность контейнеров","🛡️","Как встроить проверки безопасности в CI\u002FCD пайплайн?","\u003C!-- grade: -->\n\n**Security gates** — обязательные проверки безопасности в пайплайне, которые блокируют продвижение артефакта при обнаружении проблем. Принцип **shift-left security** подразумевает выявление уязвимостей как можно раньше — на этапе написания кода и сборки, а не после деплоя в production.\n\n**Полный безопасный пайплайн (Jenkinsfile):**\n\n```groovy\npipeline {\n    agent any\n\n    environment {\n        REGISTRY = 'registry.bank.local'\n        IMAGE_NAME = 'banking-service'\n        IMAGE_TAG = \"${BUILD_NUMBER}-${GIT_COMMIT.take(8)}\"\n    }\n\n    stages {\n        \u002F\u002F ===== Stage 1: Статический анализ кода (SAST) =====\n        stage('SAST - Static Analysis') {\n            parallel {\n                stage('SonarQube') {\n                    steps {\n                        sh '''\n                            .\u002Fmvnw sonar:sonar \\\n                                -Dsonar.host.url=${SONAR_URL} \\\n                                -Dsonar.token=${SONAR_TOKEN} \\\n                                -Dsonar.qualitygate.wait=true\n                        '''\n                    }\n                }\n                stage('SpotBugs + FindSecBugs') {\n                    steps {\n                        sh '.\u002Fmvnw spotbugs:check'\n                    }\n                }\n                stage('Secret Detection') {\n                    steps {\n                        \u002F\u002F Поиск случайно добавленных секретов в исходном коде\n                        sh 'trivy fs --scanners secret --exit-code 1 .'\n                    }\n                }\n            }\n        }\n\n        \u002F\u002F ===== Stage 2: Проверка зависимостей (SCA) =====\n        stage('SCA - Dependency Check') {\n            steps {\n                sh '''\n                    .\u002Fmvnw dependency-check:check \\\n                        -DfailBuildOnCVSS=7 \\\n                        -Dformat=JSON \\\n                        -DprettyPrint=true\n                '''\n            }\n            post {\n                always {\n                    archiveArtifacts 'target\u002Fdependency-check-report.json'\n                }\n            }\n        }\n\n        \u002F\u002F ===== Stage 3: Сборка и тесты =====\n        stage('Build & Test') {\n            steps {\n                sh '.\u002Fmvnw clean verify'\n            }\n        }\n\n        \u002F\u002F ===== Stage 4: Сборка Docker-образа =====\n        stage('Docker Build') {\n            steps {\n                sh \"\"\"\n                    docker build \\\n                        --no-cache \\\n                        --label \"org.opencontainers.image.revision=${GIT_COMMIT}\" \\\n                        --label \"org.opencontainers.image.created=\\$(date -u +%Y-%m-%dT%H:%M:%SZ)\" \\\n                        -t ${REGISTRY}\u002F${IMAGE_NAME}:${IMAGE_TAG} .\n                \"\"\"\n            }\n        }\n\n        \u002F\u002F ===== Stage 5: Сканирование образа =====\n        stage('Image Security Scan') {\n            parallel {\n                stage('Trivy Scan') {\n                    steps {\n                        sh \"\"\"\n                            trivy image \\\n                                --exit-code 1 \\\n                                --severity CRITICAL,HIGH \\\n                                --ignore-unfixed \\\n                                --format json \\\n                                --output trivy-report.json \\\n                                ${REGISTRY}\u002F${IMAGE_NAME}:${IMAGE_TAG}\n                        \"\"\"\n                    }\n                }\n                stage('Dockerfile Lint') {\n                    steps {\n                        sh 'hadolint Dockerfile --failure-threshold warning'\n                    }\n                }\n                stage('SBOM Generation') {\n                    steps {\n                        sh \"\"\"\n                            trivy image \\\n                                --format cyclonedx \\\n                                --output sbom.cdx.json \\\n                                ${REGISTRY}\u002F${IMAGE_NAME}:${IMAGE_TAG}\n                        \"\"\"\n                    }\n                }\n            }\n        }\n\n        \u002F\u002F ===== Stage 6: Проверка Kubernetes-манифестов =====\n        stage('IaC Security') {\n            steps {\n                sh '''\n                    # Проверка Kubernetes манифестов на мисконфигурации\n                    trivy config --exit-code 1 --severity CRITICAL,HIGH k8s\u002F\n\n                    # Дополнительная проверка с помощью kubesec\n                    kubesec scan k8s\u002Fdeployment.yaml\n                '''\n            }\n        }\n\n        \u002F\u002F ===== Stage 7: Push и подпись образа =====\n        stage('Push & Sign') {\n            steps {\n                sh \"\"\"\n                    docker push ${REGISTRY}\u002F${IMAGE_NAME}:${IMAGE_TAG}\n\n                    # Подпись образа с помощью Cosign\n                    cosign sign --key \\${COSIGN_KEY} \\\n                        ${REGISTRY}\u002F${IMAGE_NAME}:${IMAGE_TAG}\n\n                    # Прикрепление SBOM к образу в реестре\n                    cosign attach sbom \\\n                        --sbom sbom.cdx.json \\\n                        ${REGISTRY}\u002F${IMAGE_NAME}:${IMAGE_TAG}\n                \"\"\"\n            }\n        }\n\n        \u002F\u002F ===== Stage 8: Динамическое тестирование (DAST) =====\n        stage('DAST - Dynamic Testing') {\n            when {\n                branch 'develop'\n            }\n            steps {\n                sh '''\n                    # Деплой в тестовую среду\n                    kubectl apply -f k8s\u002F -n testing\n\n                    # Запуск OWASP ZAP для динамического сканирования\n                    docker run --rm owasp\u002Fzap2docker-stable zap-baseline.py \\\n                        -t http:\u002F\u002Fbanking-service.testing.svc:8080 \\\n                        -r zap-report.html\n                '''\n            }\n        }\n    }\n\n    post {\n        always {\n            archiveArtifacts artifacts: '*.json, *.html', allowEmptyArchive: true\n        }\n        failure {\n            \u002F\u002F Уведомление команды безопасности о провале security gate\n            slackSend channel: '#security-alerts',\n                color: 'danger',\n                message: \"Security gate FAILED: ${env.JOB_NAME} #${env.BUILD_NUMBER}\"\n        }\n    }\n}\n```\n\nПайплайн выстроен так, что каждый последующий этап выполняется только при успехе предыдущего. Если на любом этапе обнаружена критическая проблема (`--exit-code 1`), пайплайн останавливается и образ не попадает в реестр. Параллельные этапы (`parallel`) ускоряют выполнение, сохраняя полноту проверок.\n\n**Сводная таблица типов проверок безопасности:**\n\n| Тип | Инструменты | Что проверяет | Когда запускать |\n|-----|------------|---------------|-----------------|\n| **SAST** (Static Application Security Testing) | SonarQube, SpotBugs + FindSecBugs, Semgrep | Уязвимости в исходном коде: SQL injection, XSS, небезопасная десериализация | При каждом коммите |\n| **SCA** (Software Composition Analysis) | OWASP Dependency Check, Snyk | Уязвимости в сторонних зависимостях (библиотеках) | При сборке |\n| **Secret Scan** | Trivy, GitLeaks, TruffleHog | Случайно добавленные секреты: пароли, ключи API, токены в коде и Git-истории | При каждом коммите |\n| **Image Scan** | Trivy, Snyk, Grype | Уязвимости в Docker-образе: пакеты ОС и зависимости приложения | После сборки образа |\n| **IaC Scan** | Trivy config, Checkov, kubesec | Мисконфигурации: Kubernetes-манифесты, Dockerfile, Terraform | При каждом коммите |\n| **DAST** (Dynamic Application Security Testing) | OWASP ZAP | Уязвимости работающего приложения: проверка HTTP-эндпоинтов, заголовков, аутентификации | После деплоя в тестовую среду |\n| **Lint** | hadolint, yamllint | Стилистические и безопасностные проблемы в Dockerfile и YAML | При каждом коммите |\n\n**Ключевой принцип:** пайплайн должен **блокировать** продвижение артефакта при обнаружении критических уязвимостей. Для банковских систем ни одна CRITICAL-уязвимость не должна попасть в production. Параметр `--exit-code 1` в сканерах обеспечивает это: при обнаружении уязвимости указанного severity процесс завершается с ненулевым кодом, и CI\u002FCD-система считает этап провалившимся.","","senior",[15,16,17,18,19,20,21],"dast","sca","shift-left","jenkins","cicd","sast","container-security",[],null,{"title":25,"description":26,"ogTitle":25,"ogDescription":27,"keywords":28,"schemaAnswer":39,"featuredSnippetReady":40},"Проверки безопасности в CI\u002FCD: SAST, SCA, Image Scan, DAST — Gymterview","Как встроить security gates в CI\u002FCD пайплайн? SAST (SonarQube, SpotBugs), SCA (Dependency Check), Secret Detection, Image Scan (Trivy), IaC Scan, DAST (OWASP ZAP). Полный Jenkinsfile.","Полный безопасный CI\u002FCD пайплайн: статический анализ (SAST), проверка зависимостей (SCA), сканирование образов, проверка манифестов и динамическое тестирование (DAST).",[29,30,31,32,33,34,35,36,37,38],"безопасность CI\u002FCD","SAST","SCA","DAST","shift-left security","Trivy CI\u002FCD","SonarQube","OWASP ZAP","security gates","hadolint","Security gates — обязательные проверки в пайплайне, блокирующие продвижение артефакта при обнаружении проблем (shift-left security). Этапы: SAST — статический анализ кода (SonarQube, SpotBugs, Semgrep); SCA — проверка зависимостей (OWASP Dependency Check, failBuildOnCVSS=7); Secret Scan — поиск утечек секретов (Trivy, GitLeaks); Image Scan — сканирование Docker-образа (Trivy, Grype); IaC Scan — проверка K8s манифестов и Dockerfile (Trivy config, kubesec, hadolint); подпись образа (Cosign) и генерация SBOM; DAST — динамическое тестирование работающего приложения (OWASP ZAP). Ни одна CRITICAL-уязвимость не должна попасть в production.",true]