Amazon Verified Permissions で実装するきめ細かい認可 - Cedar ポリシーによるアクセス制御

Cedar ポリシー言語で認可ロジックをアプリケーションコードから外部化し、Cognito 統合でトークンベースの認可判定を実現する手法を紹介します。

Verified Permissions の概要

Verified Permissions はアプリケーションのきめ細かい認可をマネージドに提供するサービスです。従来は認可ロジックをアプリケーションコード内の 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 で複数のリクエストをまとめて認可します。バッチ API でリスト画面の複数リソースへのアクセス権を一度に判定すると、個別 API を繰り返し呼ぶ場合より呼び出しの回数を減らせます。ポリシーテンプレートで共通パターンを定義し、テンプレートリンクポリシーでユーザーやリソースを動的にバインドして、共通パターンのポリシーをまとめて管理します。CloudTrail で API の呼び出しを記録すると、アクセスの監査に使えます。

設計のベストプラクティスと落とし穴

ポリシー設計では、RBAC (ロールベース) と ABAC (属性ベース) を組み合わせる方法があります。基本的な権限はロールで管理し、「ドキュメントの所有者のみ削除可能」のような細粒度の条件は属性で表現します。よくある落とし穴として、ポリシー数の増大によるデバッグ困難があります。1 つのポリシーストアにポリシーが蓄積すると、特定の認可判定がどのポリシーで評価されたか追跡が難しくなります。対策として、ポリシーテンプレートを活用して共通パターンを抽象化し、実体ポリシーの数を抑制します。また、Cedar の形式検証ツールを CI パイプラインに組み込み、ポリシー間の矛盾 (同一リクエストに permit と forbid が同時適用される状態) をデプロイ前に検出します。認可結果のキャッシュを実装する場合、キャッシュ TTL はポリシー変更の即時反映要件とのトレードオフです。リアルタイム性が求められるアプリケーションでは TTL を短く、読み取り頻度が高くポリシー変更が稀なアプリケーションでは長く設定します。

他の認可方式との比較

アプリケーション認可には複数のアプローチがあり、要件に応じて選択します。IAM ポリシーは AWS リソースへのアクセス制御のためのもので、アプリケーション内のビジネスロジックに基づく認可 (「この文書の作成者のみ編集可能」) は扱いません。Verified Permissions はこのアプリケーション層の認可を担います。Open Policy Agent (OPA) は Rego 言語で汎用的なポリシー記述が可能ですが、自前でポリシーエンジンのホスティングと可用性管理が必要です。Verified Permissions はマネージドサービスのため、ポリシーエンジンを自前でホスティングする必要がありません。Cognito のグループベース認可は単純な RBAC に適しますが、リソースレベルの細粒度制御やポリシーの宣言的管理には対応しません。マルチテナント SaaS では、テナントごとにポリシーストアを分離し、テナント間でポリシーが干渉しない構成にできます。

Verified Permissions の料金

Verified Permissions の料金は、単一の認可、バッチの認可、ポリシーの管理のそれぞれのリクエストの数で決まります。Cognito との統合で、ユーザー認証 (Cognito) と認可 (Verified Permissions) を分離し、認可ロジックをアプリケーションコードから外部化します。リクエスト数が多いアプリケーションでは、認可結果をキャッシュしてリクエスト数を減らすと、コストを抑えられます。BatchIsAuthorized API の呼び出しは、中に含めた認可の数に関わらず 1 回が 1 リクエストとして計上されます。

まとめ

Verified Permissions は Cedar ポリシー言語でアプリケーションの認可を外部化するサービスです。Cognito との統合でユーザー認証と認可を分離し、ポリシーストアのスキーマでポリシーの構文を検証します。BatchIsAuthorized API で複数リクエストを一括認可し、ポリシーテンプレートで共通パターンを管理します。RBAC と ABAC を組み合わせ、ロール管理と細粒度の条件付きアクセス制御を両方扱えます。

参考資料 (AWS 公式)

本ページの一次情報は AWS 公式サイトと公式ドキュメントです。最新の仕様と料金は次の公式ページで確認できます。

本ページと公式ドキュメントの記述が食い違う場合は、公式ドキュメントを正としてください。

共有する