
ماسح أمان Docker مدعوم بالذكاء الاصطناعي يشرح الثغرات الأمنية بلغة إنجليزية بسيطة. مشروع معملي من OWASP.

ماسح أمان Docker مدعوم بالذكاء الاصطناعي يشرح الثغرات الأمنية بلغة إنجليزية بسيطة
DockSec هو مشروع مختبر OWASP يسد الفجوة بين نتائج فحوصات الأمان المعقدة والإصلاحات العملية للمطورين. يدمج الماسحات الضوئية القياسية في الصناعة (Trivy, Hadolint, Docker Scout) مع الذكاء الاصطناعي لتوفير تحليل أمني مدرك للسياق.
بدلاً من إغراقك بقائمة تضم أكثر من 200 ثغرة CVE، يقوم DockSec بـ:
كل شيء يُفحص محلياً؛ الشيء الوحيد الذي يغادر جهازك على الإطلاق هو محتوى الملف (مع إخفاء الأسرار) الذي يُرسل إلى مزود الذكاء الاصطناعي الذي تختاره - ومع نموذج محلي أو وضع الفحص فقط، لا يغادر أي شيء على الإطلاق. انظر تدفق البيانات والخصوصية.
سير عمل DockSec: من الفحص إلى رؤى قابلة للتنفيذ
يتبع DockSec مساراً من أربع مراحل:
يقوم DockSec بتنسيق الماسحات الضوئية المحلية، لذا فهو يحتاج إلى:
| المتطلب | الغرض منه | التثبيت |
|---|---|---|
| Python 3.12+ | DockSec نفسه | python.org |
| Trivy | جميع الفحوصات (إلزامي) | brew install trivy أو وثائق Trivy |
| Hadolint | فحص ملفات Dockerfile | brew install hadolint أو وثائق Hadolint |
| Docker | فحوصات الصور (-i) | وثائق Docker |
أو دع DockSec يقوم بتثبيت Trivy وHadolint نيابةً عنك:```bash python -m docksec.setup_external_tools
### 2. تثبيت DockSec```bash
# Full install with AI analysis support (recommended)
pip install "docksec[ai]"
# Or the slim, scan-only core (no LLM dependencies, no API key needed)
pip install docksec
لا حاجة لمفتاح API للفحص المحلي:```bash docksec Dockerfile --scan-only
تنتهي كل عملية فحص بملخص للنتائج: جدول للخطورة، ودرجة أمان من 0 إلى 100 مع
تقييم، وكتلة إجراءات "نظرة سريعة"، والتقارير المُنشأة (المحفوظة في
`~/.docksec/results/` افتراضيًا)، وأمر تالي مقترح.
### 4. تفعيل تحليل الذكاء الاصطناعي
يحلل تحليل الذكاء الاصطناعي النتائج ويقترح إصلاحات. اختر مزودًا، وعيّن مفتاح API الخاص به، ثم نفّذ:```bash
# OpenAI (default provider)
export OPENAI_API_KEY="sk-..."
docksec Dockerfile
# Anthropic Claude
export ANTHROPIC_API_KEY="sk-ant-..."
docksec Dockerfile --ai-only --provider anthropic --model claude-sonnet-5
# Google Gemini
export GOOGLE_API_KEY="..."
docksec Dockerfile --ai-only --provider google
# Ollama (fully local, no API key, data never leaves your machine)
docksec Dockerfile --ai-only --provider ollama --model llama3.1
كل مزوّد لديه نموذج افتراضي معقول (OpenAI: gpt-4o، Anthropic:
claude-haiku-4-5، Google: gemini-1.5-pro، Ollama: llama3.1)، لذا فإن --model هو
اختياري. لتجنب تكرار العلامات، قم بتعيين متغيرات البيئة (أو ضعها في ملف .env
في الدليل الذي تشغّل منه - يقوم DockSec بتحميله تلقائيًا):```bash
export LLM_PROVIDER=anthropic
export LLM_MODEL=claude-sonnet-5
docksec Dockerfile
قبل إرسال أي محتوى إلى مزوّد الذكاء الاصطناعي، يتم إخفاء القيم التي تبدو سرية (كلمات المرور، الرموز المميّزة، مفاتيح API، كتل المفاتيح الخاصة) تلقائيًا. راجع
[تدفّق البيانات والخصوصية](#data-flow-and-privacy).
### 5. أو استخدم GitHub Action```yaml
- name: Run DockSec AI Scanner
uses: OWASP/[email protected]
with:
dockerfile: 'Dockerfile'
openai_api_key: ${{ secrets.OPENAI_API_KEY }}
docksec Dockerfile -i myapp:latest
docksec --compose docker-compose.yml
docksec --image-only -i myapp:latest
docksec Dockerfile --scan-only
docksec -i myapp:latest --image-only --severity CRITICAL,HIGH,MEDIUM
docksec -i myapp:latest --image-only --fail-on high
docksec Dockerfile --scan-only --format json,html --output-dir ./reports
docksec -i myapp:latest --image-only --json
docksec Dockerfile --scan-only --sarif
docksec --image-only -i myapp:latest --sbom
docksec --image-only -i myapp:latest --offline
docksec -i myapp:latest --image-only --baseline .docksec-baseline.json --update-baseline docksec -i myapp:latest --image-only --baseline .docksec-baseline.json --fail-on high
docksec -i myapp:latest --image-only --ignore-file .docksec-ignore.yml
docksec -i myapp:latest --image-only --no-cache
docksec install-skill
docksec Dockerfile --scan-only --quiet # warnings, errors, summary only docksec Dockerfile --scan-only --verbose # INFO-level diagnostics on stderr docksec Dockerfile --scan-only --verbose --log-file logs/docksec.log docksec Dockerfile --no-color # also honors NO_COLOR
---
## ملف التكوين
قم بإضافة ملف `.docksec.yml` في جذر مستودعك وسيقوم الفريق بأكمله - وكل وظيفة CI - بالفحص وفقًا لنفس السياسة، بدلاً من أن يمرر كل مطور علاماته الخاصة.```yaml
# yaml-language-server: $schema=https://owasp.org/DockSec/docksec-config-schema.json
severity: CRITICAL,HIGH
fail_on: HIGH
formats: [json, html]
output_dir: ./security-reports
rules:
disabled:
- compose-missing-healthcheck
كل إعداد اختياري؛ أي شيء تتركه فارغًا يعود إلى متغير البيئة ثم إلى القيمة الافتراضية المدمجة. يوجد مثال كامل مشروح في
examples/.docksec.yml.
الأعلى أولوية أولاً:``` CLI flag > environment variable > .docksec.yml > built-in default
لذا فإن `severity: LOW` الملتزم بها لا تزال تُتجاوز بواسطة `--severity CRITICAL` في
سطر الأوامر، وبواسطة `DOCKSEC_DEFAULT_SEVERITY` في البيئة.
### الاكتشاف
يبحث DockSec عن `.docksec.yml` (أو `.docksec.yaml`) في دليل العمل
ثم يصعد إلى جذر المستودع، بحيث يرث الخدمة في
دليل فرعي من مستودع متعدد الحزم السياسة الملتزم بها في المستوى الأعلى. يتوقف البحث عند
الدليل الذي يحتوي على `.git`، لذا لا يلتقط أبدًا ملفًا من خارج
المستودع.
- `--config FILE` يستخدم ملفًا محددًا بدلاً من البحث.
- `--no-config` يتجاهل أي ملف إعدادات، لتشغيل CI قابل للتكرار.
يظهر ملف الإعدادات المعمول به في شريط الفحص، لذا يكون واضحًا دائمًا
أي سياسة تم تطبيقها.
### الإعدادات
| الإعداد | العلامة المكافئة | ملاحظات |
| --- | --- | --- |
| `severity` | `--severity` | مستويات الخطورة لفحص الصورة |
| `fail_on` | `--fail-on` | عتبة بوابة CI |
| `formats` | `--format` | صيغة القائمة: `[json, html]` |
| `output_dir` | `--output-dir` | وجهة التقرير |
| `provider` | `--provider` | `openai`, `anthropic`, `google`, `ollama` |
| `model` | `--model` | اسم النموذج للمزود |
| `offline` | `--offline` | بدون شبكة؛ يتخطى الذكاء الاصطناعي وDocker Scout |
| `skip_ai_scoring` | `--skip-ai-scoring` | التقييم المحلي فقط |
| `no_redact` | `--no-redact` | لا تخفِ الأسرار قبل استدعاء الذكاء الاصطناعي |
| `no_cache` | `--no-cache` | تجاوز ذاكرة التخزين المؤقت للفحص |
| `ignore_file` | `--ignore-file` | مسار ملف التنازل |
| `baseline` | `--baseline` | مسار ملف خط الأساس |
| `rules.disabled` | - | معرّفات القواعد لإيقافها تمامًا |
ملف الإعدادات غير الصالح - مفتاح غير معروف، خطورة سيئة - هو خطأ صارم
يخرج برمز `2` بدلاً من تحذير، لذا لا يمكن لملف سياسة معطوب أن يتسبب أبدًا في تشغيل فحص
تحت قواعد لم يلتزم بها الفريق.
### الإكمال التلقائي للمحرر
يعطي تعليق `# yaml-language-server:` في السطر الأول إكمالًا
وتحققًا داخليًا في VS Code ومحررات JetBrains. يُنشر المخطط في
[`docs/docksec-config-schema.json`](https://github.com/owasp/docksec/blob/main/docs/docksec-config-schema.json) ويمكن
إعادة توليده باستخدام `docksec --print-config-schema`.
### تعطيل القواعد
`rules.disabled` يوقف فحصًا تمامًا، في كل مكان - تتم إزالته
قبل التقييم والتقارير و`--json` وبوابة `--fail-on`. استخدمه للفحوصات
التي لا تنطبق على بيئتك. بالنسبة للنتائج الفردية التي قام فريقك
بفرزها وقبولها، فضّل [ملف التنازل](#ignoring-findings-waivers)،
الذي تحمل إدخالاته سببًا وتاريخ انتهاء وبالتالي تبقى قابلة للتدقيق.
---
## تكامل CI/CD
### رموز الخروج
يستخدم DockSec رموز خروج صديقة لـ CI بحيث يمكن للبناءات والأصداف التفاعل مع النتائج:
| الرمز | المعنى |
|---|---|
| `0` | نجاح، لا توجد نتائج عند أو فوق `--fail-on` |
| `1` | نتائج عند أو فوق عتبة `--fail-on` |
| `2` | خطأ في الاستخدام أو الوسائط |
| `3` | خطأ في الأداة أو وقت التشغيل (فشل الفحص، صورة غير موجودة، أدوات مفقودة) |
تتحكم `--fail-on` في البوابة بناءً على النتائج المنظمة (ثغرات الصور
وأخطاء تكوين compose). عندما تكون `--fail-on` أقل من `--severity` المطلوب، يتم توسيع
خطورة الفحص تلقائيًا بحيث يمكن للبوابة ملاحظة تلك النتائج.
### الإخراج القابل للقراءة آليًا
يطبع `--json` كائن JSON واحدًا إلى stdout (معلومات الفحص، الثغرات، عدد
الخطورة، وأي نتائج ذكاء اصطناعي) بدلاً من الملخص القابل للقراءة البشرية، بحيث يمكن تمريره
مباشرة إلى أدوات أخرى:```bash
docksec -i myapp:latest --image-only --json | jq '.severity_counts'
مع --json وحده، لا تتم كتابة أي ملفات تقارير؛ ادمجه مع --format لكتابة الملفات وطباعة JSON في نفس التشغيل. تنتقل جميع الرسائل القابلة للقراءة البشرية إلى stderr في وضع --json، بحيث لا يحتوي stdout أبدًا إلا على حمولة JSON.
يكتب --sarif تقرير SARIF 2.1.0 إلى جانب تنسيقات التقارير الأخرى. ارفعه باستخدام إجراء github/codeql-action/upload-sarif القياسي لرؤية النتائج مُعلَّقة مباشرة على طلبات السحب وفي تبويب الأمان:```yaml
name: Run DockSec uses: OWASP/[email protected] with: dockerfile: 'Dockerfile' sarif: 'true'
name: Upload SARIF to GitHub Code Scanning uses: github/codeql-action/upload-sarif@v3 if: always() with: sarif_file: ~/.docksec/results
> `if: always()` مهم: بدونها، يتم تخطي خطوة الرفع كلما
> تسبب `--fail-on` في خروج DockSec برمز غير صفري، مما يؤدي إلى فقدان النتائج في اللحظة التي
> تكون فيها أكثر أهمية.
### وضع خط الأساس / الوضع التصاعدي
يتيح لك `--baseline FILE` اعتماد `--fail-on` على مشروع قائم دون جدار من
النتائج الموجودة مسبقًا التي تعيق كل بناء. شغّل مرة واحدة باستخدام `--update-baseline` لالتقاط
نتائج اليوم، ثم قم بتثبيت ملف خط الأساس؛ ومنذ ذلك الحين، يقتصر `--fail-on` فقط على
النتائج غير الموجودة بالفعل في خط الأساس:```bash
# Snapshot current findings (does not gate)
docksec -i myapp:latest --image-only --baseline .docksec-baseline.json --update-baseline
# Later runs only fail on NEW findings above the threshold
docksec -i myapp:latest --image-only --baseline .docksec-baseline.json --fail-on high
يتم مطابقة النتائج حسب معرّف الثغرة والهدف واسم الحزمة، لذا تبقى خط الأساس صالحة
مع ظهور واختفاء نتائج غير ذات صلة. أعد التشغيل باستخدام --update-baseline متى أردت
قبول الحالة الحالية كخط أساس جديد.
--ignore-file FILE يقوم بكتم النتائج الفردية التي قام الفريق بمراجعتها وقبولها.
على عكس خط الأساس (لقطة زمنية لحظة معينة)، فإن ملف الإهمال هو قائمة
صريحة وقابلة للمراجعة حيث يحمل كل إدخال سببًا وتاريخ انتهاء اختياريًا.
إذا كان ملف .docksec-ignore.yml موجودًا في الدليل الحالي، فسيتم التقاطه
تلقائيًا.```yaml
ignores:
يتم إزالة النتائج المثبَّطة قبل التقييم والتقارير ومخرجات `--json` وبوابة `--fail-on`. تتوقف الإدخالات المنتهية صلاحيتها عن التطبيق تلقائيًا (مع تحذير)، ويتم وضع علامة على الإدخالات التي لا تحتوي على سبب لتبقى التنازلات قابلة للتدقيق. قم بتثبيت الملف في نظام التحكم بالإصدارات بحيث تتم مراجعة التثبيطات مثل أي تغيير آخر.
---
## التقارير
### صيغ التقارير
بشكل افتراضي، يكتب كل فحص أربعة ملفات تقارير؛ استخدم `--format` لاختيار مجموعة فرعية:
- **html**: تقرير ويب تفاعلي ونظيف بصريًا: بطاقات الخطورة، تقييم النتيجة، جدول الثغرات الكامل مع الإصدارات المُصلَّحة، ونتائج الذكاء الاصطناعي الكاملة.
- **pdf**: مستند محمول وجاهز للعرض التقديمي.
- **json**: بيانات فحص كاملة قابلة للقراءة آليًا (بنفس شكل مخرجات `--json` القياسية).
- **csv**: جدول جاهز لجداول البيانات للثغرات الفردية.
> ملاحظة حول سلوك CSV: مع وجود صفر ثغرات، لا يزال DockSec يكتب ملف CSV يحتوي على رؤوس الأعمدة فقط (أسماء الأعمدة، بدون صفوف) بحيث لا تتعطل الأتمتة اللاحقة أبدًا بسبب ملف مفقود أو فارغ. هذا مقصود.
### قائمة مكونات البرامج CycloneDX
يكتب `--sbom` قائمة مكونات برمجية بصيغة CycloneDX (`<image>.cdx.json`) للصورة المفحوصة، مع سرد كل مكوّن حزمة بالإضافة إلى الثغرات المعروفة. يتم إنتاج قائمة المكونات بواسطة المُصدِّر الأصلي لـ Trivy (لذا فهي متوافقة مع المواصفات)، ويقوم DockSec بإدراج نفسه في بيانات وصف الأداة. قم بإدخالها في Dependency-Track أو الرسم البياني للتبعيات في GitHub أو أي مستهلك آخر لقوائم المكونات البرمجية:```bash
docksec --image-only -i myapp:latest --sbom
--sbom يتطلب صورة واحدة (-i)، لذلك يتم تخطيه في عمليات التشغيل عبر compose. مثل --sarif،
فهو مستقل عن --format.
تم تصميم DockSec بحيث تعرف دائمًا ما يغادر جهازك:
--no-redact لإلغاء الاشتراك.--provider ollama لإبقاء تحليل الذكاء الاصطناعي على
أجهزتك الخاصة، أو --scan-only / --offline لتخطي الذكاء الاصطناعي تمامًا.--offline يقوم بتشغيل فحص بدون وصول إلى الشبكة. يستخدم قاعدة بيانات ثغرات Trivy
الموجودة بالفعل على القرص (بدون تحديث قاعدة البيانات) ويتخطى تحليل الذكاء الاصطناعي وفحص Docker Scout المتقدم،
وكلاهما يتطلب شبكة. هذه هي أبسط طريقة للفحص في بيئة معزولة أو
مقيدة:```bash
docksec --image-only -i myapp:latest --offline
تأكد من تنزيل قاعدة بيانات Trivy مرة واحدة على الأقل (أي فحص سابق عبر الإنترنت يقوم بذلك) قبل الاعتماد على `--offline`.
### ذاكرة التخزين المؤقت لنتائج الفحص
يتم تخزين نتائج فحص الصور مؤقتًا (الافتراضي: 24 ساعة، يمكن تجاوزه باستخدام
`DOCKSEC_CACHE_TTL_HOURS`) ويتم ربطها بـ digest محتوى الصورة، لذا فإن أي علامة معاد بناؤها
مثل `:latest` المعاد استخدامها تحصل دائمًا على فحص جديد. استخدم `--no-cache` (أو
`DOCKSEC_USE_CACHE=false`) لتجاوز ذاكرة التخزين المؤقت لجولة فحص واحدة.
---
## مهارات مساعد الذكاء الاصطناعي (`install-skill`)
يكتب `docksec install-skill` تعليمات استخدام DockSec في ملفات السياق المعروفة
لمساعدي البرمجة بالذكاء الاصطناعي الشائعين، بحيث يعرف المساعد الذي يعمل في مستودعك كيفية
استدعاء DockSec:```bash
docksec install-skill
هذا يُنشئ أو يُحدّث:
.claude/commands/docksec.md (أمر Claude Code /docksec).cursor/rules/docksec.mdc (Cursor)AGENTS.md (Codex CLI)، GEMINI.md (Gemini CLI).github/copilot-instructions.md (GitHub Copilot)الملفات هي نص عادي يمكنك مراجعته وتثبيته؛ لا يتم تنفيذ أي شيء. إعادة تشغيل الأمر تُحدّث قسم DockSec في مكانه بدلاً من تكراره.
--fail-on، وضع خط الأساس/الترس، إعفاءات قابلة للتدقيق، JSON إلى stdout، وإجراء GitHub Action في السوق.--offline) باستخدام قاعدة بيانات Trivy المحلية.docksec install-skill يعلّم Claude Code، Cursor، Copilot، وغيرهم كيفية تشغيل DockSec في مستودعك.| الإمكانية | DockSec | Trivy (مستقل) | Snyk Container | Aikido |
|---|---|---|---|---|
| الترخيص والتكلفة | مجاني، مفتوح المصدر (MIT) | مجاني، مفتوح المصدر (Apache 2.0) | تجاري (طبقة مجانية محدودة) | تجاري (طبقة مجانية محدودة) |
| الحوكمة | مشروع OWASP Lab، محايد للموردين | مفتوح المصدر، تُديره Aqua | مورد واحد | مورد واحد |
| اكتشاف CVEs وأخطاء إعداد Dockerfile | نعم | نعم | نعم | نعم |
| شرح النتائج بلغة إنجليزية بسيطة | نعم (سياق وتأثير مكتوبان بالذكاء الاصطناعي) | لا (بيانات CVE خام) | جزئي (خطورة وتلميحات إصلاح) | جزئي (ملخصات ذكاء اصطناعي في المنصة) |
| إصلاح سياقي لـ Dockerfile | نعم (إعادة كتابة محددة مع شرح) | لا (اكتشاف فقط) | نعم (نصيحة ترقية الصورة الأساسية، إصلاح PRs) | نعم (إصلاحات AI AutoFix PRs) |
| فحص Docker Compose (متعدد الخدمات) | نعم (فحوصات تنسيق وفحص لكل خدمة) | جزئي (فحص إعداد، بدون توزيع لكل خدمة) | جزئي | جزئي |
| وضع خط الأساس/الترس (الفشل فقط على النتائج الجديدة) | نعم | لا | جزئي (سياسات المنصة) | جزئي (سياسات المنصة) |
| إعفاءات قابلة للتدقيق لكل نتيجة مع أسباب وانتهاء | نعم | جزئي (.trivyignore، بدون أسباب مفروضة) | جزئي (سياسات المنصة) | جزئي (سياسات المنصة) |
| إخراج أصلي للـ CI (SARIF لفحص أكواد GitHub) | نعم | نعم | نعم | نعم |
| تصدير SBOM (CycloneDX) | نعم (--sbom) | نعم | نعم | نعم |
| تثبيت مهارة المساعد الذكي (Claude Code، Cursor، Copilot) | نعم (install-skill) | لا | لا | لا |
| يعمل دون اتصال / معزول تماماً | نعم (LLM محلي عبر Ollama، وضع فحص فقط، بدون مفتاح API) | فحص فقط (بدون طبقة إصلاح) | لا (منصة سحابية) | لا (منصة مستضافة) |
| تبقى بيانات صورك على شبكتك | نعم | نعم | لا | لا |
| أحضر نموذج LLM الخاص بك / اختيار النموذج | نعم (OpenAI، Anthropic، Gemini، أو Ollama محلي) | غير قابل للتطبيق | لا (ذكاء اصطناعي مملوك) | لا (ذكاء اصطناعي مملوك) |
| قابل للاستضافة الذاتية، بدون نشر منصة | نعم | نعم |
DockSec هو الوحيد بين هذه الأدوات الذي يجمع بين الإصلاح السياقي لـ Dockerfile وتصميم مفتوح المصدر بالكامل، تحت حوكمة OWASP، وقابل للتشغيل محلياً. تقدم Snyk وAikido إصلاحاً بالذكاء الاصطناعي قادراً، لكن فقط كمنصات سحابية تجارية ترسل بياناتك إلى خدمتها. Trivy مفتوح المصدر ومحلي لكنه يتوقف عند الاكتشاف ولا يساعدك في إصلاح أي شيء. يسد DockSec الفجوة للمطورين وللفرق الخاضعة للتنظيم أو المعزولة التي تحتاج إلى كل من إرشادات الإصلاح والتحكم الكامل في بياناتها، دون أي تكلفة.
راجع ROADMAP.md لمعرفة اتجاه DockSec: فحص السجلات بدون داemon Docker محلي، ملف تكوين سياسة على مستوى المستودع، قوالب Jenkins/GitLab/Azure DevOps، صورة حاوية رسمية، فحص Kubernetes وHelm، والمزيد. الملاحظات والأصوات على الأولويات مرحب بها في القضايا وعلى OWASP Slack.
يزدهر DockSec بفضل مساهمات المجتمع. سواء كنت مطوراً أو مصمماً أو متحمساً للأمن، هناك طرق عديدة للمشاركة:
للبدء، راجع إرشادات المساهمة، مدونة قواعد السلوك، ودليل الرعاية.
يقود DockSec فريق مخصص ملتزم بجعل أمن الحاويات في متناول الجميع:
تجدنا هنا:
| لا |
| لا |
| تقييد المورد | لا يوجد | لا يوجد | نعم | نعم |
| درجة أمنية (0-100) وتقارير متعددة التنسيقات | نعم | جزئي (تنسيقات آلية، بدون تقرير إصلاح) | جزئي (تقارير لوحة التحكم) | جزئي (تقارير لوحة التحكم) |