integrating-dast-with-owasp-zap-in-pipeline について
CI/CD パイプラインに OWASP ZAP による DAST を組み込む方法を説明するスキルです。リリース前に稼働中の Web アプリや API を検査するチーム向けに、スキャン種別、ルール設定、デプロイ判定を扱います。
主な機能
- 01ZAP ベースラインスキャンの設定
- 02包括的なアクティブスキャン
- 03OpenAPI 仕様による API スキャン
- 04ルールの動作としきい値の設定
- 05Docker Compose によるローカルテスト
活用シーン
- 01ステージング配置後のパッシブスキャン
- 02仕様に基づく API エンドポイント検査
- 03検出結果に応じた本番リリース判定
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill integrating-dast-with-owasp-zap-in-pipelineインストール後、Claude Code で/integrating-dast-with-owasp-zap-in-pipelineを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEassets/template.mdreferences/api-reference.mdstandards.mdworkflows.mdscripts/agent.pyprocess.py詳細
パイプラインでの OWASP ZAP による DAST の統合
使用するタイミング
- 実行中のウェブアプリケーションをテストし、XSS、SQLi、CSRF、設定ミスなどの脆弱性を検出するとき
- SAST だけでは不十分で、実行時の動作テストが必要なとき
- 本番環境へのリリース前に、ウェブアプリケーションの動的セキュリティテストがコンプライアンスで義務付けられているとき
- API(REST/GraphQL)の認証、認可、インジェクションの脆弱性をテストするとき
- 本番環境へのデプロイ前に、ステージング環境で継続的な DAST スキャンを確立するとき
ソースコードのスキャン(SAST を使用)、依存関係のスキャン(SCA を使用)、インフラストラクチャ設定のスキャン(IaC スキャンツールを使用)には使用しないでください。
前提条件
- OWASP ZAP の Docker イメージ、またはローカルにインストールされた ZAP(zaproxy/zap-stable または zaproxy/action-*)
- CI/CD ランナーからアクセスできる実行中の対象アプリケーション(ステージング URL または Docker サービス)
- ZAP スキャンルールの設定(任意、調整用)
- API スキャン用の OpenAPI/Swagger 仕様(任意)
ワークフロー
ステップ 1:GitHub Actions で ZAP ベースラインスキャンを設定する
# .github/workflows/dast-scan.yml
name: DAST Security Scan
on:
deployment_status:
workflow_dispatch:
inputs:
target_url:
description: 'Target URL to scan'
required: true
jobs:
zap-baseline:
name: ZAP Baseline Scan
runs-on: ubuntu-latest
services:
webapp:
image: ${{ github.repository }}:${{ github.sha }}
ports:
- 8080:8080
options: --health-cmd="curl -f http://localhost:8080/health" --health-interval=10s --health-timeout=5s --health-retries=5
steps:
- uses: actions/checkout@v4
- name: ZAP Baseline Scan
uses: zaproxy/[email protected]
with:
target: 'http://webapp:8080'
rules_file_name: '.zap/rules.tsv'
cmd_options: '-a -j'
allow_issue_writing: false
- name: Upload ZAP Report
if: always()
uses: actions/upload-artifact@v4
with:
name: zap-baseline-report
path: report_html.html
ステップ 2:包括的なテスト用に ZAP フルスキャンを設定する
zap-full-scan:
name: ZAP Full Scan
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: ZAP Full Scan
uses: zaproxy/[email protected]
with:
target: ${{ github.event.inputs.target_url || 'https://staging.example.com' }}
rules_file_name: '.zap/rules.tsv'
cmd_options: '-a -j -T 60'
- name: Upload Reports
if: always()
uses: actions/upload-artifact@v4
with:
name: zap-full-report
path: |
report_html.html
report_json.json
ステップ 3:OpenAPI 仕様を使用して API スキャンを設定する
zap-api-scan:
name: ZAP API Scan
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: ZAP API Scan
uses: zaproxy/[email protected]
with:
target: 'https://staging.example.com/api/openapi.json'
format: openapi
rules_file_name: '.zap/api-rules.tsv'
cmd_options: '-a -j'
ステップ 4:ZAP スキャンルールを設定する
# .zap/rules.tsv
# Rule ID Action (IGNORE/WARN/FAIL) Description
10003 IGNORE # Vulnerable JS Library (handled by SCA)
10015 WARN # Incomplete or No Cache-control Header
10021 FAIL # X-Content-Type-Options Missing
10035 FAIL # Strict-Transport-Security Missing
10038 FAIL # Content Security Policy Missing
10098 IGNORE # Cross-Domain Misconfiguration (CDN)
40012 FAIL # Cross Site Scripting (Reflected)
40014 FAIL # Cross Site Scripting (Persistent)
40018 FAIL # SQL Injection
40019 FAIL # SQL Injection (MySQL)
40032 FAIL # .htaccess Information Leak
90033 FAIL # Loosely Scoped Cookie
ステップ 5:ローカルテスト用に Docker Compose で ZAP を実行する
# docker-compose.zap.yml
version: '3.8'
services:
webapp:
build: .
ports:
- "8080:8080"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 10s
retries: 5
zap:
image: zaproxy/zap-stable:latest
depends_on:
webapp:
condition: service_healthy
command: >
zap-baseline.py
-t http://webapp:8080
-r /zap/wrk/report.html
-J /zap/wrk/report.json
-c /zap/wrk/rules.tsv
-I
volumes:
- ./zap-reports:/zap/wrk
- ./.zap/rules.tsv:/zap/wrk/rules.tsv
主な概念
| 用語 | 定義 |
|---|---|
| DAST | 動的アプリケーションセキュリティテスト。リクエストを送信してレスポンスを分析し、実行中のアプリケーションをテストします |
| ベースラインスキャン | アクティブ攻撃を行わずにアプリケーションをスパイダーで巡回する、CI/CD に適した高速なパッシブスキャン |
| フルスキャン | XSS、SQLi、その他のインジェクション脆弱性を狙った攻撃ペイロードを含むアクティブスキャン |
| API スキャン | OpenAPI/Swagger 仕様を使用して、文書化されたすべての API エンドポイントをテストする、対象を絞ったスキャン |
| スパイダー | リンクをたどってアプリケーションのページやエンドポイントを検出する ZAP のクローラー |
| アクティブスキャン | ZAP が検出したエンドポイントに攻撃ペイロードを送信し、悪用可能な脆弱性を探すフェーズ |
| パッシブスキャン | 攻撃を送信せずに、HTTP レスポンスのセキュリティヘッダー、Cookie、情報漏えいを分析します |
| スキャンポリシー | 有効にする攻撃の種類と強度レベルを定義する設定 |
ツールとシステム
- OWASP ZAP:DAST テスト用のオープンソースウェブアプリケーションセキュリティスキャナー
- zaproxy/action-baseline:ZAP のパッシブなベースラインスキャン用 GitHub Action
- zaproxy/action-full-scan:ZAP のアクティブなフルスキャン用 GitHub Action
- zaproxy/action-api-scan:OpenAPI に対応した API 中心のスキャン用 GitHub Action
- Nuclei:CI/CD 統合向けのテンプレートベースの検出機能を備えた代替の脆弱性スキャナー
よくあるシナリオ
シナリオ:ステージングデプロイパイプラインへの DAST の統合
コンテキスト:あるチームは本番環境の前にステージング環境へデプロイしており、実行時の脆弱性を検出するため、各ステージの間に自動 DAST スキャンを行う必要があります。
アプローチ:
- ステージング環境へのデプロイが成功した後に実行される DAST ジョブをパイプラインに追加します
- まず ZAP ベースラインスキャンを実行し、迅速なパッシブフィードバックを得ます(2~5 分)
- 続いて、アプリケーションの OpenAPI 仕様を使用した対象を絞った API スキャンを実行します
- rules.tsv を設定し、重大な検出結果(XSS、SQLi)は FAIL、ヘッダーや Cookie の問題は WARN とします
- 確認用に ZAP レポートをパイプラインのアーティファクトとしてアップロードします
- FAIL レベルの検出結果があれば、本番環境へのデプロイをブロックします
- より広範囲を検査するため、ステージング環境に対するフルスキャンを毎週スケジュールします
注意点:ZAP のフルスキャンには 30 分以上かかることがあり、攻撃トラフィックによってステージングサーバーに過剰な負荷がかかる場合があります。CI ではベースラインスキャンを使い、フルスキャンはスケジュールに従って実施してください。調整せずに本番環境に対して DAST を実行すると、WAF によるブロックやインシデントアラートが発生する可能性があります。
出力形式
ZAP DAST Scan Report
======================
Target: https://staging.example.com
Scan Type: Baseline + API
Date: 2026-02-23
Duration: 4m 32s
FINDINGS:
FAIL: 3
WARN: 7
INFO: 12
PASS: 45
FAILING ALERTS:
[HIGH] 40012 - Cross Site Scripting (Reflected)
URL: https://staging.example.com/search?q=<script>
Method: GET
Evidence: <script>alert(1)</script>
[MEDIUM] 10021 - X-Content-Type-Options Missing
URL: https://staging.example.com/api/v1/*
Evidence: Response header missing
[MEDIUM] 10035 - Strict-Transport-Security Missing
URL: https://staging.example.com/
Evidence: HSTS header not present
QUALITY GATE: FAILED (1 HIGH, 2 MEDIUM findings)
コメント
Markdown 対応