INFRASTRUCTURE AS CODE

IaC Security

Zabezpečení Infrastructure as Code - automatické security scanning, policy as code a GitOps principy pro bezpečnou a auditovatelnou infrastrukturu.

Co je IaC Security?

Infrastructure as Code (IaC) Security zahrnuje procesy a nástroje pro zabezpečení vaší infrastruktury definované v kódu. Když píšete infrastrukturu jako kód (např. Terraform, CloudFormation), automaticky vytváříte dokumentaci vaší infrastruktury a můžete použít nástroje pro validaci bezpečnostních konfigurací ještě před jejich nasazením.

Proč je IaC důležité pro bezpečnost?

Představte si, že vaše infrastruktura byla větší - měli byste development, staging a production prostředí, více GitLab runnerů, databázové servery a další. Kdybychom všechno konfigurovali manuálně, nastaly by problémy:

  • Pomalá konfigurace: Manuální vytváření zdrojů je časově náročné a obtížně škálovatelné
  • Nekonzistence: Obtížné zajistit stejnou konfiguraci napříč prostředími
  • Chybějící dokumentace: Bez IaC nemáte přehled jak byla infrastruktura vytvořena
  • Riziko miskonfigurací: Lidé dělají chyby - zapomenou uzavřít port, smazat nepotřebného uživatele
  • Žádný audit trail: Bez verzování nevíte kdo co změnil a proč
  • Obtížná obnova: Po útoku nevíte jak obnovit původní stav

Výhody Infrastructure as Code

  • Kód je sám o sobě dokumentací vaší infrastruktury
  • Můžete použít nástroje pro validaci bezpečnostních problémů
  • Peer reviews a security audity kódu
  • Verzování a audit trail všech změn
  • Rychlá obnova po incidentu - stačí aplikovat kód

GitOps principy pro IaC

GitOps je přístup kde Git repozitář slouží jako single source of truth pro vaší infrastrukturu. Všechny změny prochází přes pull requesty, code review a automatizované testy.

GitOps Workflow pro IaC

1. Code & Version Control

Všechna infrastruktura je v Git repozitáři

  • Terraform/CloudFormation/Pulumi kód
  • Branch protection rules
  • Required reviews před merge

2. Automated Validation

CI pipeline automaticky validuje změny

  • terraform validate - syntaxe a struktura
  • tfsec/Checkov - security scanning
  • terraform plan - preview změn

3. Review & Approval

Lidská kontrola před nasazením

  • Code review od kolegů
  • Security review pro kritické změny
  • Approval gates v pipeline

4. Automated Deployment

Centralizované nasazení přes pipeline

  • terraform apply pouze z pipeline
  • Remote state management
  • Audit log všech deploymentů

IaC Security Scanning nástroje

Open Source

tfsec

Security scanner specifická pro Terraform kód. Detekuje bezpečnostní miskonfigurace.

  • 300+ built-in pravidel
  • Podpora custom pravidel
  • CI/CD integrace
  • SARIF output format
Open Source

Checkov

Policy-as-code nástroj pro IaC scanning - Terraform, CloudFormation, Kubernetes a další.

  • Multi-framework podpora
  • 1000+ built-in policies
  • Custom policies v Python
  • Graph-based analysis
Open Source

Terrascan

Static code analyzer pro Infrastructure as Code s podporou OPA policies.

  • 500+ policies
  • OPA Rego policies
  • Kubernetes, Docker, Terraform
  • Webhook integration
Terraform Native

terraform validate

Built-in Terraform příkaz pro validaci syntaxe a struktury.

  • Syntax validation
  • Variable references
  • Module validation
  • Provider requirements

Praktický příklad: CI/CD Pipeline pro Terraform

# .gitlab-ci.yml - DevSecOps Pipeline pro Terraform stages: - init - test - plan - deploy variables: TF_ROOT: ${CI_PROJECT_DIR}/terraform # Inicializace Terraform init: stage: init image: hashicorp/terraform:1.6 script: - cd $TF_ROOT - terraform init -backend-config="bucket=$TF_STATE_BUCKET" artifacts: paths: - $TF_ROOT/.terraform # Validace syntaxe validate: stage: test image: hashicorp/terraform:1.6 script: - cd $TF_ROOT - terraform validate allow_failure: false # Security scanning s tfsec tfsec: stage: test image: aquasec/tfsec:latest script: - tfsec $TF_ROOT --format json --out tfsec-results.json artifacts: paths: - tfsec-results.json when: always allow_failure: true # Neblokuje pipeline, ale reportuje issues # Security scanning s Checkov checkov: stage: test image: bridgecrew/checkov:latest script: - checkov -d $TF_ROOT --output-file checkov-results.json --output json artifacts: paths: - checkov-results.json when: always allow_failure: true # Terraform plan plan: stage: plan image: hashicorp/terraform:1.6 script: - cd $TF_ROOT - terraform plan -out=tfplan artifacts: paths: - $TF_ROOT/tfplan dependencies: - init # Terraform apply - pouze na main branch s manual approval deploy: stage: deploy image: hashicorp/terraform:1.6 script: - cd $TF_ROOT - terraform apply -auto-approve tfplan dependencies: - plan when: manual only: - main environment: name: production

Příklad tfsec výstupu

# tfsec výsledky Result #1 CRITICAL Security group rule allows ingress from public internet Location: main.tf:173 Description: Opening a security group to the public internet allows any IP address to potentially access resources behind the security group. Impact: Resources could be exposed to the public internet Resolution: Limit the CIDR blocks to known IP ranges See https://aquasecurity.github.io/tfsec/latest/checks/aws/vpc/... --- Result #2 HIGH VPC Flow Logs is not enabled Location: main.tf:45 Description: VPC Flow Logs capture information about IP traffic going to and from network interfaces in a VPC. Resolution: Enable VPC Flow Logs for audit and troubleshooting --- 8 potential problems detected (17 passed)

Bezpečný Terraform kód - příklady

Security Group - správně vs špatně

# ŠPATNĚ - příliš otevřená security group resource "aws_security_group" "bad_example" { name = "allow-all" ingress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] # Všechny porty otevřené světu! } } # DOBŘE - minimální potřebná oprávnění resource "aws_security_group" "good_example" { name = "app-security-group" description = "Security group for web application" vpc_id = aws_vpc.main.id # Pouze HTTPS ingress { description = "HTTPS from internet" from_port = 443 to_port = 443 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } # Pouze potřebný egress egress { description = "HTTPS outbound" from_port = 443 to_port = 443 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } tags = { Name = "app-sg" Environment = var.environment } }

S3 Bucket - encryption a access control

# Bezpečný S3 bucket resource "aws_s3_bucket" "secure_bucket" { bucket = "my-secure-bucket-${var.environment}" tags = { Name = "secure-bucket" Environment = var.environment } } # Blokovat veřejný přístup resource "aws_s3_bucket_public_access_block" "secure_bucket" { bucket = aws_s3_bucket.secure_bucket.id block_public_acls = true block_public_policy = true ignore_public_acls = true restrict_public_buckets = true } # Povolit encryption resource "aws_s3_bucket_server_side_encryption_configuration" "secure_bucket" { bucket = aws_s3_bucket.secure_bucket.id rule { apply_server_side_encryption_by_default { sse_algorithm = "aws:kms" kms_master_key_id = aws_kms_key.s3_key.arn } bucket_key_enabled = true } } # Povolit versioning resource "aws_s3_bucket_versioning" "secure_bucket" { bucket = aws_s3_bucket.secure_bucket.id versioning_configuration { status = "Enabled" } } # Access logging resource "aws_s3_bucket_logging" "secure_bucket" { bucket = aws_s3_bucket.secure_bucket.id target_bucket = aws_s3_bucket.log_bucket.id target_prefix = "s3-access-logs/" }

IaC Security Best Practices - Shrnutí

GitOps & Version Control

  • Všechna infrastruktura v Git repozitáři
  • Branch protection - žádné přímé pushe do main
  • Required code reviews před merge
  • Signed commits pro audit trail
  • Semantic versioning pro releases

Automated Security Scanning

  • tfsec nebo Checkov v každém PR
  • Blokovat merge při kritických findings
  • Generovat reporty pro audit
  • Pravidelně aktualizovat pravidla
  • Custom policies pro vaše požadavky

Secure Terraform Practices

  • Remote state s encryption (S3 + DynamoDB lock)
  • Sensitive values v variables, ne v kódu
  • Používat data sources místo hardcoded values
  • Moduly pro znovupoužitelnou infrastrukturu
  • terraform plan review před apply

Co NEDĚLAT

  • Hardcoded secrets v Terraform kódu
  • terraform apply z lokálního počítače
  • Ignorovat security scan výsledky
  • Wildcard permissions (0.0.0.0/0 na všech portech)
  • Vypnuté encryption pro storage
  • Chybějící tagy pro audit a cost tracking