認可・アクセス制御
RBAC・ABAC・ReBAC の設計とIDOR・権限昇格・水平方向アクセス制御漏れの防止
認可とは、認証済みのユーザーが何にアクセスできるかを制御するプロセスであり、認証(誰であるか)とは明確に分離して設計する必要がある。RBAC(Role-Based Access Control)は、ロール(管理者・一般ユーザー等)に権限を付与し、ユーザーをロールに割り当てるシンプルなモデルであり、多くのビジネスアプリケーションでの基本的な選択肢となる。ABAC(Attribute-Based Access Control)は、ユーザー属性・リソース属性・環境属性を組み合わせた条件式で権限を判定する柔軟なモデルであり、より複雑なビジネスルールを表現できるが実装と管理のコストも高い。
ReBAC(Relationship-Based Access Control)は、Googleが開発したZanzibarシステムで採用されたモデルであり、ユーザーとリソースの関係グラフに基づいて権限を決定する。GoogleドキュメントやGitHubのリポジトリ権限のような「特定のオブジェクトを所有・共有されているか」という関係性を自然に表現できる。OPA(Open Policy Agent)はポリシーをコードとして記述し、認可ロジックをアプリケーションから分離して中央管理するためのOSSツールであり、マイクロサービス環境での認可ポリシーの一元化に適している。
IDOR(Insecure Direct Object Reference)は、URLパラメータ等に含まれるリソースIDを操作することで他のユーザーのデータに不正アクセスできる脆弱性であり、OWASP Top 10の常連項目である。最小権限の原則とデフォルト拒否(Deny by Default)の組み合わせは、認可設計の基本原則であり、許可が明示的に付与されていない限りアクセスを拒否するという考え方を徹底することでIDORや権限昇格を防ぐ基盤となる。
コードレビューで着目するポイント
- リソース取得時に、ログインユーザーとリソースの所有者の一致確認が行われているか(IDORチェック)
- 認可チェックがコントローラ層だけでなく、サービス・ドメイン層でも行われているか
- 管理者権限が必要なエンドポイントに対して、ユーザーロールの検証がサーバー側で実施されているか
- デフォルトで全アクセス拒否のポリシーが実装されており、許可は明示的に設定されているか
- 水平方向のアクセス制御(同ロール間のデータ分離)が設計・実装されているか
- 認可ロジックが複数箇所に散在せず、中央のサービスまたはポリシーとして管理されているか
- 権限変更・削除操作のログが監査証跡として記録されているか
典型的なアンチパターン
IDの連番推測によるIDOR: /api/orders/12345というURLで、認証済みであれば誰でも他ユーザーの注文を参照できる実装。IDをUUIDやトークンにしても根本的な解決にはならず、リソース取得時に必ずオーナーシップ検証を行う必要がある。
フロントエンドのみのアクセス制御: 管理者UIのボタンをロールに基づいて非表示にしているが、APIエンドポイント自体にはロールチェックがない実装。APIをHTTPクライアントで直接呼べば誰でもアクセスできてしまう。サーバーサイドでの検証は省略できない。
認可ロジックの分散: コントローラ・サービス・リポジトリ層それぞれに断片的に認可ロジックが書かれており、新しいエンドポイントを追加する際にどこに追加すべきか分からない状態。認可判定を一箇所(ポリシーサービスやミドルウェア)に集約することで一貫性を保てる。
参考リソース
- OWASP Authorization Cheat Sheet — 認可設計の包括的なチェックリストと実装ガイド
- Google Zanzibar論文 (2019) — ReBAC(関係ベースアクセス制御)の実装詳細と設計思想
- Open Policy Agent (OPA) (https://www.openpolicyagent.org/) — ポリシーとしての認可ロジックを中央管理するOSS
- NIST SP 800-162: Guide to Attribute Based Access Control — ABACの政府標準定義ガイド
- SpiceDB / Authzed — Zanzibarインスパイアの関係ベースアクセス制御OSSとマネージドサービス
- 1. 📄アーキテクチャスタイル
- 2. 📄ドメインモデリング
- 3. 📄モジュール分割と依存管理
- 4. 📄データモデリング
- 5. 📄API設計
- 6. 📄整合性とトランザクション
- 7. 📄非同期処理(Queue/Event)
- 8. 📄キャッシング
- 9. 📄ユーザーリサーチ
- 10. 📄情報アーキテクチャ
- 11. 📄インタラクションデザイン
- 12. 📄UX原則とヒューリスティクス
- 13. 📄アクセシビリティ(UX観点)
- 14. 📄UXメトリクス
- 15. 📄スケーラビリティ
- 16. 📄可用性とレジリエンス
- 17. 📄オブザーバビリティ
- 18. 📄環境・インフラ設計
- 19. 📄データマイグレーション
- 20. 📄セキュリティ設計原則
- 21. 📄データ保護とマルチテナント
- 22. 📄LLMセキュリティ
- 23. 📄ビジュアルデザイン原則
- 24. 📄デザインシステム
- 25. 📄コンポーネント設計
- 26. 📄スタイリング
- 27. 📄設計原則
- 28. 📄デザインパターン(GoF)
- 29. 📄エンタープライズパターン
- 30. 📄クリーンコード
- 31. 📄リファクタリング
- 32. 📄型設計とコントラクト
- 33. 📄関数型プログラミング概念
- 34. 📄エラーハンドリング
- 35. 📄テスト戦略と哲学
- 36. 📄テスト種別(機能テスト)
- 37. 📄テスト種別(UI・ビジュアル)
- 38. 📄テスト種別(契約・境界)
- 39. 📄並行処理・マルチスレッド
- 40. 📄パフォーマンス最適化
- 41. 📄ドキュメント管理
- 42. 📄バージョン管理と開発プロセス
- 43. 📄脅威モデリング
- 44. 📄通信保護(TLS)
- 45. 📄暗号化・機密情報管理
- 46. 📄認証・セッション管理
- 47. 📄認可・アクセス制御
- 48. 📄入力バリデーション
- 49. 📄インジェクション攻撃
- 50. 📄正規化(データベース正規化)