Module 7 – DevSecOps et sécurité des supply chains

Intégrez SAST, DAST, scanning, Vault, Kyverno/OPA et attestations Cosign pour sécuriser vos pipelines DevOps.

La sécurité doit être intégrée au pipeline. Ce module détaille Trivy, Snyk, Semgrep, Vault, Cosign attestations et politiques d’admission.

Objectifs

  • Automatiser SAST, DAST et scans de dépendances dans la CI/CD.
  • Gérer les secrets via Vault/KMS et sécuriser les déploiements Kubernetes.
  • Mettre en place des politiques Kyverno/OPA et des attestations Cosign.

1. Scans intégrés

  • SAST : Semgrep ou Snyk Code (semgrep --config auto).
  • Dependency scanning : Trivy FS, Snyk CLI, OWASP Dependency-Check.
  • DAST : OWASP ZAP, Burp Suite (pipeline staging).

Exemple GitHub Actions :

security:
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v4
    - name: Semgrep SAST
      uses: semgrep/semgrep-action@v1
    - name: Trivy FS
      uses: aquasecurity/trivy-action@v1
      with:
        scan-type: fs
        severity: HIGH,CRITICAL
        ignore-unfixed: true
    - name: Trivy image
      uses: aquasecurity/trivy-action@v1
      with:
        scan-type: image
        image-ref: ghcr.io/${{ github.repository }}:${{ github.sha }}

2. Vault & secrets

  • Déployer HashiCorp Vault (Helm chart) ou AWS/GCP Secrets Manager.
  • Configurer auto-unseal (Cloud KMS) et policies :
    path "secret/data/app/*" {
      capabilities = ["read", "list"]
    }
    
  • CI/CD : utiliser vault write auth/approle/login ou GitHub OIDC pour obtenir un token.

3. Admission control

  • Kyverno policies (ex. interdire Conteneurs root, imposer des labels, vérifier signatures).
  • OPA Gatekeeper pour la conformité (CIS, Pod Security Standards).

Policy Kyverno pour injection de sidecar :

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-labels
spec:
  validationFailureAction: enforce
  rules:
    - name: force-owner-label
      match:
        resources:
          kinds:
            - Pod
      validate:
        message: "Label owner obligatoire"
        pattern:
          metadata:
            labels:
              owner: "?*"

4. Attestations Cosign & provenance

cosign attest --predicate sbom.json --type https://spdx.dev/Document ghcr.io/acme/webapp:${GIT_COMMIT}
cosign verify-attestation ghcr.io/acme/webapp:${GIT_COMMIT}   --type https://spdx.dev/Document --key k8s://kube-system/cosign-pub

OPA Rego exemple :

package admission
violation["image non attestée"] {
  input.review.object.kind == "Pod"
  some container
  container := input.review.object.spec.containers[_]
  not input.verifyImages[container.image]
}

5. Rapport et conformité

  • Collecter les résultats SAST/DAST dans un tableau (docs/security-report.md).
  • Automatiser un audit CIS Kubernetes (kubebench, kube-hunter) trimestriel.
  • Mettre en place un pipeline “compliance as code” (Checkov, tfsec) sur les modules Terraform.

6. Lab guidé

  1. Ajouter l’étape SAST (Semgrep), SCA (Trivy) et DAST (ZAP) dans la pipeline du module 4.
  2. Déployer Vault, créer une AppRole et intégrer la récupération du secret dans la pipeline.
  3. Appliquer la policy Kyverno require-labels et une policy verify-signed-images.
  4. Signer l’image + attestation et vérifier via policy d’admission.
  5. Générer un rapport de vulnérabilités, indexer dans GitHub Security ou GitLab Security Dashboard.

Challenge optionnel

  • Configurer un pipeline DevSecOps complet sur GitLab Ultimate (vuln management).
  • Utiliser Tern ou Grype pour l’analyse de multi-stage Dockerfile.
  • Mettre en place Security Hub (AWS) ou Security Command Center (GCP) connecté aux pipelines.

Solution détaillée

  1. Scans : la pipeline doit échouer si Semgrep ou Trivy trouve une vulnérabilité critique. Exportez les rapports en JSON (sast-report.json, trivy-report.json).
  2. Vault : vault login -method=approle role_id=... secret_id=... fonctionne, vault kv get secret/data/app/api-key renvoie les secrets. Dans la pipeline, utilisez export VAULT_TOKEN.
  3. Admission : un Pod sans label owner est refusé (Error from server (Forbidden)). Un Pod avec image non signée est bloqué.
  4. Attestations : cosign verify-attestation renvoie Verified OK. Documenter la commande et la sortie dans docs/security.md.
  5. Audit : conservez les rapports sous artifacts/security et créez un ticket Jira si vulnérabilité critique.

Ces éléments doivent être audités régulièrement (ex. weekly security review).

Pièges fréquents

  • Ignorer les dépendances transitive : activez --ignore-unfixed=false régulièrement.
  • Vault sans rotation : configurez vault lease et PKI pour certs courts.
  • Policies appliquées seulement sur Pods : pensez aux autres ressources (CronJob, Deployment via match resources).

Ressources

Checklist

  • ✅ Pipeline intègre SAST/SCA/DAST.
  • ✅ Secrets gérés via Vault/KMS, pas dans le code.
  • ✅ Policies d’admission appliquées (Kyverno/OPA).
  • ✅ Rapports sécurité archivés et suivis.