【AWSサービス 基礎編】Amazon Verified Permissions でアプリケーションの認可ポリシーを定義する

目次

概要

アプリケーションを開発する際、「誰が」「何に対して」「どの操作を」実行できるかを制御する認可(Authorization)の仕組みは欠かせません。認可ロジックをアプリケーションコード内にハードコードすると、ポリシーの変更や監査が困難になり、セキュリティリスクが増大します。

Amazon Verified Permissions は、アプリケーションの認可ポリシーを一元的に管理・評価するサービスです。Cedar ポリシー言語を使用してきめ細かいアクセス制御ルールを定義し、アプリケーションから API を呼び出して認可判定を行います。

本記事では、Verified Permissions の基本概念を理解し、ポリシーストアの作成からポリシーの定義、認可リクエストのテストまでを体験します。

アプリケーションからVerified Permissionsに認可リクエストを送信し、Cedarポリシーに基づいて許可/拒否を返す全体構成図を挿入
アプリケーションからVerified Permissionsに認可リクエストを送信し、Cedarポリシーに基づいて許可/拒否を返す全体構成図を挿入

この記事のメリット

  • アプリケーション認可の基本概念(認証と認可の違い、ポリシーベースのアクセス制御)を理解できる
  • Cedar ポリシー言語の基本構文を習得できる
  • ポリシーストアの作成とスキーマの定義方法を体験できる
  • ポリシーの作成と認可リクエストのテスト方法を把握できる
  • コードから認可ロジックを分離するアーキテクチャパターンを理解できる

執筆者とキャラクター紹介

執筆者:土肥(とひ)

株式会社ジェニュインの代表であり元エンジニア。これまでオンプレミスと AWS 環境のインフラ業務を担当。AWS 認定資格の学習で得た知識を、ハンズオンとともに解説するのが得意。直近では新人の教育も行っており、これから技術を学ぶ方が納得できる解説を心がけています。基礎編・Cloud Practitioner の記事では、解説役としても登場します。

土肥

クラウドおさる

クラウドおさる

はじめましてでござる。弊猿はクラウドおさる。IT インフラが異常に発達した猿山から、雲に乗って地上の AWS を学びに降りてきたのでござる。

クラウドおさる

基礎編や Cloud Practitioner の記事では、とひさんに素朴な疑問をぶつける役でござるな。Security - Specialty などの記事では、要所でワンポイントや注意点をひとこと添えるでござる。

クラウドおさる

猿山にもデータセンターや監視当番があって、地上で起きることはだいたい猿山にも同じ仕組みがあるのでござる。例え話がつい猿山に寄るのは、弊猿の癖でござる。

技術解説

Amazon Verified Permissions とは

クラウドおさる

とひさん、Amazon Verified Permissions とはどんなサービスでござるか?

土肥

アプリケーション向けのスケーラブルな認可サービスだよ。認可ロジックをアプリケーションコードから分離して、Cedar ポリシー言語で定義されたポリシーに基づいてアクセス制御を行うんだ。

クラウドおさる

認可ロジックをコードから分離する……具体的には、どんな場面で使われるのでござる?

土肥

主なユースケースは以下のようなものだね。

  • Web アプリケーションやモバイルアプリケーションのきめ細かいアクセス制御
  • マルチテナントアプリケーションのテナント間分離
  • ロールベースアクセス制御(RBAC)の実装
  • 属性ベースアクセス制御(ABAC)の実装
クラウドおさる

アプリの認可を、まるごと外で管理できるのでござるな!

主要コンポーネント

クラウドおさる

Verified Permissions を構成するコンポーネントには、どんなものがあるのでござるか?

土肥

主要なコンポーネントは以下の 4 つだよ。

コンポーネント説明
ポリシーストアポリシーとスキーマを格納するコンテナ
スキーマアプリケーションのエンティティタイプとアクションを定義する構造情報
ポリシー「誰が」「何に対して」「何をできるか」を Cedar 言語で記述したルール
テンプレートパラメータ化されたポリシーのひな形
ポリシーストア、スキーマ、ポリシー、認可リクエスト/レスポンスの関係を示す構成図
ポリシーストア、スキーマ、ポリシー、認可リクエスト/レスポンスの関係を示す構成図
クラウドおさる

ポリシーストアが全体の入れ物になっていて、その中にスキーマとポリシーが入るイメージでござるな。

Cedar ポリシー言語

クラウドおさる

Cedar ポリシー言語とは何でござるか? 弊猿、初めて聞いたでござる。

土肥

Cedar は Amazon が開発した認可ポリシー記述用の言語なんだ。人間が読みやすく、機械的な解析にも適した構文を持っているよ。基本構造はこんな感じだね。

permit (
    principal == <プリンシパル>,
    action == <アクション>,
    resource == <リソース>
) when {
    <条件>
};
クラウドおさる

permit で許可するルールを書くのでござるな。各要素は、どういう意味でござるか?

土肥

主要な要素をまとめるとこうなるよ。

要素説明例
permit / forbid許可または拒否のエフェクトpermit(...)
principal操作を実行するエンティティUser::"alice"
action実行する操作Action::"viewDocument"
resource操作対象のエンティティDocument::"report.pdf"
when / unless追加条件when { principal.role == "admin" }
クラウドおさる

「誰が」「何をして」「何に対して」という構造がはっきりしていて、読みやすいでござる!

認可の判定ロジック

クラウドおさる

複数のポリシーがある場合、どうやって最終的な判定が決まるのでござる?

土肥

Verified Permissions の認可判定は以下のルールに従うんだ。

  • デフォルトは 暗黙の拒否 である(明示的な permit がなければアクセスは拒否される)
  • 1 つでも forbid ポリシーに該当すると、permit ポリシーに関係なく 明示的な拒否 となる
  • permit ポリシーに該当し、forbid に該当しない場合のみ 許可 される
クラウドおさる

forbid があると、permit があっても拒否されるのでござるか……なかなか厳しいでござるな。

土肥

この判定ロジックは IAM ポリシーの評価ロジックと類似しているんだ。セキュリティ的には「明示的な拒否が最優先」という考え方が大事だからね。

クラウドおさる

なるほど、IAM と同じ考え方なら理解しやすいでござる! 猿山でも、長老会の「入るべからず」はどんな許可より強いのでござる。

スキーマの役割

クラウドおさる

スキーマには、どういう役割があるのでござるか?

土肥

スキーマはアプリケーションのデータモデルを定義するもので、以下の情報を含むよ。

  • エンティティタイプ: プリンシパルやリソースの種類(例: User、Document)
  • アクション: 実行可能な操作(例: viewDocument、editDocument)
  • 属性: 各エンティティタイプが持つプロパティ(例: User の role 属性)
クラウドおさる

スキーマがなくても、ポリシーは書けるのでござるか?

土肥

スキーマを定義することで、ポリシー作成時のバリデーションが有効になり、誤ったポリシーの作成を防止できるんだ。型チェックみたいなものだと思えばいいよ。

クラウドおさる

開発のときにミスを早めに見つけられるのは、助かるでござる!

新卒・未経験の方へ
クラウドおさる

AWS を仕事にしたい方へ ── 新卒・未経験から

この記事を書いているのは、AWS の設計・構築を仕事にしている現役エンジニアです。運営元の株式会社ジェニュインでは、新卒・未経験の方を募集しています。プログラミング未経験から入社して活躍しているメンバーもいます。

  • ✓システム開発・WEB エンジニア / インフラ構築などの職種で、未経験から応募できます
  • ✓未経験から入社した社員の声を含む社員アンケートを掲載
  • ✓応募フォームから 1 分で応募できます

実践

前提条件

  • リージョン: ap-northeast-1(東京)
  • IAM ユーザーまたはロールに Amazon Verified Permissions の操作権限があること

作成するリソース一覧

リソース種別リソース名用途
ポリシーストアPhotoFlash(サンプルから作成。説明・名前空間はサンプル名で自動設定)ポリシーとスキーマの格納先
ポリシー(複数作成)認可ルールの定義

ステップ1: ポリシーストアの作成

AWS マネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します。

上部の検索バーに Verified Permissions と入力し、表示された「Amazon Verified Permissions」を選択します。

「ポリシーストアを作成」をクリックします。

「開始オプション」で「サンプルポリシーストアから開始」を選択します(ほかに「ガイド付きセットアップに従う」「API ゲートウェイと ID プロバイダーによるセットアップ」「空のポリシーストアを作成する」があります)。

表示されるサンプルの一覧から「PhotoFlash」を選択します。これは写真共有アプリケーションを想定したサンプルで、ユーザー、グループ、アルバム、写真といったエンティティとアクションが事前定義されています。

「ポリシーストアの詳細」の「ポリシーストアの説明」と「名前空間」にはサンプル名 PhotoFlash が自動で入り、変更できません。「保存時の暗号化」「タグ」はデフォルトのままにします。

ポリシーストア作成画面(サンプルプロジェクト「PhotoFlash」の選択)
ポリシーストア作成画面(サンプルプロジェクト「PhotoFlash」の選択)

「ポリシーストアを作成」をクリックします。

作成が完了すると、ポリシーストアの詳細画面が表示されます。

ポリシーストア作成完了画面
ポリシーストア作成完了画面

ステップ2: スキーマの確認

左側ナビゲーションの「スキーマ」を選択します。

スキーマは「ビジュアルモード」と「JSON モード」で表示を切り替えられます。ビジュアルモードには「アクション図」「エンティティタイプ図」のタブと、下部に「エンティティタイプ」「アクション」の一覧があります。

PhotoFlash サンプルには以下のエンティティタイプとアクションが定義されています(名前空間は PhotoFlash)。

  • エンティティタイプ(5 件): User、Account、Album、FriendGroup、Photo。User は FriendGroup のメンバーになれます
  • アクション(13 件): ViewPhoto、CreatePhoto、DeletePhoto、CommentPhoto、SharePhoto、SetPrivacyFlag、UpdateAlbum、UpdateFriendGroup、BlockAccountAccess、CloseAccount と、アクショングループ FullPhotoAccess、LimitedPhotoAccess、ManageAccount

「アクション」の一覧では、各アクションがどのプリンシパルタイプ(User)とリソースタイプ(Photo や Account)に適用できるかを確認できます。

スキーマのビジュアルエディタ画面(エンティティタイプとアクションの一覧)
スキーマのビジュアルエディタ画面(エンティティタイプとアクションの一覧)

ステップ3: ポリシーの確認

左側ナビゲーションの「ポリシー」を選択します。

サンプルとして作成された静的ポリシー「Users have full control over their own accounts」が一覧に表示されます。行のラジオボタンを選択すると、画面下部のパネルに「ポリシーの内容」として Cedar 言語で記述されたポリシーが表示されます。

このポリシーは以下の内容です。

permit (principal, action, resource)
when { resource in principal.Account };

「すべてのプリンシパルに対して、自分のアカウントに属するリソースへのあらゆる操作を許可する」という意味です。なお、サンプルには「ポリシーテンプレート」も 3 つ作成されており、左側ナビゲーションの「ポリシーテンプレート」で確認できます。

ポリシー一覧画面とポリシーの詳細(Cedar ポリシーの内容)
ポリシー一覧画面とポリシーの詳細(Cedar ポリシーの内容)

ステップ4: 新しいポリシーの作成

「ポリシーの作成」→「静的ポリシーを作成」を選択します。ポリシーの作成は「ポリシーの範囲」「詳細」の 2 ステップです。

ステップ 1: ポリシーの範囲

「フレンドグループ admins に属するユーザーに対して、すべてのアクションを許可する」というポリシーになるよう、以下を設定します。

  • ポリシーの効果: 許可
  • プリンシパルの範囲: プリンシパルのグループ を選択し、エンティティタイプ PhotoFlash::FriendGroup、エンティティ識別子 admins を指定
  • リソースの範囲: すべてのリソース
  • アクションの範囲: すべてのアクション
ポリシーの範囲の設定画面(プリンシパルのグループに admins を指定した状態)
ポリシーの範囲の設定画面(プリンシパルのグループに admins を指定した状態)

「次へ」をクリックします。

ステップ 2: 詳細

「ポリシー」に、範囲の設定から生成された以下の Cedar ポリシーが表示されます。ここで直接編集することもできます(エンティティタイプは名前空間 PhotoFlash:: を付けて書きます)。

permit(principal in PhotoFlash::FriendGroup::"admins", action, resource);
  • ポリシーの説明 – オプション: admins グループに全権限を付与
静的ポリシーの作成画面(Cedar ポリシーの入力)
静的ポリシーの作成画面(Cedar ポリシーの入力)

「ポリシーを作成」をクリックします。一覧に 2 つ目のポリシーが追加されます。

ステップ5: 認可リクエストのテスト

左側ナビゲーションの「テストベンチ」を選択します。

テストベンチでは、認可リクエストをシミュレートして、ポリシーの評価結果を確認できます。「ビジュアルモード」のまま、以下のリクエストを設定します。

  • プリンシパル: エンティティタイプ PhotoFlash::User を選択し、エンティティ識別子に alice と入力します
  • 「親」の「親を追加」をクリックし、エンティティタイプ PhotoFlash::FriendGroup、エンティティ識別子 admins を指定します(alice が admins グループに属していることを表します)
  • 「属性」の Account には、エンティティ識別子 acct1 を入力します(スキーマで必須の属性なので何か値が必要です)
  • リソース: エンティティタイプ PhotoFlash::Photo を選択し、エンティティ識別子に photo123 と入力します
  • アクション: プリンシパルとリソースを指定すると選べるようになるので、PhotoFlash::Action::"ViewPhoto" を選択します
テストベンチ画面(プリンシパル、アクション、リソースの入力)
テストベンチ画面(プリンシパル、アクション、リソースの入力)

画面上部の「承認リクエストを実行」をクリックします。

結果として「決定: 許可」(ALLOW)または「決定: 拒否」(DENY)が表示されます。「満たされたポリシー」に、判定に使われたポリシーの ID(ここでは admins グループに全権限を付与したポリシー)が表示されます。

テストベンチの認可判定結果画面
テストベンチの認可判定結果画面

ステップ6: 拒否ポリシーの追加と動作確認

forbid ポリシーの動作を確認するため、新しいポリシーを作成します。

「ポリシー」に戻り、「ポリシーの作成」→「静的ポリシーを作成」を選択します。

「ポリシーの範囲」で以下を設定し、「次へ」をクリックします。

  • ポリシーの効果: 禁止
  • プリンシパルの範囲: すべてのプリンシパル
  • リソースの範囲: すべてのリソース
  • アクションの範囲: 特定のアクションセット を選択し、PhotoFlash::Action::"DeletePhoto" にチェック

「詳細」に以下の Cedar ポリシーが生成されます。

forbid(principal, action in [PhotoFlash::Action::"DeletePhoto"], resource);
  • ポリシーの説明 – オプション: すべてのユーザーの写真削除を禁止
forbid ポリシーの作成画面
forbid ポリシーの作成画面

「ポリシーを作成」をクリックします。

テストベンチに戻り、ステップ5 の設定のままアクションだけを変更してテストします。

  • プリンシパル: PhotoFlash::FriendGroup::"admins" に属する PhotoFlash::User::"alice"(ステップ5 と同じ)
  • リソース: PhotoFlash::Photo::"photo123"(ステップ5 と同じ)
  • アクション: PhotoFlash::Action::"DeletePhoto" に変更

admins グループには全権限を付与する permit ポリシーがありますが、forbid ポリシーが優先されるため、結果は「DENY」となることを確認します。

forbid ポリシーにより DENY が返されたテストベンチ結果
forbid ポリシーにより DENY が返されたテストベンチ結果

まとめ

  • Amazon Verified Permissions はアプリケーションの認可ロジックをコードから分離し、Cedar ポリシー言語で一元管理するサービスである
  • ポリシーストアにスキーマとポリシーを定義し、API 経由で認可判定を行う
  • Cedar ポリシーは permit(許可)と forbid(拒否)の 2 種類があり、forbid は常に permit に優先する
  • スキーマを定義することで、エンティティタイプやアクションのバリデーションが有効になり、誤ったポリシーを防止できる
  • テストベンチを使用して、認可リクエストのシミュレーションとポリシーの検証が可能である
  • RBAC と ABAC の両方のアクセス制御パターンを実装できる

参照先

キャリア相談
クラウドおさる

独学の先に、AWS の仕事がある ── ジュニアおさるのキャリア相談

CLF には受かったけれど、次に何をすればいいのか分からない。独学で AWS を学ぶジュニアおさるの相談に、株式会社ジェニュイン代表の土肥が答えています。

  • ✓資格はゴールか、CLF の次に何から手を付けるか
  • ✓EC2 の次に作ってみる構成と、IaC・コスト管理
  • ✓実務経験ゼロでも、面接で話せる「これまで」の作り方
新卒・未経験の方へ
クラウドおさる

AWS を仕事にしたい方へ ── 新卒・未経験から

この記事を書いているのは、AWS の設計・構築を仕事にしている現役エンジニアです。運営元の株式会社ジェニュインでは、新卒・未経験の方を募集しています。プログラミング未経験から入社して活躍しているメンバーもいます。

  • ✓システム開発・WEB エンジニア / インフラ構築などの職種で、未経験から応募できます
  • ✓未経験から入社した社員の声を含む社員アンケートを掲載
  • ✓応募フォームから 1 分で応募できます

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社ジェニュイン(https://genuine-pt.jp)の代表取締役.

2018年〜インフラエンジニアとしてキャリアをスタートし、オンプレミスのネットワーク・サーバ環境で3年半、クラウド環境で4年半の8年間エンジニアとして従事。
2021年に佐藤氏の創業した株式会社Luxyを引き継ぎ、代表に就任。
その後アガルートグループ内の株式会社ジェニュインと合併。
合併後同社代表に就任。

目次