الاختبار الديناميكي وأمان وقت التشغيل
أتمتة OWASP ZAP في خطوط الأنابيب
3 دقيقة للقراءة
OWASP ZAP (Zed Attack Proxy) هو أداة DAST المجانية الأكثر شعبية في العالم. إليك كيفية دمجها في خط أنابيب CI/CD الخاص بك.
أنواع فحص ZAP
| نوع الفحص | المدة | التغطية | حالة الاستخدام |
|---|---|---|---|
| أساسي | 1-5 دقائق | منخفضة | فحوصات PR، التحقق السريع |
| كامل | 30-120 دقيقة | عالية | فحوصات ليلية، ما قبل الإصدار |
| API | 5-30 دقيقة | API فقط | اختبار REST/GraphQL |
| Ajax Spider | 15-60 دقيقة | SPAs | تطبيقات React، Vue، Angular |
تكامل GitHub Actions
فحص أساسي (سريع)
# .github/workflows/dast-baseline.yml
name: DAST Baseline Scan
on:
pull_request:
branches: [main]
jobs:
zap-baseline:
runs-on: ubuntu-latest
steps:
- name: Deploy to staging
run: |
# سكريبت النشر الخاص بك
echo "Deploying to staging..."
- name: ZAP Baseline Scan
uses: zaproxy/action-baseline@v0.10.0
with:
target: 'https://staging.example.com'
rules_file_name: '.zap/rules.tsv'
cmd_options: '-a' # تضمين قواعد ألفا
- name: Upload ZAP Report
uses: actions/upload-artifact@v4
with:
name: zap-report
path: report_html.html
فحص كامل (شامل)
# .github/workflows/dast-full.yml
name: DAST Full Scan
on:
schedule:
- cron: '0 2 * * *' # 2 صباحاً يومياً
jobs:
zap-full:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: ZAP Full Scan
uses: zaproxy/action-full-scan@v0.9.0
with:
target: 'https://staging.example.com'
rules_file_name: '.zap/rules.tsv'
cmd_options: >
-j # استخدام Ajax spider
-m 5 # مهلة Spider 5 دقائق
- name: Upload Results to GitHub Security
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: 'zap-results.sarif'
تكوين قواعد ZAP
إنشاء قواعد مخصصة لضبط سلوك الفحص:
# .zap/rules.tsv
# ID Action Name
10021 IGNORE X-Content-Type-Options Header Missing
10038 WARN Content Security Policy (CSP) Header Not Set
40012 FAIL Cross Site Scripting (Reflected)
40014 FAIL Cross Site Scripting (Persistent)
90022 FAIL Application Error Disclosure
الإجراءات:
IGNORE: لا تبلغ (إيجابي خاطئ)WARN: أبلغ لكن لا تفشل خط الأنابيبFAIL: أبلغ وأفشل خط الأنابيب
الفحص المصادق عليه
معظم التطبيقات تتطلب تسجيل الدخول. استخدم خيارات المصادقة في ZAP:
الخيار 1: ملف السياق
# .zap/context.xml
<context>
<name>MyApp</name>
<authentication>
<type>formBasedAuthentication</type>
<loginUrl>https://app.example.com/login</loginUrl>
<loginRequestBody>username={%username%}&password={%password%}</loginRequestBody>
</authentication>
<users>
<user>
<name>test-user</name>
<credentials>
<username>testuser</username>
<password>${ZAP_AUTH_PASSWORD}</password>
</credentials>
</user>
</users>
</context>
# GitHub Actions مع المصادقة
- name: ZAP Full Scan
uses: zaproxy/action-full-scan@v0.9.0
with:
target: 'https://staging.example.com'
docker_name: 'ghcr.io/zaproxy/zaproxy:stable'
env:
ZAP_AUTH_PASSWORD: ${{ secrets.ZAP_AUTH_PASSWORD }}
الخيار 2: رأس التفويض
# لمصادقة API/JWT
- name: ZAP API Scan
uses: zaproxy/action-api-scan@v0.6.0
with:
target: 'https://api.example.com/openapi.json'
cmd_options: >
-z "replacer.full_list(0).description=auth"
-z "replacer.full_list(0).enabled=true"
-z "replacer.full_list(0).matchtype=REQ_HEADER"
-z "replacer.full_list(0).matchstr=Authorization"
-z "replacer.full_list(0).replacement=Bearer ${{ secrets.API_TOKEN }}"
التعامل مع النتائج
الفشل على النتائج الحرجة
- name: Check ZAP Results
run: |
if grep -q "FAIL-NEW" zap-results.json; then
echo "New vulnerabilities found!"
exit 1
fi
إنشاء مشاكل GitHub
- name: Create Issue on Failure
if: failure()
uses: actions/github-script@v7
with:
script: |
github.rest.issues.create({
owner: context.repo.owner,
repo: context.repo.repo,
title: 'DAST Scan Found Vulnerabilities',
body: 'Check the ZAP report in the workflow artifacts.',
labels: ['security', 'dast']
})
نصائح الأداء
| التحسين | كيف |
|---|---|
| تحديد عمق الزحف | --spider.maxDepth=5 |
| استثناء الأصول الثابتة | `--exclude='.*.(css |
| استخدام الأساسي لـ PRs | أسرع، ثغرات شائعة فقط |
| تشغيل الفحوصات الكاملة ليلاً | ساعات خارج الذروة |
| تخزين صورة ZAP Docker مؤقتاً | استخدام خطوة docker pull |
بعد ذلك، سنستكشف اختبار أمان API مع Nuclei. :::