Contrôles de sécurité de la CI
Version anglaise : en/ci-security-gates.md.
Les mêmes contrôles existent dans .forgejo/workflows/ci.yml et .gitlab-ci.yml. Les constats de gravité haute ou critique font échouer le pipeline ; le job build dépend de tous les jobs de sécurité.
| Job (Forgejo / GitLab) | Outil | Périmètre | Condition d'échec |
|---|---|---|---|
security-sast / bandit | Bandit 1.8 | services/control-plane/src, sdks/python/src | gravité haute, confiance moyenne ou plus |
security-semgrep / semgrep | Semgrep, règles p/owasp-top-ten, p/python, p/typescript | dépôt entier hors sous-charts | gravité ERROR |
security-deps-python / pip-audit | pip-audit 2.7 | backend et SDK Python | toute vulnérabilité connue |
security-deps-node / npm-audit | npm audit --audit-level=high | portal, sdks/typescript | haute ou critique |
security-secrets / gitleaks | Gitleaks 8.21 | historique git et arborescence | tout secret détecté |
security-fs / trivy-fs, trivy-config | Trivy 0.58 (fs et config deploy/) | dépendances, secrets, IaC | haute ou critique |
build (étape trivy image scan) / trivy-image | Trivy 0.58 (image, exceptions dans .trivyignore, une par ligne avec justification, responsable et date de revue) | vulnérabilités des images publiées | haute ou critique |
build (étape cosign sign and attest) / sbom-sign | cosign avec la clé COSIGN_PRIVATE_KEY, sans journal Rekor ; la publication échoue sans clé car Kyverno (eai-verify-image-signatures) n'accepte que cette clé pour harbor.*/eai/* | signature et attestations SPDX et CycloneDX | absence de clé |
security-manifests / manifests | kubeconform (strict, catalogue CRD datree), Kyverno CLI, pytest | chart rendu avec les trois fichiers de valeurs | schéma invalide, refus d'admission, invariant de sécurité |
security-dast / zap-baseline | OWASP ZAP baseline 2.15 | portail et API de la pile compose | règle FAIL de deploy/ci/zap-baseline.conf |
Notes
- ZAP tourne avec
-I: les avertissements sont rapportés, seules les règles marquéesFAILcassent le build (cookies sans HttpOnly ou SameSite, clickjacking,X-Content-Type-Options, fuiteX-Powered-By, CORS mal configuré, divulgation d'erreurs). HSTS et cookiesSecuresont ignorés sur la pile compose en HTTP et contrôlés à la bordure TLS. - Une exception Bandit se justifie dans le code (
# nosec Bxxxavec la raison), une exception Semgrep par# nosemgrep: <règle>; une vulnérabilité de dépendance sans correctif s'ignore avec un identifiant explicite (pip-audit --ignore-vuln,.trivyignore) et une date de revue. - Reproduction locale des contrôles hors ligne :
helm lint,helm template,kubeconform,kyverno test deploy/policies/kyverno/tests,opa test deploy/policies/opa -v,terraform fmt -check -recursive deploy/terraform,pytest services/control-plane/tests -k platform.