ひとことで言うと#
セキュリティを開発プロセスの最初から設計に組み込むアプローチ。リリース後に脆弱性を見つけて直すのではなく、設計・実装・テスト・運用の各段階でセキュリティを考慮し、「そもそも脆弱性が生まれにくい」構造を作る。
押さえておきたい用語#
- 脅威モデリング
- 設計段階でどのような攻撃が考えられるかを体系的に洗い出す手法。STRIDEモデル(なりすまし・改ざん・否認・情報漏洩・DoS・権限昇格)が代表的。
- SAST(静的解析)
- ソースコードを実行せずにスキャンし、脆弱性パターンを検出するテスト手法。SonarQube、Semgrepなどのツールで自動化する。
- DAST(動的解析)
- 実行中のアプリケーションに対して擬似的な攻撃を行い、実行時の脆弱性を発見するテスト手法。OWASP ZAPが代表的。
- 最小権限の原則
- システムの各コンポーネントやユーザーに対して、業務に必要な最低限の権限だけを付与する設計原則。被害範囲の最小化に直結する。
- デフォルト拒否
- 明示的に許可したもの以外はすべてのアクセスを拒否するポリシー。ホワイトリスト方式とも呼ばれる。
セキュリティバイデザインの全体像#
こんな悩みに効く#
- 脆弱性が本番で見つかり、緊急パッチに追われている
- セキュリティレビューがリリース直前にしか行われず、手戻りが大きい
- 開発者が「セキュリティは専門チームの仕事」と考えている
基本の使い方#
設計段階でどんな攻撃がありうるかを洗い出す。
- STRIDEモデルで脅威を分類する(なりすまし、改ざん、否認、情報漏洩、DoS、権限昇格)
- データフロー図を描き、信頼境界を明確にする
- 各脅威に対する対策を設計に反映する
ポイント: 「この機能にはどんな攻撃が考えられるか?」を開発前に問う習慣をつける。
実装段階で安全なコーディングプラクティスを守る。
- 入力バリデーション: すべての外部入力を検証・サニタイズする
- 最小権限の原則: 必要最低限の権限だけで動作させる
- デフォルト拒否: 明示的に許可したもの以外はすべて拒否する
- 機密情報の適切な管理: シークレットをコードに埋め込まない
ポイント: フレームワークが提供するセキュリティ機能(CSRFトークン、SQLパラメータ化等)を活用する。
CI/CDパイプラインにセキュリティテストを組み込む。
- SAST(静的解析): コードの脆弱性パターンを検出(SonarQube、Semgrep)
- DAST(動的解析): 実行中のアプリに攻撃を試行(OWASP ZAP)
- SCA(ソフトウェア構成分析): 依存ライブラリの脆弱性を検出(Snyk、Dependabot)
ポイント: 手動のセキュリティレビューだけでは漏れる。自動化で全PRをチェックする。
リリース後も継続的にセキュリティを監視・改善する。
- 依存ライブラリの脆弱性通知を自動化する
- セキュリティヘッダー(CSP、HSTS等)を適切に設定する
- インシデントレスポンス計画を事前に策定する
- 定期的なペネトレーションテストを実施する
ポイント: セキュリティは「完了」がない。継続的に取り組む活動である。
具体例#
脅威モデリング結果: 「悪意あるファイルのアップロード」「パストラバーサル」「DoS(巨大ファイル)」の3脅威を特定。
設計に反映した対策:
- ファイル拡張子とMIMEタイプの両方を検証
- ファイル名をUUIDに変換して保存(パストラバーサル防止)
- ファイルサイズ上限を10MBに設定
- アップロード後にClamAVでウイルススキャンを実行
CI/CDに組み込み:
- PR作成時にSemgrepでセキュアコーディングチェック
- 依存ライブラリの脆弱性をSnykで毎日スキャン
- ステージング環境にOWASP ZAPで自動DAST
結果: リリース後1年間でセキュリティインシデントゼロ。以前は四半期に1回は脆弱性対応の緊急リリースがあった。後から直すコストは設計段階の投資の6倍と試算。
対象: クレジットカード決済API(月間120万件の取引を処理)
STRIDE分析:
- なりすまし → OAuth2 + JWTトークンで認証、APIキーのローテーション
- 改ざん → リクエストの署名検証(HMAC-SHA256)
- 否認 → 全APIコールを監査ログに記録(改ざん不可能なストレージ)
- 情報漏洩 → カード番号はトークナイゼーションで処理、TLS 1.3必須
- DoS → レートリミット(100req/min)、WAFの導入
- 権限昇格 → RBAC + APIエンドポイントごとの認可チェック
結果: PCI DSS準拠の監査を指摘事項ゼロで通過。従来は監査のたびに平均12件の指摘があり、対応に3週間かかっていた。
状況: 30人の開発チームで「セキュリティはセキュリティチームの仕事」という意識が根強い。
施策:
- 月1回のセキュリティランチ勉強会(OWASP Top 10を1項目ずつ)
- PR時のSemgrepチェックを必須化(年間847件の脆弱性パターンを自動検出)
- 脅威モデリングを設計レビューの標準プロセスに組み込み
- セキュリティチャンピオン制度: 各チームから1名をセキュリティ担当に任命
結果: 12ヶ月で本番の脆弱性報告が月平均4.2件→0.6件に減少。開発者の**78%**が「セキュリティは自分の責任」と回答(導入前は23%)。
やりがちな失敗パターン#
- セキュリティを後回しにする — 「機能を先に作ってからセキュリティは後で」と考えると、根本的な設計変更が必要になり手戻りが膨大になる。設計の初日からセキュリティを考慮すること
- ツールに頼りすぎる — SASTやDASTを導入しただけで安心してしまい、ビジネスロジックの脆弱性(認可の不備等)を見逃す。自動ツール+手動レビューを組み合わせること
- 開発者のセキュリティ教育を怠る — ツールがいくらあっても、開発者がSQLインジェクションを知らなければ同じミスを繰り返す。定期的なセキュリティトレーニングを実施すること
- セキュリティ要件を非機能要件として軽視する — 機能要件だけで設計を進め、セキュリティは「あとで考える」とされがち。要件定義の段階でセキュリティ要件を明文化すること
まとめ#
セキュリティバイデザインは 「最初から安全に作る」 ための開発アプローチ。脅威モデリングで攻撃を予測し、セキュアコーディングで脆弱性を防ぎ、自動テストで検証し、運用フェーズでも継続的に監視する。後付けのセキュリティ対策より、はるかに効率的でコストも低い。