医療・介護・リハビリテーション分野 Webアプリケーション群
報告日: 2026年3月11日 | 対象: 37プロジェクト | v2(コードレビュー体制強化を追記)
3つのフェーズで包括的なセキュリティ体制を構築しました。
.claudeignore — AI開発ツールの機密ファイルアクセス制御.gitignore — バージョン管理からの機密ファイル除外CLAUDE.md — セキュリティルール(禁止事項・確認事項・必須チェック)| レイヤー | ツール | 対象 | 実行方法 |
|---|---|---|---|
| Layer 1: SAST | eslint-plugin-security, bandit | ソースコード静的解析 | CI自動 + npm run lint:security |
| Layer 2: SCA | npm audit, pip-audit, Gitleaks, Dependabot | 依存パッケージ脆弱性 + シークレット漏洩 | CI自動 + 週次スケジュール |
| Layer 3: E2E | Playwright (74テスト) | 認証バイパス, IDOR, XSS, SQLi, ヘッダー, CSRF | npm run test:security |
| Layer 4: DAST | OWASP ZAP (パッシブスキャン) | 本番URL動的解析 | CI自動(毎週水曜 3:00 JST) |
| Layer 5: AI Review | Claude Code 4エージェント並列 | 設計品質, セキュリティ, パフォーマンス, テスト | /code-review コマンド |
単一AIレビューから4専門エージェント並列レビューに移行。Zenn記事「コードレビューにClaude Code subagentsを導入したら、レビューレベルが改善した話」の手法を採用。
| Before | After | |
|---|---|---|
| エージェント | 1(汎用code-reviewer) | 4つの専門特化エージェント |
| 実行方式 | 逐次(1つずつ) | 並列同時実行 |
| 指摘形式 | CRITICAL/HIGH/MEDIUM/LOW | must/imo/nits/q |
| レポート | 個別出力 | 集約サマリーテーブル + 判定 |
モデル: Opus
モデル: Opus
モデル: Sonnet
モデル: Sonnet
| 接頭辞 | 意味 | 対応 |
|---|---|---|
| must. | 修正必須(バグ、セキュリティ、重大設計問題) | マージブロック |
| imo. | 改善推奨(可読性、保守性、パフォーマンス) | マージ可、対応推奨 |
| nits. | 軽微(スタイル、命名の微調整) | 任意 |
| q. | 質問(設計意図の確認) | 回答を求める |
4エージェントの結果を1つのサマリーテーブルに統合し、APPROVE / APPROVE WITH CHANGES / BLOCK の判定を出力。
| 領域 | must | imo | nits | q |
|---|---|---|---|---|
| 設計・品質 | - | - | - | - |
| セキュリティ | - | - | - | - |
| パフォーマンス | - | - | - | - |
| テスト | - | - | - | - |
| 合計 | 0 | 0 | 0 | 0 |
| プロジェクト | 修正前 | 修正後 | 対応内容 |
|---|---|---|---|
| bento_order_web | C:1 H:2 M:1 L:10 | L:8 | fast-xml-parser Critical修正, rollup/minimatch High修正 |
| remotion-videos | H:2 M:1 | 0 | serialize-javascript RCE修正 |
| dementia-cf-suite | H:2 M:1 | 0 | rollup, jspdf, dompurify修正 |
| drawing-cognitive-test | H:2 M:1 | 0 | rollup, jspdf, dompurify修正 |
| rokomo-check-app | H:2 M:1 | 0 | rollup, minimatch, dompurify修正 |
| suita-stroke-risk | H:2 M:1 | 0 | rollup, minimatch, dompurify修正 |
| productivity-health-survey | H:1 M:1 | 0 | xlsx→exceljs移行, dompurify修正 |
| dysphagia-risk-check | H:1 | 0 | tar Path Traversal修正 |
| visitcare | H:2 M:1 L:8 | L:8 | minimatch High修正 |
| endai-system | M:1 | 0 | dompurify XSS修正 |
| updrs-tracker | M:1 | 0 | dompurify XSS修正 |
| dementia-risk-suite | M:1 | 0 | dompurify XSS修正 |
| rehab-monitoring-system | L:8 | L:8 | firebase依存(破壊的変更回避) |
| ai-defense-line | 0 | 0 | 対応不要 |
| dementia-risk-check | 0 | 0 | 対応不要 |
| hirakata-pt-hp | 0 | 0 | 対応不要 |
| motion-analyzer | 0 | 0 | 対応不要 |
| rehab-fee-calculator | 0 | 0 | 対応不要 |
| 深刻度 | 件数 | 備考 |
|---|---|---|
| Critical | 0 | 全件解消 |
| High | 0 | 全件解消 |
| Moderate | 0 | 全件解消 |
| Low | 24 | firebase-admin依存チェーン(3件)。破壊的変更が必要なため現状維持 |
| 検出種別 | 件数 | 判定 | 対応 |
|---|---|---|---|
| シークレットハードコード | 8 | 全件誤検知 | バリデーションメッセージ、プレースホルダー、デモコード |
| 携帯電話番号パターン | 6 | 全件誤検知 | Dartビルド出力の数値列 |
| 固定電話(公開番号) | 48 | 問題なし | 施設公開番号・ダミーデータ |
| 個人携帯番号 | 8 | 要対応 | hirakata-pt-hp: 8ファイル10箇所から削除済み |
| テストカテゴリ | テスト数 | 検証内容 |
|---|---|---|
| 認証バイパス | 36 | 未認証→リダイレクト(23ページ)、権限昇格防止(13ページ)、API認証 |
| IDOR | 7 | 不正UUID、パストラバーサル、SQLiペイロード |
| 入力バリデーション | 10 | SQLi非漏洩、XSS防止、オーバーサイズ入力拒否 |
| セキュリティヘッダー | 5 | CSP, HSTS, X-Frame-Options, X-Content-Type-Options |
| レート制限 | 3 | 429応答、Retry-After、Webhook除外 |
| エラー情報漏洩 | 5 | 404/不正API/不正JSON → スタックトレース非漏洩 |
| CSRF/Cookie | 3 | SameSite/HttpOnly、ログアウト後Cookie無効化 |
| 合計 | 74テスト | 58 passed / 16 skipped(認証情報設定後に有効化可能) |
| ジョブ | ツール | トリガー | 失敗条件 |
|---|---|---|---|
| npm audit | npm audit | push(main), PR, 毎週月曜 9:00 JST | CRITICAL検出時 |
| SAST Lint | eslint-plugin-security | 同上 | セキュリティエラー検出時 |
| PII検出 | grep (電話番号, マイナンバー, シークレット) | 同上 | .envコミット or シークレットハードコード |
| Secret Scan | Gitleaks | 同上 | シークレット検出時 |
| DAST | OWASP ZAP | 毎週水曜 3:00 JST + 手動 | High以上のアラート |
| Dependabot | GitHub Dependabot | 毎週月曜(npm + Actions) | 自動PR作成 |
| 診断項目 | 実装内容 | 想定削減額 |
|---|---|---|
| 依存パッケージ脆弱性 | npm audit / pip-audit 全プロジェクト修正済み | 30〜50万円 |
| シークレット漏洩検出 | Gitleaks + CI/CDパイプライン | 20〜30万円 |
| 静的解析(SAST) | eslint-plugin-security + bandit | 40〜60万円 |
| 認証・認可テスト | Playwright 36テスト | 50〜60万円 |
| 入力バリデーションテスト | Playwright 10テスト(SQLi, XSS) | 30〜40万円 |
| セキュリティヘッダー検証 | Playwright 5テスト + next.config.ts | 10〜20万円 |
| PII漏洩スキャン | 全37プロジェクト横断スキャン + 電話番号削除 | 20〜30万円 |
| コードレビュー体制 | 4専門エージェント並列レビュー(設計・セキュリティ・パフォーマンス・テスト) | 50〜60万円 |
| 合計削減見込み | 250〜320万円 | |
| 診断項目 | 理由 | 対象 | 想定費用 |
|---|---|---|---|
| ペネトレーションテスト | 自動ツールでは発見できない論理的脆弱性 | endai-system(本番URL) | 100〜150万円 |
| アクティブDAST | パッシブのみ実装済み、アクティブは専門家判断必要 | 公開URL全体 | 50〜80万円 |
| ビジネスロジック診断 | 決済フロー、権限昇格、複合シナリオ | endai-system(Stripe連携) | 80〜120万円 |
| APIセキュリティ診断 | レースコンディション、Mass Assignment | endai-system(14 APIルート) | 50〜80万円 |
| 外注費用見込み | 250〜400万円 | ||
| チェック | 頻度 | 方法 |
|---|---|---|
| npm audit | 毎push + 毎週月曜 | GitHub Actions 自動 |
| Dependabot | 毎週月曜 | 自動PR作成 |
| Gitleaks | 毎push | GitHub Actions 自動 |
| OWASP ZAP | 毎週水曜 | GitHub Actions 自動 |
| ESLint Security | 毎push | GitHub Actions 自動 |
| AIコードレビュー | 毎コード変更時 | /code-review(4エージェント並列) |
| ファイル | 用途 |
|---|---|
SECURITY-STATUS.md | 全プロジェクトの対策状況、既知リスク、次回TODO(AI用) |
html-reports/security-audit_implementation-report.html | 本報告書(人間/外注先用) |
prompts/security_review_prompt.md | レビューテンプレート3種(実装後・デプロイ前・簡易) |
.claudeignore x 37 — AI開発ツールの機密ファイルアクセス制御.gitignore x 37 — バージョン管理からの除外(新規 or 追記)CLAUDE.md x 37 — セキュリティルール(新規 or 追記).github/workflows/security-audit.yml x 2 — CI/CDパイプラインprompts/security_review_prompt.md x 3 — レビューテンプレートscripts/security/security_package_audit.py — Python監査スクリプトSECURITY.md, SECURITY-AUTOMATION.md — セキュリティドキュメントpackage-lock.json x 15 — npm audit fix による依存更新productivity-health-survey/src/utils/excel-export.ts — xlsx→exceljs移行hirakata-pt-hp/public/*.html x 8 — 個人電話番号削除SECURITY-STATUS.md — AIセッション引き継ぎステータスファイル~/.claude/agents/performance-reviewer.md — パフォーマンスレビュー専門エージェント(新規)~/.claude/agents/test-coverage-reviewer.md — テストカバレッジレビュー専門エージェント(新規)~/.claude/agents/code-reviewer.md — 設計・品質特化に改修、must/imo/nits/q形式~/.claude/commands/code-review.md — 4エージェント並列オーケストレーション~/.claude/rules/agents.md — 新エージェント登録・並列実行ルール追加