WAF-OPS-010 – CI/CD Pipeline Defined & Automated
Beschreibung
Jeder Produktions-Workload MUSS eine definierte, versionierte CI/CD-Pipeline haben. Manuelle Deployments in Produktion sind nicht zulässig. Pipeline-Definitionen MÜSSEN als Code im selben Repository wie die Applikation gespeichert sein.
Rationale
Manuelle Deployments sind die häufigste Ursache von Configuration Drift, Deployment-Fehlern und undokumentierten Änderungen. Automatisierte Pipelines erzwingen Konsistenz, reduzieren menschliche Fehler und liefern einen Audit-Trail für jede Änderung.
DORA-Elite-Teams deployen mehrfach täglich mit einer Change Failure Rate unter 5%. Manuelle Prozesse können diese Zuverlässigkeit nicht erreichen.
Bedrohungskontext
| Risiko | Beschreibung |
|---|---|
Undokumentierte manuelle Änderungen |
Manuelle Deployments hinterlassen keinen Audit-Trail; Debugging nach Incident ist erschwert. |
Inkonsistente Umgebungen |
Manuelles Deployment erzeugt Abweichungen zwischen Staging und Production (Snowflake-Problem). |
Fehlende Rollback-Fähigkeit |
Ohne Pipeline ist Rollback ein neuer manueller Deployment-Prozess statt automatischer Umkehrung. |
Compliance-Verletzung |
Change-Management-Anforderungen (SOC 2, ISO 20000) fordern dokumentierte Änderungskontrolle. |
Anforderung
-
Pipeline-Definitionen MÜSSEN in Version-Control gespeichert sein
-
Alle Deployments in Produktion MÜSSEN durch die Pipeline ausgeführt werden
-
Direkte SSH-Zugriffe oder Console-Deployments in Produktion MÜSSEN verboten sein
-
Branch-Protection MUSS direkte Commits auf
mainoder Produktions-Branches verhindern -
Approval-Gates MÜSSEN vor Production-Deployments konfiguriert sein
-
Artefakte MÜSSEN versioniert sein (Git-SHA oder semantische Version, nicht
latest)
Implementierungsanleitung
-
Pipeline-as-Code definieren:
.github/workflows/,.gitlab-ci.yml,buildspec.yml– im Repository, nicht extern -
Stages definieren: Lint → Test → Security Scan → Build → Deploy Staging → Approval → Deploy Production
-
Branch-Protection konfigurieren: Mindestens 1 Reviewer, CODEOWNERS, direkte Commits verboten
-
Artefakt-Versionierung: Git-SHA als Container-Image-Tag;
latestin Production verboten -
Approval-Gate aktivieren: GitHub Environments, Azure DevOps Environment Checks, CodePipeline Manual Approval
-
Deployment-Benachrichtigungen: Pipeline-Failure-Alerts an Team-Kanal (Slack, Teams)
Reifegrad-Abstufung
| Level | Bezeichnung | Kriterien |
|---|---|---|
1 |
Manuelle Deployments |
Keine Pipeline; Deployments via SSH oder Konsole; kein Audit-Trail. |
2 |
Basis-Pipeline |
CI-Pipeline für Tests vorhanden; Deployments per Skript aber manuell ausgelöst. |
3 |
Vollständige CI/CD mit Gates |
Alle Deployments automatisiert; Branch-Protection; Approval-Gate für Production. |
4 |
Metriken & Progressive Delivery |
DORA-Metriken gemessen; Canary/Blue-Green; Auto-Rollback bei Fehler. |
5 |
Continuous Deployment |
Mehrfach täglich; Change Failure Rate < 5%; Feature Flags für risikolose Releases. |
Terraform Checks
waf-ops-010.tf.aws.codepipeline-exists
Prüft: AWS CodePipeline mit Source, Build und Deploy-Stage ist definiert.
| Compliant | Non-Compliant |
|---|---|
|
|
waf-ops-010.tf.google.cloudbuild-trigger-exists
Prüft: Google Cloud Build Trigger mit Build-Konfigurationsdatei ist definiert.
# Compliant
resource "google_cloudbuild_trigger" "app" {
name = "payment-service-trigger"
filename = "cloudbuild.yaml"
github {
owner = "myorg"
name = "payment-service"
push { branch = "^main$" }
}
}
Remediation: Eine aws_codepipeline, azuredevops_build_definition oder
google_cloudbuild_trigger Ressource mit Repository-Referenz und Build-Konfiguration definieren.
Evidenz
| Typ | Pflicht | Beschreibung |
|---|---|---|
IaC |
✅ Pflicht |
Pipeline-Definitions-Dateien (.github/workflows/, .gitlab-ci.yml) in Version-Control. |
Config |
✅ Pflicht |
Branch-Protection-Konfiguration (min. Reviewer, CODEOWNERS, direkte Commits verboten). |
Process |
Optional |
DORA-Metriken-Report (Deployment Frequency, Lead Time for Changes). |
Governance |
Optional |
Change-Management-Policy die manuelle Production-Deployments explizit verbietet. |