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.
