الامتثال والسياسات ككود

السياسة لكود البنية التحتية

18 دقيقة الدرس 6 من 27

السياسة لكود البنية التحتية

منحت البنية التحتية كود الفرقَ قابلية التكرار والسرعة — لكنها تعني أيضاً أن وحدة Terraform واحدة مُهيَّأة بشكل خاطئ يمكنها طبع نفس الثغرة الأمنية في كل بيئة خلال دقائق. يُعدّ تطبيق السياسة على مستوى IaC، قبل تشغيل terraform apply على الإطلاق، أعلى نقطة رافعة للتحكم في برنامج الامتثال السحابي. تتناول هذه الدرس الأدوات الثلاثة السائدة التي تُطبّق هذا الحاجز: Checkov، وtfsec، وHashiCorp Sentinel.

لماذا نُطبّق الحاجز في مرحلة الخطة؟

تتزايد تكلفة الإعداد الخاطئ كلما تأخر اكتشافه. اكتشاف حاوية S3 مفتوحة في فحص ثابت لملف .tf لا يكلف شيئاً. اكتشافه بعد terraform apply في الإنتاج يعني الاستجابة للحوادث، واحتمال كشف البيانات، ونتائج التدقيق. الهدف هو الفشل السريع في خط أنابيب سحب الطلبات حتى يصلح المهندسون المشكلات في حين لا يزال السياق حاضراً وقبل استدعاء أي واجهة برمجية للسحابة.

توجد ثلاث نقاط تطبيق طبيعية:

  1. خطافات ما قبل الالتزام — اكتشاف الأخطاء الواضحة على جهاز المهندس قبل وصول الكود إلى نظام التحكم بالإصدارات.
  2. حاجز PR في CI — تشغيل فحص كامل على كل طلب سحب؛ حجب الدمج إذا فشلت سياسات عالية الخطورة.
  3. فحص خطة Terraform — تحليل JSON الخطة الفعلية (وليس ملفات المصدر فقط) للتعبيرات المُقيَّمة وقت التشغيل التي لا يستطيع التحليل الثابت رؤيتها.

تستخدم خطوط الأنابيب الاحترافية الثلاث طبقات معاً؛ وحاجز CI هو النقطة غير القابلة للتفاوض لأنه التحقق الآلي الأخير قبل وصول الكود إلى الفرع الرئيسي.

Checkov — التحليل الثابت مفتوح المصدر

يقوم Checkov، الذي تصونه Bridgecrew (Prisma Cloud حالياً)، بفحص HCL الخاص بـ Terraform وقوالب CloudFormation وبيانات Kubernetes وقوالب ARM وملفات Dockerfile. يتضمن أكثر من 1000 فحص مدمج مُعيَّن على معايير CIS وSOC 2 وPCI DSS وHIPAA وNIST 800-53. وهو الخيار مفتوح المصدر الأكثر شيوعاً لأنه مجاني ومحدَّث باستمرار ويتكامل بسلاسة مع GitHub Actions وGitLab CI.

# التثبيت (يُفضَّل استخدام صورة Docker في CI لتثبيت الإصدار) pip install checkov==3.2.0 # فحص مجلد Terraform checkov -d ./infra/terraform/modules/s3 \ --framework terraform \ --compact \ --output cli \ --output junitxml \ --output-file-path results/ # فحص ملف خطة محدد (أكثر دقة - يكتشف القيم المُحسوبة) terraform plan -out=tfplan.binary terraform show -json tfplan.binary > tfplan.json checkov -f tfplan.json --framework terraform_plan

أكثر الأعلام فائدةً في سياق CI: --soft-fail يُخرج 0 حتى عند الفشل (مفيد لمراحل الإبلاغ)؛ --check CKV_AWS_18,CKV_AWS_20 يُشغّل معرّفات فحص محددة فقط؛ --skip-check CKV_AWS_144 يتخطى فحصاً مع تعليق مبرَّر في .checkov.yaml. اعمل دائماً على قمع التنبيهات عبر ملف التكوين، وليس عبر --skip-check مضمَّناً في أوامر CI — فعمليات القمع في ملف التكوين قابلة للمراجعة والتدقيق.

شغّل Checkov على ملف الخطة، وليس فقط على المصدر. تعبيرات Terraform مثل var.enable_logging ? true : false لا يمكن حلّها دائماً من HCL وحده. يحتوي JSON الخطة على القيم المُقيَّمة، لذا يكتشف فحص ملف الخطة الإعدادات الخاطئة المشروطة التي يفوتها فحص ملف المصدر.

tfsec — ماسح Terraform سريع ومخصص

تfsec (مدمج الآن في Trivy كـ trivy config) مصمم خصيصاً لـ Terraform. مكتوب بـ Go، سريع للغاية، ويفهم مراجع الوحدات عبر المجلدات — ميزة مهمة عندما يمتلك مستودعك تسلسلاً هرمياً للوحدات. يُرفق مخرجاته مباشرةً بإرشادات المعالجة وضابط معيار CIS ذي الصلة.

# التشغيل عبر Trivy (موصى به للإعدادات الجديدة — tfsec هو المحرك) trivy config ./infra/terraform \ --severity HIGH,CRITICAL \ --exit-code 1 \ --format table # المخرجات بتنسيق SARIF (للرفع إلى تبويب الأمان في GitHub) trivy config ./infra/terraform \ --format sarif \ --output trivy-results.sarif

يُعدّ استخدام مخرجات SARIF أفضل ممارسة في خطوط أنابيب المؤسسات لأن GitHub وGitLab يستطيعان عرض تعليقات الكود المضمّنة مباشرة في طلب السحب، مما يتيح للمهندسين رؤية أي سطر أطلق أي اكتشاف دون مغادرة واجهة المراجعة.

IaC Policy Gate in CI Pipeline PR / Commit (.tf files) Pre-commit tflint / checkov Plan Scan checkov (plan.json) Sentinel Gate Hard / Soft enforce tf apply Infra provisioned BLOCKED Violation found plan.json policy check fail → block PR
حواجز سياسة IaC في كل مرحلة من مراحل CI: ما قبل الالتزام، وفحص ملف الخطة، وSentinel قبل التطبيق.

HashiCorp Sentinel — السياسة كود لمنظومة Terraform

Sentinel هو إطار عمل السياسات التجاري لـ HashiCorp، المتاح في Terraform Cloud وTerraform Enterprise. على خلاف Checkov وtfsec اللذان يعملان خارجياً، يعمل Sentinel داخل سير عمل تشغيل Terraform، مع وصول مباشر إلى الخطة وبيانات التشغيل وتكوين مساحة العمل. هذا يجعله نقطة التطبيق الموثوقة عندما تستخدم منظمتك Terraform Cloud كمحرك تطبيق.

تُكتب سياسات Sentinel بلغة Sentinel (مشابهة لـ Go) ويمكن ضبطها على ثلاثة مستويات تطبيق: استشاري (تحذير فقط)، وإلزامي ناعم (يمكن تجاوزه بمبرر)، وإلزامي صارم (يحجب التطبيق تماماً، دون أي تجاوز). استخدم الإلزامي الصارم للضوابط التنظيمية (التشفير، حجب الوصول العام) والإلزامي الناعم للمعايير التنظيمية التي توجد فيها استثناءات مشروعة.

# sentinel-s3-encryption.sentinel import "tfplan/v2" as tfplan # جمع كل موارد حاويات S3 في الخطة s3_buckets = filter tfplan.resource_changes as _, rc { rc.type is "aws_s3_bucket" and (rc.change.actions contains "create" or rc.change.actions contains "update") } # القاعدة: كل حاوية يجب أن تحتوي على تشفير من جانب الخادم bucket_encryption_enabled = rule { all s3_buckets as _, bucket { bucket.change.after.server_side_encryption_configuration is not null } } main = rule { bucket_encryption_enabled }
Sentinel لا يحل محل الماسحات الخارجية. لا يعمل Sentinel إلا عند تشغيل Terraform عبر Terraform Cloud. المهندسون الذين يشغّلون terraform plan محلياً أو في CI غير مرتبط بـ TFC يتجاوزونه تماماً. اقرن دائماً Sentinel بـ Checkov/Trivy في خط أنابيب PR — Sentinel هو الحاجز الصارم النهائي؛ وCheckov هو حلقة التغذية الراجعة المبكرة.

نمط تكامل GitHub Actions

تُشغّل وظيفة CI الاحترافية الفحوصات بالتوازي، وترفع نتائج SARIF إلى تبويب الأمان، وتُفشل خط الأنابيب إذا وُجدت أي اكتشافات CRITICAL أو HIGH في الفئات الخاضعة للسياسة. الاكتشافات الإعلامية ومنخفضة الخطورة تُبلَّغ عنها لكنها لا تُعيق.

# .github/workflows/iac-policy.yml name: IaC Policy Gate on: pull_request: paths: - 'infra/**' jobs: checkov: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Terraform init & plan run: | cd infra/terraform terraform init -backend=false terraform plan -out=tfplan.binary terraform show -json tfplan.binary > tfplan.json env: AWS_ACCESS_KEY_ID: ${{ secrets.TF_PLAN_KEY }} AWS_SECRET_ACCESS_KEY: ${{ secrets.TF_PLAN_SECRET }} - name: Checkov plan scan uses: bridgecrewio/checkov-action@v12 with: file: infra/terraform/tfplan.json framework: terraform_plan output_format: cli,sarif output_file_path: console,results.sarif soft_fail: false check: CKV_AWS_18,CKV_AWS_20,CKV_AWS_19,CKV_AWS_57 - name: Upload SARIF to Security tab uses: github/codeql-action/upload-sarif@v3 if: always() with: sarif_file: results.sarif trivy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Trivy config scan uses: aquasecurity/trivy-action@master with: scan-type: config scan-ref: infra/terraform severity: HIGH,CRITICAL exit-code: '1' format: sarif output: trivy.sarif - uses: github/codeql-action/upload-sarif@v3 if: always() with: sarif_file: trivy.sarif

إدارة استثناءات القمع دون تراكم ديون الامتثال

ستكشف كل عملية فحص عن اكتشافات مقبولة فعلاً في بيئتك — حاوية S3 عامة تستضيف موقعاً ثابتاً على سبيل المثال. اعمل على قمع هذه التنبيهات عبر ملف تكوين .checkov.yaml مُلتزم به في المستودع، وليس عبر أعلام CLI مضمّنة. يجب أن يتضمن كل قمع معرّف الفحص، والمورد الذي ينطبق عليه، وتعليقاً يوضح مبرر الأعمال. عمليات القمع بدون تعليقات مبرَّرة تُخفق في عملية مراجعة الكود، والأهم، في مراجعة المدققين.

تتبّع عمر الاستثناءات. أضف حقل date لكل استثناء قمع وشغّل وظيفة ربع سنوية تُنبّه على الاستثناءات الأقدم من 90 يوماً. الاستثناءات دين تقني — يجب أن تكون محدودة بوقت وخاضعة للمراجعة، لا متراكمة إلى أجل غير مسمى. فشلت منظمات كثيرة في التدقيق ليس لأن لديها استثناءات، بل لأن لديها استثناءات لا يتذكر أحد من أذن بها.

يُنشئ الجمع بين فحوصات مصدر Checkov وفحوصات ملف الخطة وTrivy للتحليل الواعي بالوحدات وSentinel كحاجز صارم في Terraform Cloud، هندسةَ تطبيق سياسة دفاعية متعددة الطبقات. تكتشف كل طبقة فئات مختلفة من الإعداد الخاطئ، ومعاً تمنحك أثر الأدلة الموثق والآلي الذي يتطلبه مدققو SOC 2 وPCI DSS.