Infrastructure as Code Security

Infrastructure as Code מביא יתרונות של בקרת גרסאות ואוטומציה אך מכניס סיכונים אם תצורות שגויות מופצות באופן אוטומטי. אבטחה צריכה להיות shift-left עבור IaC.

פגיעויות נפוצות ב-IaC

  • Hardcoded secrets: אישורי גישה בקוד מנוהל גרסאות
  • כללים מתירניים מדי: Security groups 0.0.0.0/0
  • משאבים לא מוצפנים: S3 buckets, RDS ללא הצפנה
  • גישה ציבורית: משאבים חשופים שלא לצורך
  • היעדר תיעוד (logging): CloudTrail, flow logs מושבתים
  • אימות חלש: MFA לא נאכף

כלי סריקה

Terraform - tfsec, Checkov, Terrascan

      # דוגמה לפגיעות - S3 bucket ציבורי
      resource "aws_s3_bucket" "bad_bucket" {
      bucket = "my-public-bucket"
      acl    = "public-read"  # [שגיאה] פגיע
      }
      # תיקון
      resource "aws_s3_bucket" "good_bucket" {
      bucket = "my-private-bucket"
      acl    = "private"  # [תקין] מאובטח
      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

      # Install
      brew install tfsec
      # Scan Terraform files
      tfsec .
      # פלט ספציפי
      tfsec --format json --out results.json .
      # CI/CD integration
      tfsec --soft-fail . || exit 1
      

Checkov - סורק IaC רב-ענני

      # 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 מאפשר לכתוב policies בשפת Rego כדי לאכוף תאימות:

      # 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 המשולב עם 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 ב-IaC

Terraform - שימוש ב-AWS Secrets Manager

      # יצירת secret ב-Secrets Manager
      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 (לא חושף את הערך)
      data "aws_secretsmanager_secret_version" "db_password" {
      secret_id = aws_secretsmanager_secret.db_password.id
      }
      # שימוש ב-RDS (הפניה, לא ערך hardcoded)
      resource "aws_db_instance" "main" {
      # ... הגדרות נוספות
      password = data.aws_secretsmanager_secret_version.db_password.secret_string
      }
      

git-secrets - מניעת commits של secrets

      # Install git-secrets
      brew install git-secrets
      # הגדרת hooks למאגר
      git secrets --install
      git secrets --register-aws
      # סריקת היסטוריית commits
      git secrets --scan-history
      # מניעת commits עם secrets
      # אוטומטי דרך pre-commit hook
      

אבטחת State File

  • Remote state: S3 + DynamoDB lock, לעולם אל תבצע commit ל-state מקומי
  • הצפנה: Server-side encryption ב-S3
  • בקרת גישה: IAM policies מגבילות עבור ה-state bucket
  • בקרת גרסאות: הפעלת versioning לצורך recovery
  • State locking: DynamoDB למניעת שינויים מקבילים

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

GitHub Actions - 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

זיהוי שינויים ידניים מחוץ ל-IaC היוצרים פרצות אבטחה:

  • Terraform Cloud: Health checks אוטומטיים
  • driftctl: Drift detection בקוד פתוח
  • CloudFormation Drift Detection: שירות AWS מובנה
  • סריקות מתוזמנות: משימות CI/CD תקופתיות

Frameworks לתאימות

  • CIS Benchmarks: מודולי Terraform לתאימות
  • NIST 800-53: Policy packs לבקרות
  • PCI-DSS: Policies לעיבוד כרטיסי תשלום
  • HIPAA: Policies לתאימות בתחום הבריאות
  • SOC 2: Policies לאבטחה ארגונית

מודולי Terraform מאובטחים

  • שימוש במודולים מאומתים מ-Terraform Registry
  • קיבוע גרסאות מודול (לא להשתמש ב-latest)
  • סקירת קוד של מודולים פנימיים
  • Private registry למודולים מותאמים אישית
  • תיעוד שיקולי אבטחה

שיטות עבודה מומלצות

  • Peer review: PRs חובה לשינויים ב-prod
  • Plan לפני apply: סקירת השינויים המוצעים
  • הפרדת סביבות: Dev/Staging/Prod מבודדים
  • אסטרטגיית תיוג: Tags לממשל ולהקצאת עלויות
  • Least privilege: תפקידי IAM ספציפיים ל-CI/CD
  • בדיקות אוטומטיות: Terratest לאימות

המלצות מסכמות

אבטחת IaC צריכה להיות אוטומטית ומשולבת ב-CI/CD מההתחלה. השתמשו במספר כלי סריקה (tfsec, Checkov) לכיסוי מלא. יישמו policy as code עם OPA או Sentinel. לעולם אל תבצעו commit של secrets, השתמשו ב-secret managers. נטרו drift באופן רציף. תצורה שגויה ב-IaC היא אחת הסיבות הנפוצות ביותר לפריצות ענן.