Infrastructure as Code Security

Infrastructure as Code bietet Vorteile bei Versionierung und Automatisierung, bringt jedoch Risiken mit sich, wenn Fehlkonfigurationen automatisch propagiert werden. Sicherheit muss für IaC nach dem Shift-Left-Prinzip umgesetzt werden.

Häufige Schwachstellen in IaC

  • Hardcoded Secrets: Zugangsdaten in versioniertem Code
  • Zu permissive Regeln: Security Groups 0.0.0.0/0
  • Unverschlüsselte Ressourcen: S3-Buckets, RDS ohne Verschlüsselung
  • Öffentlicher Zugriff: Unnötig exponierte Ressourcen
  • Fehlendes Logging: CloudTrail, Flow Logs deaktiviert
  • Schwache Authentifizierung: MFA nicht erzwungen

Scanning-Werkzeuge

Terraform - tfsec, Checkov, Terrascan

      # Beispiel einer Schwachstelle - öffentlicher S3-Bucket
      resource "aws_s3_bucket" "bad_bucket" {
      bucket = "my-public-bucket"
      acl    = "public-read"  # [FEHLER] VERWUNDBAR
      }
      # Korrektur
      resource "aws_s3_bucket" "good_bucket" {
      bucket = "my-private-bucket"
      acl    = "private"  # [OK] Sicher
      server_side_encryption_configuration {
      rule {
      apply_server_side_encryption_by_default {
      sse_algorithm = "AES256"
      }
      }
      }
      versioning {
      enabled = true
      }
      }
      resource "aws_s3_bucket_public_access_block" "good_bucket" {
      bucket = aws_s3_bucket.good_bucket.id
      block_public_acls       = true
      block_public_policy     = true
      ignore_public_acls      = true
      restrict_public_buckets = true
      }
      

tfsec - Terraform-Scanning

      # Install
      brew install tfsec
      # Scan Terraform files
      tfsec .
      # Spezifische Ausgabe
      tfsec --format json --out results.json .
      # CI/CD integration
      tfsec --soft-fail . || exit 1
      

Checkov - Multi-Cloud-IaC-Scanner

      # Install
      pip install checkov
      # Scan Terraform
      checkov -d ./terraform
      # Scan CloudFormation
      checkov -f template.yaml
      # Scan Kubernetes manifests
      checkov -d ./k8s
      # Skip specific checks
      checkov -d . --skip-check CKV_AWS_20
      # Custom policies
      checkov -d . --external-checks-dir ./custom-policies
      

Policy as Code

Open Policy Agent (OPA)

OPA ermöglicht das Schreiben von Policies in der Rego-Sprache, um Compliance zu erzwingen:

      # deny_public_s3.rego
      package terraform.aws.s3
      deny[msg] {
      resource := input.resource_changes[_]
      resource.type == "aws_s3_bucket"
      resource.change.after.acl == "public-read"
      msg := sprintf("S3 bucket %s cannot be public", [resource.address])
      }
      deny[msg] {
      resource := input.resource_changes[_]
      resource.type == "aws_s3_bucket"
      not resource.change.after.server_side_encryption_configuration
      msg := sprintf("S3 bucket %s must have encryption enabled", [resource.address])
      }
      

Sentinel (HashiCorp)

Policy-Framework, integriert mit Terraform Cloud/Enterprise:

      # enforce-mandatory-tags.sentinel
      import "tfplan/v2" as tfplan
      mandatory_tags = ["Environment", "Owner", "Project"]
      all_resources = filter tfplan.resource_changes as _, rc {
      rc.mode is "managed"
      }
      deny_resources_without_tags = rule {
      all all_resources as _, resource {
      all mandatory_tags as tag {
      resource.change.after.tags contains tag
      }
      }
      }
      

Secrets Management in IaC

Terraform - Verwendung von AWS Secrets Manager

      # Secret im Secrets Manager erstellen
      resource "aws_secretsmanager_secret" "db_password" {
      name = "production/db/password"
      recovery_window_in_days = 30
      }
      resource "aws_secretsmanager_secret_version" "db_password" {
      secret_id     = aws_secretsmanager_secret.db_password.id
      secret_string = random_password.db_password.result
      }
      # Secret referenzieren (gibt den Wert nicht preis)
      data "aws_secretsmanager_secret_version" "db_password" {
      secret_id = aws_secretsmanager_secret.db_password.id
      }
      # In RDS verwenden (Referenz, kein hardcoded Wert)
      resource "aws_db_instance" "main" {
      # ... weitere Konfigurationen
      password = data.aws_secretsmanager_secret_version.db_password.secret_string
      }
      

git-secrets - Commits von Secrets verhindern

      # Install git-secrets
      brew install git-secrets
      # Hooks für Repository einrichten
      git secrets --install
      git secrets --register-aws
      # Commit-Historie scannen
      git secrets --scan-history
      # Commits mit Secrets verhindern
      # Automatisch über pre-commit hook
      

State-File-Sicherheit

  • Remote State: S3 + DynamoDB-Lock, niemals lokalen State committen
  • Verschlüsselung: Server-Side Encryption in S3
  • Zugriffskontrolle: Restriktive IAM-Policies für State-Bucket
  • Versionierung: Versionierung für Recovery aktivieren
  • State Locking: DynamoDB, um gleichzeitige Änderungen zu verhindern

Sicheres Terraform Remote Backend

      terraform {
      backend "s3" {
      bucket         = "terraform-state-prod"
      key            = "global/s3/terraform.tfstate"
      region         = "us-east-1"
      encrypt        = true
      dynamodb_table = "terraform-state-lock"
      # MFA delete protection
      versioning {
      enabled = true
      mfa_delete = true
      }
      }
      }
      

CI/CD-Integration

GitHub Actions - Sicherer Terraform-Workflow

      name: 'Terraform Security Scan'
      on:
      pull_request:
      branches: [ main ]
      jobs:
      terraform-security:
      runs-on: ubuntu-latest
      steps:
      - uses: actions/checkout@v3
      - name: Run tfsec
      uses: aquasecurity/[email protected]
      with:
      soft_fail: false
      - name: Run Checkov
      uses: bridgecrewio/checkov-action@master
      with:
      directory: .
      framework: terraform
      output_format: sarif
      output_file_path: checkov.sarif
      - name: Upload results to GitHub Security
      uses: github/codeql-action/upload-sarif@v2
      with:
      sarif_file: checkov.sarif
      

Drift Detection

Manuelle Änderungen außerhalb des IaC erkennen, die Sicherheitslücken schaffen:

  • Terraform Cloud: Automatische Health Checks
  • driftctl: Open-Source Drift Detection
  • CloudFormation Drift Detection: Nativer AWS-Service
  • Geplante Scans: Periodische CI/CD-Jobs

Compliance-Frameworks

  • CIS Benchmarks: Terraform-Module für Compliance
  • NIST 800-53: Policy Packs für Controls
  • PCI-DSS: Policies für Payment-Card-Processing
  • HIPAA: Healthcare-Compliance-Policies
  • SOC 2: Security-Organization-Policies

Sichere Terraform-Module

  • Verifizierte Module aus der Terraform Registry verwenden
  • Modulversionen pinnen (nicht latest verwenden)
  • Code-Review für interne Module
  • Private Registry für benutzerdefinierte Module
  • Security-Überlegungen dokumentieren

Best Practices

  • Peer Review: Verpflichtende PRs für Änderungen in Prod
  • Plan vor Apply: Review der vorgeschlagenen Änderungen
  • Getrennte Umgebungen: Dev/Staging/Prod isoliert
  • Tagging-Strategie: Tags für Governance und Cost Allocation
  • Least Privilege: Spezifische IAM-Rollen für CI/CD
  • Automatisierte Tests: Terratest zur Validierung

Abschließende Empfehlungen

IaC-Security muss von Anfang an automatisiert und in CI/CD integriert sein. Verwenden Sie mehrere Scanning-Werkzeuge (tfsec, Checkov) für eine vollständige Abdeckung. Implementieren Sie Policy as Code mit OPA oder Sentinel. Committen Sie niemals Secrets, nutzen Sie Secret Manager. Überwachen Sie Drift kontinuierlich. IaC-Fehlkonfiguration ist eine der häufigsten Ursachen für Cloud-Breaches.