Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OWASP ZAP のアクティブスキャンを自動化する試み #5169

Merged

Conversation

nanasess
Copy link
Contributor

@nanasess nanasess commented Sep 16, 2021

概要(Overview・Refs Issue)

OWASP ZAP のアクティブスキャンを自動化する。
OWASP ZAP を使用したペネトレーションテストを自動化する手段として、 OWASP ZAP Full Scan
があるが、EC-CUBE の場合は日本語入力が必須であったり、特殊な遷移パターンがあるため、十分にスキャンできない。
Selenium と連携させて自動化する方法があり、これを実装する

方針(Policy)

  • OWASP ZAP の API と Selenium を使用してアクティブスキャンを実行する。おおまかな流れは以下の通り
    1. OWASP ZAP の API でコンテキストや、自動ログインを設定する
    2. Selenium で OWASP ZAP の Proxy を通してクロールする
    3. クロールしたページに対してアクティブスキャンを実行する
    4. OWASP ZAP のセッションを保存する
  • 毎週1回0時に実行する
  • High 以上のアラートが出た場合は、 GitHub Actions がエラーとなる
    • 誤検知の場合は alertfilter に追加するオペレーションが必要
  • GitHub Actions のワークフローが完了すると、 OWASP ZAP のセッションデータがアップロードされ、GitHub Actions の Artifacts からダウンロードできる。これをローカル環境の OWASP ZAP で開くことで、アラートの内容などを確認することができる

実装に関する補足(Appendix)

OWASP ZAP を daemon モードで立ち上げるため、 docker-compose.owaspzap.daemon.yml を追加している

現在は以下のパターンを実装

  • フロント画面

    • 会員ログイン時 - お問い合わせ画面 → お問い合わせ画面(入力) → お問い合わせ画面(確認) → お問い合わせ画面(完了)
    • 非会員 - お問い合わせ画面 → お問い合わせ画面(入力) → お問い合わせ画面(確認) → お問い合わせ画面(完了)
  • 管理画面

    • 受注管理>メール通知 → メール通知(確認)
  • お問い合わせ画面は POST のパラメータで遷移する 特殊な遷移パターン に該当する

    • 確認画面→完了画面のテストは POST パラメータを書き換えることで対応
  • 受注管理>メール通知は、 EC-CUBE4.0.5 で脆弱性のあった機能

テスト(Test)

GitHub Actions で正常にセキュリティチェックできることを確認

ローカル環境で実行する場合

前提として chromedriverをインストールし、 PATH を通しておく
ローカル環境で実行する場合は以下のようにする

## docker-compose を使用して EC-CUBE をインストールする
docker-compose -f docker-compose.yml -f docker-compose.pgsql.yml -f docker-compose.dev.yml -f docker-compose.owaspzap.yml -f docker-compose.owaspzap.daemon.yml up -d
docker-compose -f docker-compose.yml -f docker-compose.pgsql.yml -f docker-compose.dev.yml -f docker-compose.owaspzap.yml -f docker-compose.owaspzap.daemon.yml exec -T ec-cube  bin/console doctrine:schema:create --env=dev
docker-compose -f docker-compose.yml -f docker-compose.pgsql.yml -f docker-compose.dev.yml -f docker-compose.owaspzap.yml -f docker-compose.owaspzap.daemon.yml exec -T ec-cube  bin/console eccube:fixtures:load --env=dev
## ダミーデータを生成する
docker-compose -f docker-compose.yml -f docker-compose.pgsql.yml -f docker-compose.dev.yml -f docker-compose.owaspzap.yml -f docker-compose.owaspzap.daemon.yml exec -T ec-cube bin/console eccube:fixtures:generate --products=5 --customers=1 --orders=5
docker-compose -f docker-compose.yml -f docker-compose.pgsql.yml -f docker-compose.dev.yml -f docker-compose.owaspzap.yml -f docker-compose.owaspzap.daemon.yml exec -T ec-cube bin/console doctrine:query:sql "UPDATE dtb_customer SET email = 'zap_user@example.com' WHERE id = 1;"
## APP_ENV=prod に設定する
sed -i 's!APP_ENV: "dev"!APP_ENV: "prod"!g' docker-compose.yml
docker-compose -f docker-compose.yml -f docker-compose.pgsql.yml -f docker-compose.dev.yml -f docker-compose.owaspzap.yml -f docker-compose.owaspzap.daemon.yml up -d ec-cube

## yarn でテストを実行する
cd zap/selenium/ci/TypeScript
yarn install
yarn jest

相談(Discussion)

  • テストは TypeScript で記述している。 OWASP ZAP API SDK の PHP 版は2016年から更新されていないため。 npm や yarn を使用したビルドは scss や2系で実績があるため、導入が楽であろうと思われる
  • Python の方が楽に記述できるかもしれない
  • 毎回 docker build が走るのでベースイメージが欲しい
  • 5秒ごとにアクティブスキャンの進捗を console.log() で表示しているが、もっとスマートな方法は無いか?
  • 毎回 OWASP ZAP のセッションをアップロードしているが、エラーになった場合のみアップロードするだけで良いか?

マイナーバージョン互換性保持のための制限事項チェックリスト

  • 既存機能の仕様変更
  • フックポイントの呼び出しタイミングの変更
  • フックポイントのパラメータの削除・データ型の変更
  • twigファイルに渡しているパラメータの削除・データ型の変更
  • Serviceクラスの公開関数の、引数の削除・データ型の変更
  • 入出力ファイル(CSVなど)のフォーマット変更

レビュワー確認項目

  • 動作確認
  • コードレビュー
  • E2E/Unit テスト確認(テストの追加・変更が必要かどうか)
  • 互換性が保持されているか
  • セキュリティ上の問題がないか

@codecov-commenter
Copy link

Codecov Report

Merging #5169 (4fd6a75) into 4.1 (06b3d7c) will increase coverage by 0.05%.
The diff coverage is 40.40%.

Impacted file tree graph

@@            Coverage Diff             @@
##              4.1    #5169      +/-   ##
==========================================
+ Coverage   68.08%   68.13%   +0.05%     
==========================================
  Files         457      456       -1     
  Lines       24972    24943      -29     
==========================================
- Hits        17001    16995       -6     
+ Misses       7971     7948      -23     
Flag Coverage Δ
tests 68.13% <40.40%> (+0.05%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Impacted Files Coverage Δ
src/Eccube/Controller/Admin/AdminController.php 73.80% <ø> (-5.54%) ⬇️
...ccube/Controller/Admin/Content/BlockController.php 68.31% <ø> (ø)
...ccube/Controller/Admin/Content/CacheController.php 0.00% <0.00%> (ø)
.../Eccube/Controller/Admin/Content/CssController.php 83.33% <ø> (ø)
...Eccube/Controller/Admin/Content/FileController.php 76.92% <ø> (ø)
...c/Eccube/Controller/Admin/Content/JsController.php 83.33% <ø> (ø)
...cube/Controller/Admin/Content/LayoutController.php 79.38% <ø> (ø)
...Eccube/Controller/Admin/Content/NewsController.php 42.42% <ø> (-15.16%) ⬇️
...Eccube/Controller/Admin/Content/PageController.php 77.92% <ø> (ø)
...e/Controller/Admin/Customer/CustomerController.php 71.87% <ø> (ø)
... and 75 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 06b3d7c...4fd6a75. Read the comment docs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants