今回やりたいこと
CI/CD時に、OWASP ZAPという脆弱性診断ツールを利用し、もし警告数などが一定以上の数だったらビルドを失敗させる制御を組み込みたい
そのためにやること
- dockerを利用しOWASP ZAPの処理を行うshファイルを作成・追加
- CI/CD時に参照される特定のymlファイルに、追加されたshファイルを走らせるように追記
僕の現職では、バックエンド側では、CI/CDにAWSのCodePipeline, CodeBuildを利用しています。
その中に、Docker版のOWASP ZAPという脆弱性診断ツールの導入を検討したいと思っています。
CodeBuildでは、buildspec.yml
といったymlファイルを参照し、問題なければAWS ECR
のようなdockerリポジトリにイメージをpushをするようです。
そのbuildspec.yml
の中にOWASP ZAPの検証処理を、記述されたshファイルを呼び出す形で組み込みむ想定です。
実際に追加するコード
※ファイルの配置場所はいずれもプロジェクトのルートディレクトリを想定しています
run_owasp_zap_test.sh
#!/bin/bash
# OWASP ZAPで検証したいエンドポイント
ENDPOINT=https://sample.com
# チェック対象のステータスの許容範囲の最大値
MAX_STATUS_ITEM_NUM=13
# 実際の運用時には`WARN-NEW`ではなく`FAIL-NEW`を想定
STATUS="WARN-NEW"
docker pull owasp/zap2docker-stable
echo "Running OWASP ZAP test..."
echo "チェック対象のステータス: $STATUS"
echo "チェック対象のステータス: $STATUS に該当する項目数が $MAX_STATUS_ITEM_NUM 以下の場合はテスト成功とします。"
# 下の`output=`の方だと詳細が出力されない
docker run -t owasp/zap2docker-stable zap-baseline.py -t $ENDPOINT
# `output`にOWASP ZAPのテスト結果を代入
output=$(docker run -t owasp/zap2docker-stable zap-baseline.py -t $ENDPOINT)
# $STATUSの文字列数
STATUS_ITEM_NUM=$(echo "$output" | grep -c $STATUS)
# `STATUS_ITEM_NUM`と`MAX_STATUS_ITEM_NUM`それぞれの数を比較
if [ $STATUS_ITEM_NUM -gt $MAX_STATUS_ITEM_NUM ]; then
echo "test failed: $STATUS の結果が一定数を超えました: $STATUS_ITEM_NUM 項目"
echo "処理を終了します"
exit 1
else
echo "test passed: $STATUS の結果が許容範囲内でした: $STATUS_ITEM_NUM 項目"
fi
echo "OWASP ZAPのスキャンが正常に完了しました。"
exit 0
buildspec.yml
version: 0.2
# 不要な箇所は省略しています
phases:
pre_build:
commands:
- ~
build:
commands:
- ~
post_build:
commands:
- ~
# Run OWASP ZAP test
- ./run_owasp_zap_test.sh
ymlファイル上の特定のphase
のcommands
の箇所でファイルのパスを指定するだけで、そのshスクリプトが動いてくれるようです。