إدارة الأسرار وأمان البنية التحتية

أمان البنية التحتية كرمز (Checkov, tfsec)

4 دقيقة للقراءة

البنية التحتية كرمز (IaC) تتيح لك التحكم بالإصدارات في بنيتك التحتية. لكن IaC سيء التكوين يعني بنية تحتية سيئة التكوين على نطاق واسع. فحص أمان IaC يكتشف هذه المشاكل قبل النشر.

لماذا أمان IaC مهم

سوء التكوين التأثير
وصول S3 bucket العام خرق البيانات
Security group 0.0.0.0/0 تعرض الشبكة
قاعدة بيانات غير مشفرة انتهاك الامتثال
تسجيل مفقود لا رؤية للحوادث
IAM مفرط الصلاحيات تصعيد الصلاحيات

إحصائيات:

  • 65% من اختراقات السحابة تنبع من سوء التكوين
  • 99% من ملفات IaC لديها سوء تكوين واحد على الأقل
  • متوسط 45 يوم لاكتشاف الاختراقات القائمة على سوء التكوين

أدوات أمان IaC

الأداة التركيز الأفضل لـ
Checkov متعدد الأطر (TF, K8s, ARM, CFN) الفحص الشامل
tfsec خاص بـ Terraform فحص Terraform السريع
KICS متعدد الأطر بديل مفتوح المصدر
Terrascan السياسة كرمز السياسات المخصصة
Snyk IaC متعدد الأطر مستخدمو Snyk

Checkov: فحص متعدد الأطر

التثبيت

# التثبيت عبر pip
pip install checkov

# أو عبر Homebrew
brew install checkov

# أو عبر Docker
docker pull bridgecrew/checkov

الاستخدام الأساسي

# فحص الدليل الحالي
checkov -d .

# فحص ملف محدد
checkov -f main.tf

# فحص مع إطار محدد
checkov -d . --framework terraform

# الإخراج كـ JSON
checkov -d . -o json > results.json

# فحص بيانات Kubernetes
checkov -d ./k8s --framework kubernetes

مثال على النتائج

Passed checks: 23, Failed checks: 5, Skipped checks: 0

Check: CKV_AWS_19: "Ensure the S3 bucket has server-side-encryption enabled"
	FAILED for resource: aws_s3_bucket.data
	File: /main.tf:15-25
	Guide: https://docs.bridgecrew.io/docs/s3_19-s3-bucket-encryption

Check: CKV_AWS_20: "Ensure S3 bucket has block public ACLs enabled"
	FAILED for resource: aws_s3_bucket.data
	File: /main.tf:15-25

فحوصات مخصصة

# .checkov/custom_policy.yaml
metadata:
  id: "CKV2_CUSTOM_1"
  name: "Ensure all S3 buckets have a Name tag"
  category: "CONVENTION"
definition:
  cond_type: "attribute"
  resource_types:
    - "aws_s3_bucket"
  attribute: "tags.Name"
  operator: "exists"

tfsec: فحص خاص بـ Terraform

التثبيت

# macOS
brew install tfsec

# تثبيت Go
go install github.com/aquasecurity/tfsec/cmd/tfsec@latest

# Docker
docker pull aquasec/tfsec

الاستخدام الأساسي

# فحص الدليل
tfsec .

# فحص مع فشل ناعم (لا يخرج 1)
tfsec . --soft-fail

# الإخراج كـ SARIF لـ GitHub
tfsec . --format sarif > tfsec.sarif

# استثناء فحوصات محددة
tfsec . --exclude aws-s3-enable-bucket-logging

تكامل CI/CD

# GitHub Actions مع Checkov
name: IaC Security Scan

on:
  pull_request:
    paths:
      - '**/*.tf'
      - '**/*.yaml'
      - '**/*.yml'

jobs:
  checkov:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Run Checkov
        uses: bridgecrewio/checkov-action@v12
        with:
          directory: .
          framework: terraform
          output_format: sarif
          output_file_path: checkov.sarif
          soft_fail: false

      - name: Upload SARIF
        uses: github/codeql-action/upload-sarif@v3
        with:
          sarif_file: checkov.sarif
# tfsec GitHub Action
- name: Run tfsec
  uses: aquasecurity/tfsec-action@v1.0.3
  with:
    soft_fail: false

سوء التكوين الشائع حسب المزود

AWS

# سيء: S3 bucket عام
resource "aws_s3_bucket" "bad" {
  bucket = "my-bucket"
}

resource "aws_s3_bucket_public_access_block" "bad" {
  bucket = aws_s3_bucket.bad.id
  block_public_acls       = false  # يجب أن يكون true
  block_public_policy     = false  # يجب أن يكون true
}

# جيد: S3 bucket آمن
resource "aws_s3_bucket" "good" {
  bucket = "my-bucket"
}

resource "aws_s3_bucket_public_access_block" "good" {
  bucket = aws_s3_bucket.good.id
  block_public_acls       = true
  block_public_policy     = true
  ignore_public_acls      = true
  restrict_public_buckets = true
}

resource "aws_s3_bucket_server_side_encryption_configuration" "good" {
  bucket = aws_s3_bucket.good.id
  rule {
    apply_server_side_encryption_by_default {
      sse_algorithm = "AES256"
    }
  }
}

Kubernetes

# سيء: التشغيل كـ root
apiVersion: v1
kind: Pod
spec:
  containers:
    - name: app
      image: nginx
      securityContext:
        runAsUser: 0  # Root!

# جيد: غير root، مقيد
apiVersion: v1
kind: Pod
spec:
  securityContext:
    runAsNonRoot: true
    seccompProfile:
      type: RuntimeDefault
  containers:
    - name: app
      image: nginx
      securityContext:
        runAsUser: 1000
        allowPrivilegeEscalation: false
        readOnlyRootFilesystem: true
        capabilities:
          drop:
            - ALL

كتم الإيجابيات الخاطئة

تخطي Checkov المضمن

resource "aws_s3_bucket" "logs" {
  #checkov:skip=CKV_AWS_19:التشفير غير مطلوب للسجلات العامة
  bucket = "public-logs"
}

تجاهل tfsec المضمن

resource "aws_security_group" "allow_all" {
  #tfsec:ignore:aws-vpc-no-public-ingress-sgr
  ingress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]  # عام عمداً
  }
}

تكامل Pre-Commit

# .pre-commit-config.yaml
repos:
  - repo: https://github.com/bridgecrewio/checkov
    rev: '3.0.0'
    hooks:
      - id: checkov
        args: ['--framework', 'terraform']

  - repo: https://github.com/aquasecurity/tfsec
    rev: v1.28.0
    hooks:
      - id: tfsec

في الوحدة النهائية، سنغطي الامتثال والحوكمة ونضج DevSecOps. :::

اختبار

الوحدة 5: إدارة الأسرار وأمان البنية التحتية

خذ الاختبار