Amazon Verified Permissions で実装するきめ細かい認可 - Cedar ポリシーによるアクセス制御
Cedar ポリシー言語で認可ロジックをアプリケーションコードから外部化し、Cognito 統合でトークンベースの認可判定を実現する手法を紹介します。
Verified Permissions の概要
Verified Permissions はアプリケーションのきめ細かい認可をマネージドに提供するサービスで、1 秒あたり数千の認可リクエストを処理します。従来、認可ロジックはアプリケーションコード内に if 文で実装されることが多く、ポリシーの変更にコードデプロイが必要でした。Verified Permissions は Cedar ポリシー言語で認可ルールを外部化し、ポリシーの変更をコードデプロイなしに反映します。Cedar は Amazon が開発したオープンソースの認可ポリシー言語で、形式検証が可能な設計になっています。ポリシーの評価結果は決定論的であり、同じ入力に対して常に同じ認可判定を返すため、認可のデバッグと監査が容易です。
Cedar ポリシーと Cognito 統合
Cedar ポリシーは permit (許可) と forbid (拒否) のステートメントで構成されます。「ユーザー A はドキュメント X の read アクションを許可」「管理者ロールは全リソースの全アクションを許可」といったルールを宣言的に記述します。forbid ポリシーは permit より優先されるため、特定条件でのアクセス拒否を確実に実装できます。条件句 (when/unless) を使えば、「営業時間内のみアクセス許可」「IP アドレスが社内ネットワーク範囲の場合のみ許可」といった動的条件も表現可能です。Cognito との統合では、ID トークンのクレーム (グループ、カスタム属性) を Cedar ポリシーのプリンシパル属性として使用し、トークンベースの認可判定を実現します。API Gateway のオーソライザーとして Lambda を配置し、Verified Permissions の IsAuthorized API を呼び出すパターンが一般的です。
ポリシーストアとバッチ認可
ポリシーストアは Cedar ポリシーのコレクションで、アプリケーションごとに作成します。スキーマでエンティティタイプ (User、Document、Folder) とアクション (Read、Write、Delete) を定義し、ポリシーの構文検証を自動化します。スキーマを定義することで、存在しないエンティティタイプやアクションを参照するポリシーの作成を防止できます。IsAuthorized API で単一のリクエストを認可し、BatchIsAuthorized API で最大 30 件のリクエストを一括認可します。バッチ API はリスト画面で複数リソースへのアクセス権を一度に判定する際に有効で、個別 API を繰り返し呼ぶよりレイテンシが低減します。ポリシーテンプレートで共通パターンを定義し、テンプレートリンクポリシーでユーザーやリソースを動的にバインドすることで、ポリシーの管理を効率化します。CloudTrail で認可リクエストのログを記録し、アクセスパターンの分析と監査に活用します。 Verified Permissions のベストプラクティスを網羅的に学ぶなら、技術書 (Amazon)を参照してください。
設計のベストプラクティスと落とし穴
ポリシー設計では、RBAC (ロールベース) と ABAC (属性ベース) を組み合わせたハイブリッドモデルが推奨されます。基本的な権限はロールで管理し、「ドキュメントの所有者のみ削除可能」のような細粒度の条件は属性で表現します。よくある落とし穴として、ポリシー数の増大によるデバッグ困難があります。1 つのポリシーストアに数千のポリシーが蓄積すると、特定の認可判定がどのポリシーで評価されたか追跡が難しくなります。対策として、ポリシーテンプレートを活用して共通パターンを抽象化し、実体ポリシーの数を抑制します。また、Cedar の形式検証ツールを CI パイプラインに組み込み、ポリシー間の矛盾 (同一リクエストに permit と forbid が同時適用される状態) をデプロイ前に検出することが重要です。認可結果のキャッシュを実装する場合、キャッシュ TTL はポリシー変更の即時反映要件とのトレードオフです。リアルタイム性が求められるアプリケーションでは TTL を短く (数秒)、読み取り頻度が高くポリシー変更が稀なアプリケーションでは長く (数分) 設定します。
他の認可方式との比較
アプリケーション認可には複数のアプローチがあり、要件に応じて選択します。IAM ポリシーは AWS リソースへのアクセス制御に特化しており、アプリケーション内のビジネスロジックに基づく認可 (「この文書の作成者のみ編集可能」) には不向きです。Verified Permissions はこのアプリケーション層の認可を担います。Open Policy Agent (OPA) は Rego 言語で汎用的なポリシー記述が可能ですが、自前でポリシーエンジンのホスティングと可用性管理が必要です。Verified Permissions はマネージドサービスとして可用性と拡張性を AWS が保証し、運用負荷が低い点が利点です。Cognito のグループベース認可は単純な RBAC に適しますが、リソースレベルの細粒度制御やポリシーの宣言的管理には対応しません。マルチテナント SaaS では、テナントごとにポリシーストアを分離し、テナント間のポリシー干渉を物理的に防止する設計が有効です。
Verified Permissions の料金
Verified Permissions の料金は認可リクエスト数で課金されます。100 万リクエストあたり約 15 ドルで、ポリシーストアの管理やスキーマの定義に追加料金は発生しません。Cognito との統合で、ユーザー認証 (Cognito) と認可 (Verified Permissions) を分離し、認可ロジックをアプリケーションコードから外部化します。リクエスト数が多いアプリケーションでは、認可結果をキャッシュしてリクエスト数を削減することでコストを最適化します。BatchIsAuthorized API は 1 回の呼び出しで最大 30 リクエストを処理しますが、課金は含まれるリクエスト数分 (30 リクエスト分) で計上される点に注意が必要です。
まとめ
Verified Permissions は Cedar ポリシー言語でアプリケーションの認可を外部化するサービスです。Cognito との統合でユーザー認証と認可を分離し、ポリシーストアのスキーマで構文検証を自動化します。BatchIsAuthorized API で複数リクエストを一括認可し、ポリシーテンプレートで共通パターンの管理を効率化します。RBAC と ABAC のハイブリッド設計により、シンプルなロール管理と細粒度の条件付きアクセス制御を両立し、CloudTrail で認可リクエストの監査ログを記録します。