إدارة الأسرار وأمان البنية التحتية
أمان البنية التحتية كرمز (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. :::