Security Check ドキュメント
CakePHP 2 アプリケーションのセキュリティ診断を、1 つのコマンドで実行します。vendor/bin/security-check は、 pieceofcake2 の 3 つの診断を順に実行し、それぞれが A4 の PDF の報告書を書き出します。報告書は pieceofcake2/report のデザインです。
| 診断 | パッケージ | 見るもの | 見つけるもの |
|---|---|---|---|
| SCA (ソフトウェア構成分析) | pieceofcake2/security-sca | composer.lock の Composer のパッケージ | インストールしたバージョンの既知の脆弱性 (CVE)、開発が終了したパッケージ |
| SAST (静的アプリケーションセキュリティテスト) | pieceofcake2/security-sast | コードと設定 | 文字列で組み立てた SQL、リクエストで選ぶビュー、リクエストの unserialize()、オープンリダイレクト、h() なしで出力する変数、既定の salt や鍵、本番のデバッグレベルなど |
| DAST (動的アプリケーションセキュリティテスト) | pieceofcake2/security-dast | OWASP ZAP で、動いているアプリケーション | セキュリティヘッダーの不足、フラグのない Cookie、トークンのないフォーム、エラーページ。フルスキャンでは、攻撃で見つける XSS や SQL インジェクション |
それぞれの診断は、ほかの診断では見つけられないものを見つけます。脆弱なパッケージはアプリケーションのコードにはなく、 セキュリティヘッダーもコードにはなく、攻撃はスキャンが見つけたページにしか届きません。3 つを組み合わせると、それぞれ 単独よりずっと広く調べられます。
インストール
composer require --dev pieceofcake2/security-check3 つのパッケージがインストールされます。それぞれの必要なものが必要です。PHP 8.0 以上、Composer 2.4 以上、Docker (ZAP と、SAST で使うなら Semgrep のため)、PDF の印刷に Google Chrome か Chromium 131 以上、日本語の報告書には Linux では fonts-noto-cjk です。
使い方
プロジェクトのディレクトリで実行します。
vendor/bin/security-checksecurity-sca
0 vulnerabilities in 71 packages, 0 abandoned packages. Report: tmp/security/security-sca.pdf
security-sast
17 findings (1 high, 15 medium, 1 low) of 3 rules in 26 files (PHPStan 2.3.1). Report: tmp/security/security-sast.pdf
security-dast
2 alerts (2 low) on 6 URLs of http://127.0.0.1:49560 (ZAP 2.17.0). Report: tmp/security/security-dast.pdf
Security checks: sca passed, sast failed, dast passed.| オプション | 環境変数 | デフォルト | |
|---|---|---|---|
--project=DIR | カレントディレクトリ | プロジェクトのディレクトリ | |
--settings=FILE | SECURITY_SETTINGS | config/security.php か app/Config/security.php | 設定ファイル |
--only=LIST | SECURITY_CHECK_ONLY | sca,sast,dast | 実行する診断。カンマ区切り |
終了コードは、診断のうち一番重いものです。どれかが実行できなかったら (Docker が動いていないなど) 2、どれかが --fail-on に達するものを見つけたら 1、それ以外は 0 です。失敗した診断があっても、すべての診断を実行します。
報告書のパスは、単独で実行するときと同じく、カレントディレクトリからの相対パスです。プロジェクトで実行するか、絶対 パスを指定してください。
設定ファイル
それぞれの診断は、単独で実行するときと同じく、プロジェクトの設定ファイル config/security.php (従来の構成では app/Config/security.php) の自分のセクションと、自分の環境変数を読みます。report セクションは共通です。
<?php
// config/security.php
return [
'report' => [
'language' => 'ja',
'dir' => 'tmp/security',
'project' => 'Acme',
],
'sca' => [
'failOn' => 'high',
'noDev' => false,
],
'sast' => [
'engine' => 'semgrep',
'failOn' => 'high',
'safeViewVariables' => ['body_html'],
],
'dast' => [
'failOn' => 'medium',
'loginUrl' => '/users/login',
'username' => 'test@example.com',
'password' => getenv('SECURITY_DAST_PASSWORD') ?: null,
],
];キーは、それぞれのコマンドのオプションをキャメルケースにしたものです (--fail-on は failOn)。それぞれの設定は SCA、 SAST、 DAST をご覧ください。
報告書から安全なアプリケーションへ
既存のアプリケーションでは、次の順に報告書を進めてください。
- SCA: パッケージを更新します。 一番早く修正でき、たいていは一番急ぎます。既知の脆弱性は詳細が公開されています。 脆弱性を修正する
- SAST: 本番の設定。 デバッグレベル、salt、Cookie の鍵は、いくつかの設定です。秘密の値を変える前に、変えると何が 使えなくなるかを読んでください。設定
- DAST: セキュリティヘッダーと Cookie。 ベースラインスキャンのアラートのほとんどは、
AppControllerと Web サーバーで、アプリケーション全体に一度で修正できます。アラート - SAST: コード。 高の指摘 (SQL、ビュー、
unserialize()) から、次に中の指摘を修正します。 指摘を修正する - DAST: フルスキャン。 ユーザーとして、End-to-End テストでフルスキャンします。修正が保たれていることを攻撃で 確かめます。End-to-End テストをシナリオにする
そのあと CI で保ちます。各診断を failOn を none にして始め、報告書に何もなくなったら上げてください。脆弱性を 足した pull request が失敗するようになります (CI)。
