Amazon Verified Permissions
Cedar ポリシー言語を使ってアプリケーションの認可ロジックを外部化し、きめ細かなアクセス制御を実現するマネージドサービス
概要
Amazon Verified Permissions は、アプリケーションの認可 (Authorization) ロジックをアプリケーションコードから分離し、Cedar というポリシー言語で宣言的に管理するフルマネージドサービスです。「誰が」「何に対して」「どのアクションを」「どの条件下で」実行できるかを Cedar ポリシーで定義し、アプリケーションからは API 呼び出しで認可判定を取得します。RBAC (ロールベースアクセス制御) と ABAC (属性ベースアクセス制御) の両方をサポートし、組織階層、リソースの所有者、時間帯、IP アドレスなど多様な条件を組み合わせた複雑な認可ルールを表現できます。Cognito との統合により、認証済みユーザーの属性を認可判定に直接利用できます。
Cedar ポリシー言語とスキーマ設計
Cedar は Amazon が開発したオープンソースのポリシー言語で、人間が読みやすく、かつ形式的に検証可能な構文を持ちます。ポリシーは permit (許可) と forbid (拒否) の 2 種類で構成され、principal (主体)、action (操作)、resource (対象) の 3 要素と条件 (when/unless) で認可ルールを記述します。例えば「ドキュメントの所有者はそのドキュメントに対して全操作を許可する」は permit(principal, action, resource) when { resource.owner == principal } と表現できます。Policy Store にはスキーマを定義し、principal、action、resource の型と属性を宣言します。スキーマにより、ポリシーの記述ミス (存在しない属性の参照、型の不一致) をデプロイ前に静的に検出でき、本番環境での認可エラーを防止します。ポリシーのバージョン管理は Git で行い、CI/CD パイプラインでスキーマ検証とテストを自動実行する運用が推奨されます。
Cognito 統合とマルチテナント設計
Verified Permissions は Cognito User Pools と直接統合し、認証トークン (ID トークン) に含まれるユーザー属性 (グループ、カスタム属性) を認可判定の入力として利用できます。CreateIdentitySource API で Cognito User Pool を登録すると、トークン内のクレームが Cedar の principal 属性に自動マッピングされます。マルチテナント SaaS アプリケーションでは、テナント ID をリソースの属性として定義し、「ユーザーは自身のテナントに属するリソースのみアクセス可能」というポリシーでテナント分離を実現します。認証認可の関連書籍 (Amazon) でアクセス制御の設計パターンを学べます。階層的なロール (組織管理者 > 部門管理者 > 一般ユーザー) も Cedar のエンティティ階層で表現でき、上位ロールの権限が下位に継承される RBAC モデルを自然に実装できます。
パフォーマンスと運用上の設計パターン
Verified Permissions の IsAuthorized API はミリ秒単位のレイテンシで応答し、リアルタイムの認可判定に十分な性能を提供します。ただし、ページ表示のたびに複数リソースへのアクセス権を一括判定する場合は、BatchIsAuthorized API で最大 30 件のリクエストをバッチ処理することでラウンドトリップを削減できます。ポリシーの設計では、デフォルト拒否 (明示的に許可されていない操作は全て拒否) の原則に従い、必要最小限の permit ポリシーを追加していくアプローチが安全です。forbid ポリシーは permit より優先されるため、緊急時のアクセス遮断 (特定ユーザーの即座のブロック) に活用できます。テスト戦略として、Cedar の形式検証ツールでポリシー間の矛盾 (同一リクエストに対して permit と forbid が同時に適用される) を検出し、意図しないアクセス拒否を防止します。認可判定のログは CloudTrail に記録され、「なぜこのリクエストが拒否されたか」のデバッグに活用できます。ポリシーの変更履歴と認可ログを突き合わせることで、ポリシー変更の影響分析も可能です。