📝
OWASP ZAPをAzure VM上で利用してみた
ゴール
Azure 上でDASTの代表的なOSSであるOWASP ZAPをGUI/コンテナ起動し、サンプルアプリのスキャンをします。
- OWASP ZAPをインストールしてGUIを起動する(Windows)
- OWASP ZAPをインストールしてデーモン起動する(RHEL9)
- クライアント(WS2025)→ ZAPサーバ(RHEL9) → WEBサーバ(RHEL9)の構成においてZAPサーバからWEBサーバに対して、クライアントからREST APIベースでのスキャン指示を実行する。
- 実行結果をHTMLで出力する。
全てAzure上のVMで構成しています。
OWASP ZAPをインストールしてGUIを起動する(Windows)
前提としてJAVAが必要になります。インストールをしてください。OWASP ZAPもインストールはGUIから起動するだけです。
OWASP ZAPをインストールしてデーモン起動する(RHEL9)
- ZAPのdocker はWindows版のイメージが存在しません。
- BシリーズのWS2025だとWSLが起動できません(全部のBシリーズではないかもしれませんが、仮想化の入れ子がダメっぽい?)。
- 公式の簡易な手順は以下にあります。
- root ユーザじゃないと失敗します。
- ZAP Headlessに従って起動するとデーモンモードで外部からの受付が可能になります。
- コンテナ起動コマンドは以下の通りです。
podman run -d --name zape -p 8090:8090 ghcr.io/zaproxy/zaproxy:stable zap.sh -daemon -port 8090 -host 0.0.0.0 -config api.addrs.addr.name=.* -config api.addrs.addr.regex=true -config api.disablekey=true -
sudo ss -tlnp | grep 8090で起動状態を確認できます。公開ポートを8090から変更する場合はコマンドも変更。
スキャン指示を実行
-
curl "http://<RHELホストIP>:8090/JSON/core/view/version/"でバージョン情報がかえってくれば疎通OKです。
疎通確認が取れたら、いくつかの簡単なスキャンを実施してみます。
スパイダー開始(クローリング)
-
curl "http://<ZAP_IP>:8090/JSON/spider/action/scan/?url=http://<WEBサーバのプライベートIPアドレス>:8080"でスキャン指示を出します。 - 戻り値の例として
{"scan":"0"}といった結果が返ってきます。
スパイダーの進行状況を確認
-
curl "http://<ZAP_IP>:8090/JSON/spider/view/status/?scanId=0"のように実行します。scanIDには先ほどの戻り値を入れます。 -
{"status":"45"}といった戻り値が返ってきます。100になるまで確認を繰り返し、100になればスキャンは完了です。
アクティブスキャン開始
- スパイダーで対象URLを収集した後に脆弱性検査を実行します。
curl "http://<ZAP_IP>:8090/JSON/ascan/action/scan/?url=http://<WEBサーバのプライベートIPアドレス>:8080"- 戻り値の例として
{"scan":"0"}といった結果が返ってきます。
アクティブスキャンの進行状況を確認
-
curl "http://<ZAP_IP>:8090/JSON/ascan/view/status/?scanId=0"のように実行します。scanIDには先ほどの戻り値を入れます。 - こちらも、
{"status":"100"}になっていれば完了です。
実行結果のレポート出力
- クライアント端末から、
curl "http://<ZAP_IP>:8090/OTHER/core/other/htmlreport/" -o zap_report.htmlを実行し、ZAPサーバにあるレポートをクライアント端末のカレントディレクトリに出力します。html名は自由に変更してください。
おわりに
簡単な検証でした。GUIは比較的画面に従った直観的な操作が可能なため、インストールまでにしています。現場においてはCI/CDからDASTサーバに対してスキャン実行を呼び出すことも多いと考え、サーバベース(Docker)でのOWASP ZAPの起動や簡易スキャンを実施しました。
何かのお役に立てば幸いです。
Discussion