Security DAST ドキュメント
CakePHP 2 アプリケーションの動的アプリケーションセキュリティテスト (DAST) です。アプリケーションを起動して OWASP ZAP でスキャンし、アラートをリスクごとの A4 の PDF の報告書にします。報告書は pieceofcake2/report のデザインです。あるリスク以上のアラートがあれば、 終了コードで CI を失敗にします。
- スキャンの種類: ベースラインスキャンとフルスキャンがすること、どこで何を実行するか
- ログインしてスキャンする
- End-to-End テストをシナリオにする
- 設定: オプション、環境変数、設定ファイル
- 報告書: 読み方と、アラートの除外
- アラート: 各アラートの意味と、CakePHP 2 アプリケーションでの修正方法
- Web サーバーの設定: セキュリティヘッダーのための nginx と Apache の完全な設定
- GitHub Actions での CI
- トラブルシューティング
pieceofcake2 のセキュリティ診断の 1 つで、ほかに pieceofcake2/security-sca (Composer のパッケージの既知の脆弱性) と pieceofcake2/security-sast (ソースコード) があります。pieceofcake2/security-check で、すべてを実行できます。
見つけるもの
DAST は、ブラウザや攻撃者と同じように、アプリケーションを外から見ます。どのコードが作ったかに関係なく、PHP や Web サーバーの設定も含めて、レスポンスに表れるものを見つけます。
| 例 | |
|---|---|
| ベースラインスキャン (デフォルト) | セキュリティヘッダーの不足 (CSP、クリックジャッキング対策、X-Content-Type-Options など)、HttpOnly、Secure、SameSite のない Cookie、CSRF トークンのないフォーム、デバッグ情報を出すエラーページ、ヘッダーのバージョン、integrity のないほかのサイトのスクリプト |
フルスキャン (--scan=full) | 同じものと、攻撃して表れるもの。XSS (反射型、持続型、DOM ベース)、SQL インジェクション、パストラバーサル、コマンドインジェクション、オープンリダイレクトなど |
レスポンスに表れないものは見つけません。スキャンが届かないページの脆弱性、あるユーザーがほかのユーザーのデータに アクセスできるか (アプリケーションのルール)、どのリクエストでも表れないコードの弱さなどです。コードは pieceofcake2/security-sast で調べます。3 つの診断を組み合わせると、 それぞれ単独よりも広く調べられます。
クイックスタート
composer require --dev pieceofcake2/security-dast
# PHP の組み込みウェブサーバーとテストのデータベースで、アプリケーションをベースラインスキャン
vendor/bin/security-dast --pdf=tmp/security-dast.pdf --language=jaコマンドは、アプリケーションを APP_ENV=test で起動し、Docker の ZAP でスキャンして、まとめを出力します。
17 alerts (4 medium, 10 low, 3 info) on 7 URLs of http://127.0.0.1:56557 (ZAP 2.17.0). Report: tmp/security-dast.pdf終了コードは、--fail-on (デフォルト high) に達するアラートがなければ 0、あれば 1、ウェブサーバー、ZAP、 報告書のどれかが失敗したら 2 です。
続けて、順に進めます。
- ベースラインスキャンのアラートを修正します。ほとんどは、
AppControllerと Web サーバーで、アプリケーション全体に 一度で修正できます (アラート)。 - ユーザーとしてスキャンし、ログインの先のページにも届くようにします (ログインしてスキャンする)。
- End-to-End テストでフルスキャンを、CI で毎晩実行します (End-to-End テストをシナリオにする、 CI)。
しくみ
- プロジェクトのアプリケーションを、PHP の組み込みウェブサーバーで
127.0.0.1にAPP_ENV=testで起動します。 アプリケーションはconfig/.env.testを読み、テストのデータベースを使います。ドキュメントルートはアプリケーションから 取ります (config/define.phpのWWW_ROOT、またはwebroot/、従来の構成ではapp/webroot/)。ルータースクリプトが、webroot/.htaccessと同じようにリクエストをindex.phpに渡します。 - ZAP を Docker (
ghcr.io/zaproxy/zaproxy:stable) で、Automation Framework の plan で実行します。サイトをクロール するか End-to-End テストを記録して、各リクエストとレスポンスを確かめます。フルスキャンでは、続けて見つけたページと パラメーターを攻撃します (スキャンの種類)。 - ZAP の JSON の結果からアラートを読み、報告書の言語で PDF にします。
--language=jaでは、ZAP がアラートを日本語で 書きます (報告書)。
必要なもの
- PHP 8.0 以上
- Docker。ZAP のイメージ (約 1.5 GB) は初回に取得します。Linux ではコンテナがホストのネットワーク (
--network host) を使い、macOS と Windows (Docker Desktop) ではhost.docker.internalからアプリケーションにアクセスします - PDF の印刷に Google Chrome か Chromium 131 以上。日本語の報告書には、Linux では
fonts-noto-cjk APP_ENV=testで動くアプリケーション。ページに必要なテーブルとデータのあるテストのデータベース (テストが読み込む スキーマなど) と、config/.env.test--end-to-endには、pieceofcake2/panther の End-to-End テストと、 Chrome とその chromedriver
スキャンしてよいアプリケーションだけをスキャンしてください。ベースラインスキャンでもサイトに多くのリクエストを送り、 フルスキャンは攻撃を送ります。--url には自分のサーバーを指定し、他人のサイトには決して使わないでください。
