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 היא אחת הסיבות הנפוצות ביותר לפריצות ענן.
