Amazon Verified Permissions 入門 - Cedar言語による次世代の認可管理
「管理者(UserA)は、リソース(DocumentB)を、編集(Edit)できる」 このようなアプリケーション内の細かい権限ロジック(認可)を、アプリケーションコードの中に if (user.role == 'admin') とハードコードしていませんか?
Amazon Verified Permissionsは、こうした認可ロジックをアプリケーションから切り離し、外部で一元管理・評価するためのサービスです。
Amazon Verified Permissions とは
Amazon Verified Permissionsは、カスタムアプリケーションのための、スケーラブルできめ細かい認可(Fine-Grained Authorization)サービスです。 オープンソースのポリシー言語 Cedar を使用して、アクセス制御ポリシーを定義・管理します。
認可の外部化(Decoupled Authorization)
従来、認可ロジックはアプリケーションコードと密結合しており、変更のたびにデプロイが必要でした。 Verified Permissionsを使用すると、ポリシーをコードから分離できます。
- アプリ: 「UserAはDocumentBをEditできますか?」とVerified Permissionsに問合せ (API: IsAuthorized)
- AVP: 定義されたCedarポリシーに基づいて評価
- AVP: 「ALLOW(許可)」または「DENY(拒否)」を返却
- アプリ: 結果に基づいて処理を実行
Cedar ポリシー言語
Verified Permissionsの中核となるのが、AWSが開発した高速で安全なポリシー言語 Cedar です。 読みやすく、かつ論理的に検証可能な設計になっています。
ポリシーの例
「財務部(Finance)のメンバーは、すべての予算(Budget)ドキュメントを閲覧(View)できる」というポリシーは以下のようになります。
permit (
principal in Group::"Finance",
action == Action::"View",
resource is Document
)
when {
resource.type == "Budget"
};「ただし、機密(Private)フラグが立っているドキュメントは、作成者(Owner)以外はアクセスできない」という例外も簡単に追加できます。
forbid (
principal,
action,
resource
)
when {
resource.isPrivate == true &&
resource.owner != principal
};このように、permit(許可)と forbid(拒否)を組み合わせて、柔軟なルールを記述できます。デフォルトは「拒否(Deny)」です。
主な機能とメリット
1. 一元管理と監査
複数のマイクロサービスに散らばっていた認可ロジックを1箇所に集約できます。 「誰が何にアクセスできるか」というポリシーの変更履歴もバージョン管理され、監査が容易になります。
2. 開発スピードの向上
ポリシーの変更にアプリの再デプロイが不要になります。 セキュリティチームがポリシーを更新し、開発チームはビジネスロジックに集中するという分業が可能になります。
3. 自動推論による安全性
Cedarは「自動推論(Automated Reasoning)」により、ポリシーの正しさを数学的に証明することができます。 「この変更によって、意図せず一般ユーザーに管理者権限を与えてしまわないか?」といった検証を機械的に行えます。
IAM との違い
よくある疑問として「IAMポリシーと何が違うのか?」がありますが、守る対象が異なります。
| 特徴 | AWS IAM | Amazon Verified Permissions |
|---|---|---|
| 対象 | AWSリソース (S3, EC2, Lambda等) | アプリケーションリソース (ドキュメント, フォルダ, UI機能等) |
| 主な利用者 | インフラエンジニア | アプリケーション開発者 |
| 使用言語 | IAM Policy (JSON) | Cedar |
| 判定場所 | AWS API呼び出し時 | アプリケーション内でAPI (IsAuthorized) を呼ぶ時 |
まとめ
Amazon Verified Permissionsは、SaaSや複雑な業務アプリケーションにおける「誰が何を見れるか」という複雑な問題を解決するための強力なソリューションです。 アプリケーションのセキュリティと開発効率を両立するために、権限ロジックの外部化を検討してみてください。