27
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

本記事は NECソリューションイノベータ Advent Calendar 2021の 12/12 の記事です。

はじめに

最近、2008年製の開発PC(Windows 10, 4CPU, 16GBメモリ)がついに寿命を迎え、開発環境を MacBook(M1チップ) に移行することになったのですが、セキュリティテストで利用していた OWASP ZAP のコンテナイメージが M1 上で動作しなくて途方にくれていたら、GitHub Actions で動くようになっていたという情報を見つけたので、実際に試してみました。

注意

  • OWASP ZAP が実施する脆弱性診断のための通信は、攻撃とみなされることがありますので、自分たちで管理していない外部サイトなどに対して使用しないよう十分にご注意ください。

フロントエンドに Full Scan を実施する

1. GitHub リポジトリの作成&設定

はじめに、GitHub のリポジトリを作成します。

  • リポジトリ名:owaspzap-actions-website-scan
  • 公開設定:Private

リポジトリを作成したら、以下の設定を行います。

  • シークレット
    • リポジトリの SettingsSecrets を開き、 New repository secret をクリック
      • Name:WEBSITE_URL
      • Value:テスト対象のWebサイトURL

2. Workflow の作成

リポジトリを clone して、以下のファイルを作成します。

  • ディレクトリ構成

    + .github
      └ workflow
        └ owaspzap.yml
    
  • ファイルの記述

    • owaspzap.yml

      name: OWASP ZAP Actions
      on: [push]
      jobs:
        website-scan:
          runs-on: ubuntu-latest
          name: DAST (Dynamic Application Security Testing)
          steps:
            - name: Checkout
              uses: actions/checkout@v2
              with:
                ref: master
            - name: Action Full Scan
              uses: zaproxy/action-full-scan@v0.3.0
              with:
                token: ${{ secrets.GITHUB_TOKEN }}
                docker_name: owasp/zap2docker-stable
                target: ${{ secrets.WEBSITE_URL }}
                cmd_options: >
                  -a
                  -j
                  -z "
                  -config alert.maxInstances=0
                  -config view.locale=ja_JP
                  "
      
      • target に作成したシークレット名 WEBSITE_URL を指定します
      • cmd_options でセキュリティテストの動作設定を行います
        • -a α版の診断ルールを追加する
        • -j Ajax Spider を追加する
        • -z
          • 最大アラート件数の制限(既定値:20件)を無制限に緩和
          • view.local=ja_JP 診断レポートを日本語化

3. セキュリティテストを実行する

2 で作成した Workflow をリポジトリに push すると自動的に実行が開始されます。

4. 診断レポートの入手

Workflow の実行が完了すると診断レポートがリポジトリの Issue に登録されます。

1.png

Issue を開き、一番下までスクロールすると Workflow の実行結果に移動するリンクがあるのでクリックします。

2.png

Workflow の実行結果のページを開くと、診断レポートが Artifats として登録されています。

Name 列(zap_scan )をクリックすると診断レポートが zip 形式でダウンロード可能です。

3.png

課題

  • ThresholdStrength をどこで指定するのか?
    • GitHub Actions 以前に、そもそもDocker版の full-scan, api-scanの話。 webswing の GUI 以外での指定方法がわからない
  • Ajax Spider が動かない不具合があるそうです
  • カスタムルールファイル(-c オプション)で IGNORE してもレポートに結果が含まれてしまう(GitHub Actions ではなく Docker 版の話)

バックエンドに API Scan を実施する

1. GitHub リポジトリの作成&設定

はじめに、GitHub のリポジトリを作成します。

  • リポジトリ名:owaspzap-actions-api-scan
  • 公開設定:Private

リポジトリを作成したら、以下の設定を行います。

  • シークレット
    • リポジトリの SettingsSecrets を開き、 New repository secret をクリック
      • Name:ACCESS_TOKEN
      • Value:テスト対象のシステムにログインして発行される Access Token

2. Workflow の作成

リポジトリを clone して、以下のファイルを作成します。

  • ディレクトリ構成

    + .github
    | └ workflow
    |   └ owaspzap.yml
    |
    + openapi.yml
    
  • ファイルの記述

    • owaspzap.yml

      jobs:
        api-scan:
          runs-on: ubuntu-latest
          name: DAST (Dynamic Application Security Testing)
          env:
            ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }}
          steps:
            - name: Checkout
              uses: actions/checkout@v2
              with:
                ref: master
            - name: Action API Scan
              uses: zaproxy/action-api-scan@v0.1.0
              with:
                token: ${{ secrets.GITHUB_TOKEN }}
                docker_name: 'owasp/zap2docker-stable'
                format: openapi
                target: openapi.yml
                cmd_options: >
                  -a
                  -j
                  -z "
                  -config replacer.full_list\\(0\\).description=AccessToken
                  -config replacer.full_list\\(0\\).enabled=true
                  -config replacer.full_list\\(0\\).matchtype=REQ_HEADER
                  -config replacer.full_list\\(0\\).matchstr=Authorization
                  -config replacer.full_list\\(0\\).regex=false
                  -config replacer.full_list\\(0\\).replacement=$ACCESS_TOKEN
                  -config alert.maxInstances=0
                  -config view.locale=ja_JP
                  "
      
      • ACCESS_TOKEN 環境変数にシークレットから取得した値を設定します
      • target にリポジトリに登録した OpenAPI ファイル(openapi.yml)を指定します
        • OpenAPI ファイルのパスはリポジトリのルート配下からの相対パスを指定します
      • cmd_options でセキュリティテストの動作設定を行います
        • -a α版の診断ルールを追加する
        • -j Ajax Spider を追加する
        • -z
          • Authorization ヘッダにアクセストークンを設定
          • 最大アラート件数の制限(既定値:20件)を無制限に緩和
          • view.local=ja_JP 診断レポートを日本語化
    • openapi.yml

      公開できないため省略します。
      ※ 一般的なAPI定義で特殊なことはしておりません。
      
      • 接続先 URL が中にハードコードされたままなので、フロントエンドと同様に環境変数にしたかったけど、時間切れになっちゃいました…

3. セキュリティテストを実行する

※ フロントエンドと同様のため省略します。

4. 診断レポートの入手

※ フロントエンドと同様のため省略します。

課題

  • API Scan では API-Minimal.policy が適用されているため、検知可能な脆弱性が非 Docker 版より少ない
    • Issue #4354
      • 回避策:Docker の -v オプションでポリシーファイルを上書くとか?
        • 今回利用している action-api-scan だとダメかも?

GitHub Actions から実行したアクセス情報を確認してみた

実はテスト対象のアプリケーションは AWS 上に構築していました。

CloudFront の ビューワー より以下の情報がわかりました。

  • デバイスは デスクトップ

  • ブラウザは Firefox

  • オペレーティングシステムは Windows

  • ロケーションは United States

    4.png

検証結果よりわかったこと

  • 以前から Docker 版ではありますが Web Swing の方を利用して細かいスキャンポリシーの定義などを行っていました。
    今回は Full Scan、API Scan を利用しましたが、この 2 つは独自の診断ポリシーの定義を行っているようで、診断結果を見ると、実施したルール数が少ないようでした。ちょっと調べた感じでは Web Swing を利用した時のように、詳細項目(Attack Threshold、Attack Strength、など)を設定して、すべてのルールを適用ということができなさそうでした。

    • 2021/11 時点で合計 159 のルールIDが定義されている(以下URL)ようですが、Full Scan、API Scan の結果ではこれより少ない

      [https://www.zaproxy.org/docs/alerts/](https://www.zaproxy.org/docs/alerts/)
      
  • GitHub の Issues を見ると、まだまだ重要な問題が残っているようなので、本格利用はその辺りが解決してからかな。と思いました。

Web Swing でコンテキストファイルを作成して、それをインプットに動かしたら良さそうな…という書き込みもあったのですが、時間切れで未確認の状況です。次の機会があれば試してみたいと思います。
結局、コンテキストファイルを作るには、OWASP ZAP が動く環境を自前で準備しないといけないんだよな〜。AWS でやるか〜 (´;ω;`)

参考

GitHub Marketplace

ZAP2Docker

以上。

27
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?