GitHub ActionsでOWASP ZAPのフルスキャンを実行する

GitHub ActionsでOWASP ZAPのフルスキャンを実行する

ども!今回は、GitHub Actions上でOWASP ZAPのスキャンを実行する方法について技術ログを記載しています。Docker版のOWASP ZAPを使うことでCI/CD内で処理ができることを知ってびっくりしました。なるべく自動化できるところはしていきたいですね。セキュリティ関連記事第一弾

はじめもす

セキュリティについてちょこっと勉強を始めた龍ちゃんです。エンジニアの要素っていっぱいありますよね。すべてのエンジニアが持っておいた方が良い知識や単体でお仕事になる知識など、いろんなものがありますよね。でもゼロ知識よりもちょこっと知識があったほうが良いものだと思います。そんな気分でお勉強を進めています。

セキュリティ関連CI/CD第一弾になっています。それでは本題に入っていきましょう。

今回は、OWASP ZAP関連に記事になります。まぁタイトル出オチですよね。実は、CI/CDでOWASP ZAPのスキャンを実行することができるというのを初めて知りました。そこで脆弱なアプリケーションをCI/CD上でスキャンするところまでを実装しました。

この記事でわかることは以下になります。

  • Docker版のOWASP ZAPを構成する
  • OWASP ZAPスキャンのカスタマイズ
  • GitHub Actions上でOWASP ZAPのスキャンを実行する

それでは本編に入っていこうと思います。OWASP ZAPが何かについては、専任の記事がいくつもあるのでそちらを読んでもらえると助かります。(あたいもまだよくわかっとりません( *´艸`))

スキャン対象は全く違いますが、セキュリティスキャンツールのTrivyをGitHub Actions上で作成してみました。興味があればぜひ読んでみてください。

もしスキャンルールの出力方法がわからない方がいらっしゃれば、是非読んでもらえるとうれしいです。スキャンファイルだけほしい方はこちらから。

OWASP ZAPでスキャンする

ぬるりとスキャンを構築していきましょう。Docker版のOWASP ZAPがあるおかげで、CI/CD上でスキャンを実行することができます。つまりDockerが動く環境があれば、CLIでスキャンを実行することができるというお話です。なので、Docker版のOWASP ZAPを構成してから本題に入っていきたいと思います。

こちらの内容は、ほとんど公式のページの情報から作成することができました。がっつりと作業をしていきたい人は、公式のページを参考にするのが早いと思います。さくっと入門した人や公式のページで挫折した人はぜひ参考にしてください。

Docker版のOWASP ZAPを構成する

こちらのページを参考にイメージを導入しましょう。いろんなバージョンがあるかと思いますが、困ったときは安定板を入れておきましょう。

docker pull ghcr.io/zaproxy/zaproxy:stable

スキャン自体も複数パターンあります。今回対象とするのは、フルスキャンになります。ベースラインスキャンの場合は、参考にすることができる部分はあるかと思います。一番初歩の使い方としては、以下になります。

docker run -v $(pwd)/fullscan:/zap/wrk/:rw -t ghcr.io/zaproxy/zaproxy:stable zap-full-scan.py -t <https://www.example.com>

# 自由に設定したい人はこちらから
docker run -v $(pwd)/fullscan:/zap/wrk/:rw -t ghcr.io/zaproxy/zaproxy:stable zap-full-scan.py -t {対象とするURL}

ローカルでアプリケーションを動かしておけば、ローカルで検証することも可能です。

Docker版のOWASP ZAPのカスタマイズ

このままでは、デフォルトの設定のままでスキャン結果を保持することができません。そのため以下の変更を加えていきたいと思います。

  • スキャンレポートを出力する
  • スキャン設定ファイルを出力する
  • スキャン設定ファイルをもとにスキャンを実行する

それでは、順番にオプションについて解説を入れていきます。まずスキャンレポートについてですが、html/Markdown/XML/JSONに対応しています。最小構成の使い方で、Dockerでマウントしているので出力されたファイルは実行したディレクトリに保存されます。以下がそれぞれのコマンドになります。

-r report_html    file to write the full ZAP HTML report
-w report_md      file to write the full ZAP Wiki(Markdown) report
-x report_xml     file to write the full ZAP XML report
-J report_json    file to write the full ZAP JSON document

オプションの後ろにファイル名を記載すると命名した名前で出力されます。

次にスキャン設定ファイルを出力する方法です。調査したところ、スキャンの過程でしか設定ファイルを出力することができなかったので、検証でファイルを出力しています。

docker run -v $(pwd)/fullscan:/zap/wrk/:rw -t ghcr.io/zaproxy/zaproxy:stable zap-full-scan.py -t <https://www.example.com> -g gen.conf

# 設定ファイルの名前を変更したい方はこちら
docker run -v $(pwd)/fullscan:/zap/wrk/:rw -t ghcr.io/zaproxy/zaproxy:stable zap-full-scan.py -t <https://www.example.com> -g {設定したいファイル名}

出力されるファイルは以下のフォーマットで出力されます。本当はバカ長いですよ。もし設定ファイルだけほしい方は、こちらからダウンロードしてください。

# id level memo
0	WARN	(Directory Browsing - Active/release)
10003	WARN	(Vulnerable JS Library (Powered by Retire.js) - Passive/release)
10009	WARN	(In Page Banner Information Leak - Passive/beta)

スキャンルールはIGNOREにすることで無視することができます。もちろん無視されるので、スキャン自体は高速になります。作成したスキャンルールを適応する方法は以下になります。ついでにhtml形式で出力しましょう。

docker run -v $(pwd):/zap/wrk/:rw -t ghcr.io/zaproxy/zaproxy
:stable zap-full-scan.py -t <https://www.example.com> -c gen.conf -r report.html

# 設定したい系の人向け
docker run -v $(pwd):/zap/wrk/:rw -t ghcr.io/zaproxy/zaproxy
:stable zap-full-scan.py -t <https://www.example.com> -c {作成した設定ファイル} -r {出力したいファイル名}

これで超基本的な部分を抑えることができたと思います。この知識を使ってDockerで作成されたアプリケーションをスキャンしていきたいと思います。

GitHub ActionsでOWASP ZAPのスキャンを実行する

やっとで本題まで来ました。スキャンをするためには、スキャンするアプリケーションが必要になります。せっかくなので、脆弱性のあるアプリケーションを使用してスキャンを実施したいと思います。肝心のアプリはOWASP Juice shopを使用したいと思います。こちらは、ふんだんに脆弱性が仕込まれています。もちろんDockerで起動することができます。

OWASP ZAPのスキャンは、GitHub Actionsに手軽にインストールすることができます。こちらがGitHubのページになります。

#
name: OWASP ZAP Scan to OWASP Juice shop

# Configures this workflow to run every time a change is pushed to the branch called `release`.
on:
  push:
    branches: ["main"]

# There is a single job in this workflow. It's configured to run on the latest available version of Ubuntu.
jobs:
  build-and-push-image:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Pull Docker
        run: docker pull bkimminich/juice-shop

      - name: Start Juice Shop
        run: docker run -p 3000:3000 -d bkimminich/juice-shop

      - name: ZAP Full Scan
        uses: zaproxy/action-full-scan@v0.8.0
        with:
          docker_name: "owasp/zap2docker-stable"
          token: ${{ secrets.GITHUB_TOKEN }}
          target: "http://localhost:3000/"

初期設定だとこけます。以下のエラーが出た場合は、リポジトリの設定を更新しましょう。

Alerts present in the current report: true
Error: Resource not accessible by integration

Settingsを開いてください。以下の部分を変更すると通ります。

リポジトリの設定変更

実行が成功すると、artifactに指定した名前で結果がアップロードされています。

もちろん前述で説明した、スキャンルールについても適応することが可能です。リポジトリにスキャンルールファイルを置いておけば、設定することができます。また、出力ファイルの命名も自分で決定することができます。

- name: ZAP Full Scan
  uses: zaproxy/action-full-scan@v0.8.0
  with:
    docker_name: "owasp/zap2docker-stable"
    token: ${{ secrets.GITHUB_TOKEN }}
		rules_file_name: ".zap/gen.conf"
    target: "http://localhost:3000"
    artifact_name: "scan-result"

終わりもす

お疲れ様です。OWASP ZAPは5年前にちょこっと触ったきりでまったくわからない民だったのですが、Docker版とデスクトップ版では使い勝手が異なるとしみじみ思いました。認証情報を追加する場合は、デスクトップ版とコラボしないといけない感じです。

最近はDockerとも仲良しを目指しています。最近のDocker関連の記事を並べておきます。

やることと頑張ることがいっぱいなので、程よく大変ですね。

これからもふわ~っと頑張ります。Twitterもよろしくお願いします。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です