ID プロバイダでの Amazon Verified Permissions の使用 - Amazon Verified Permissions

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

ID プロバイダでの Amazon Verified Permissions の使用

ID ソースは、Amazon Verified Permissions の外部 ID プロバイダー (IdP) を表します。ID ソースは、ポリシーストアとの信頼関係を持つ IdP で認証されたユーザーからの情報を提供します。アプリケーションが ID ソースからのトークンを使用して認証リクエストを行うと、ポリシーストアはユーザープロパティとアクセス許可から認証を決定できます。Verified Permissions ID ソースは、中央の ID ストアと認証サービスに直接接続することで認証を向上させます。

Verified Permissions では、OpenID Connect (OIDC) ID プロバイダー (IdPs) を使用できます。アプリケーションは、OIDC ID (ID) を使用して認証リクエストを生成したり、JSON ウェブトークン (JWTs。ID トークンを使用すると、Verified Permissions はユーザー IDsと属性クレームを属性ベースのアクセスコントロール (ABAC) のプリンシパルとして読み取ります。アクセストークンを使用すると、Verified Permissions はユーザー IDsプリンシパルとして、その他のクレームをコンテキスト として読み取ります。どちらのトークンタイプでも、 のようなクレームgroupsをプリンシパルグループにマッピングし、ロールベースのアクセスコントロール (RBAC) を評価するポリシーを構築できます。

Amazon Cognito ユーザープールまたはカスタム OpenID Connect (OIDC) IdP を ID ソースとして追加できます。

Amazon Cognito ID ソースの使用

Verified Permissions は Amazon Cognito ユーザープールと密接に連携します。Amazon Cognito JWTsは予測可能な構造です。Verified Permissions はこの構造を認識し、含まれる情報から最大限のメリットを得ます。例えば、ID トークンまたはアクセストークンを使用して、ロールベースのアクセスコントロール (RBAC) 認証モデルを実装できます。

新しい Amazon Cognito ユーザープール ID ソースには、次の情報が必要です。

  • AWS リージョン。

  • ユーザープール ID。

  • ID ソースに関連付けるユーザーエンティティタイプ。例: MyCorp::User

  • ID ソースに関連付けるグループエンティティタイプ。例: MyCorp::UserGroup

  • (オプション) ポリシーストアへのリクエストを許可するユーザープールのクライアント IDs。

Verified Permissions は同じ の Amazon Cognito ユーザープールでのみ機能するため AWS アカウント、別のアカウントで ID ソースを指定することはできません。Verified Permissions は、ユーザープールプリンシパルで動作するポリシーで参照する必要があるアイデンティティソース識別子であるエンティティプレフィックスを、ユーザープールの ID に設定します。例えば、 ですus-west-2_EXAMPLE

ユーザープールトークンクレームには、属性、スコープ、グループ、クライアント IDs、カスタムデータを含めることができます。Amazon Cognito JWTsには、Verified Permissions の承認決定に役立つさまざまな情報を含める機能があります。具体的には次のとおりです。

  1. cognito: プレフィックスが付いたユーザー名およびグループクレーム

  2. を使用したカスタムユーザー属性 custom: prefix

  3. ランタイムに追加されたカスタムクレーム

  4. sub や などの OIDC 標準クレーム email

これらのクレームの詳細と管理方法については、「」の「Verified Permissions ポリシー」を参照してくださいスキーマとポリシーでの ID ソースの使用

重要

Amazon Cognito トークンは有効期限が切れる前に取り消すことができますが、JWT は署名と有効性を備えた自己完結型のステートレスリソースと見なされます。JSON ウェブトークン RFC 7519 に準拠するサービスは、トークンをリモートで検証することが想定されており、発行者による検証は必須ではありません。つまり、Verified Permissions では、取り消されたトークン、またはユーザーに対して発行され、後で削除されたトークンに基づいてアクセスを許可できるということです。このリスクを軽減するために、有効期間をできるだけ短くしてトークンを作成し、ユーザーのセッションを継続する権限を削除したい場合は更新トークンを取り消すことをお勧めします。

Verified Permissions のユーザープール ID ソースの Cedar ポリシーは、英数字とアンダースコア () 以外の文字を含むクレーム名に特別な構文を使用します_。これには、 cognito:usernameや などの:文字を含むユーザープールプレフィックスクレームが含まれますcustom:departmentcognito:username または custom:departmentクレームを参照するポリシー条件を記述するには、principal["custom:department"]それぞれ principal["cognito:username"]および として記述します。

注記

トークンに cognito:または custom:プレフィックスを持つクレームと、リテラル値 cognitoまたは を持つクレーム名が含まれている場合custom、 を使用した認証リクエストは で失敗IsAuthorizedWithTokenしますValidationException

この例では、プリンシパルに関連付けられた Amazon Cognito ユーザープールクレームの一部を参照するポリシーを作成する方法を示します。

permit( principal == ExampleCo::User::"us-east-1_example|4fe90f4a-ref8d9-4033-a750-4c8622d62fb6", action, resource == ExampleCo::Photo::"VacationPhoto94.jpg" ) when { principal["cognito:username"]) == "alice" && principal["custom:department"]) == "Finance" };

クレームのマッピングの詳細については、「」を参照してくださいID トークンをスキーマにマッピングする。Amazon Cognito ユーザーの認可の詳細については、「Amazon Cognito デベロッパーガイド Amazon Cognito」の「Amazon Verified Permissions による認可」を参照してください。

OIDC ID ソースの使用

ポリシーストアの ID ソースとして、準拠する OpenID Connect (OIDC) IdP を設定することもできます。OIDC プロバイダーは Amazon Cognito ユーザープールに似ています。認証の積として JWTs を生成します。OIDC プロバイダーを追加するには、発行者 URL を指定する必要があります

新しい OIDC ID ソースには、次の情報が必要です。

  • 発行者 URL。Verified Permissions は、この URL で.well-known/openid-configurationエンドポイントを検出できる必要があります。

  • 認証リクエストで使用するトークンタイプ。この場合、ID トークン を選択します。

  • ID ソースに関連付けるユーザーエンティティタイプ。例: MyCorp::User

  • ID ソースに関連付けるグループエンティティタイプ。例: MyCorp::UserGroup

  • ID トークンの例、または ID トークン内のクレームの定義。

  • ユーザーおよびグループエンティティ IDsに適用するプレフィックス。CLI と API では、このプレフィックスを選択できます。API Gateway でセットアップし、ID ソースまたはガイド付きセットアップオプションを使用して作成したポリシーストアでは、Verified Permissions は発行者名から を引いたプレフィックスを割り当てますMyCorp::User::"auth.example.com|a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"。例えばhttps://、。

OIDC ID ソースによる認証では、ユーザープール ID ソースと同じ API オペレーションである IsAuthorizedWithTokenおよびBatchIsAuthorizedWithトークン が使用されます。

この例では、会計部門の従業員、機密分類を持つ従業員、および衛星オフィスにいない従業員の、年末レポートへのアクセスを許可するポリシーを作成する方法を示します。Verified Permissions は、プリンシパルの ID トークンのクレームからこれらの属性を取得します。

permit( principal in MyCorp::UserGroup::"MyOIDCProvider|Accounting", action, resource in MyCorp::Folder::"YearEnd2024" ) when { principal.jobClassification == "Confidential" && !(principal.location like "SatelliteOffice*") };

クライアントとオーディエンスの検証

ID ソースをポリシーストアに追加すると、Verified Permissions には、ID トークンとアクセストークンが意図したとおりに使用されていることを確認する設定オプションがあります。この検証は、 IsAuthorizedWithTokenおよび BatchIsAuthorizedWithToken API リクエストの処理で行われます。この動作は、ID トークンとアクセストークン、および Amazon Cognito と OIDC ID ソースによって異なります。Amazon Cognito ユーザープールプロバイダーを使用すると、Verified Permissions は ID トークンとアクセストークンの両方でクライアント ID を検証できます。OIDC プロバイダーを使用すると、Verified Permissions は ID トークンのクライアント ID とアクセストークンの対象者を検証できます。

クライアント ID は、プロバイダーで設定された OAuth または OIDC アプリケーションに関連付けられた識別子です。例えば、 です1example23456789対象者とは、ターゲットアプリケーションの目的の証明書利用者 、または宛先に関連付けられた URL パスです。例えば、 ですhttps://myapplication.example.comaud クレームが必ずしも対象者に関連付けられているわけではありません。

Verified Permissions は、ID ソースの対象者とクライアントの検証を次のように実行します。

Amazon Cognito

Amazon Cognito ID トークンには、アプリクライアント ID を含む audクレームがあります。アクセストークンには、アプリクライアント ID も含まれるclient_idクレームがあります。

ID ソースにクライアントアプリケーションの検証に 1 つ以上の値を入力すると、Verified Permissions はこのアプリケーションクライアント IDs のリストを ID トークンaudクレームまたはアクセストークンclient_idクレームと比較します。Verified Permissions は、Amazon Cognito ID ソースの証明書利用者 URL を検証しません。

OIDC

OIDC ID トークンには、クライアント ID のリストを含む audクレームがあります。 IDs アクセストークンには、トークンのオーディエンス URL を含む audクレームがあります。アクセストークンには、意図したクライアント ID を含むclient_idクレームもあります。

OIDC プロバイダーで対象者の検証に 1 つ以上の値を入力できます。トークンタイプの ID トークンを選択すると、Verified Permissions はクライアント ID を検証し、audクレーム内のクライアント IDs の少なくとも 1 つのメンバーが対象者検証値と一致することを確認します。

Verified Permissions は、アクセストークンの対象者を検証し、audクレームが対象者の検証値と一致することを確認します。このアクセストークン値は主に audクレームから取得されますが、client_idクレームが存在しない場合は cidまたは audクレームから取得できます。IdP に正しいオーディエンスのクレームと形式を確認してください。

ID トークンのオーディエンス検証値の例は です1example23456789

アクセストークンのオーディエンス検証値の例は ですhttps://myapplication.example.com

JWTs のクライアント側の承認

アプリケーションで JSON ウェブトークンを処理し、ポリシーストア ID ソースを使用せずに Verified Permissions にクレームを渡すことができます。JSON ウェブトークン (JWT) からエンティティ属性を抽出し、Verified Permissions に解析できます。

この例では、OIDC IdP.¹

async function authorizeUsingJwtToken(jwtToken) { const payload = await verifier.verify(jwtToken); var principalEntity = { entityType: "PhotoFlash::User", // the application needs to fill in the relevant user type entityId: payload["sub"], // the application need to use the claim that represents the user-id }; var resourceEntity = { entityType: "PhotoFlash::Photo", //the application needs to fill in the relevant resource type entityId: "jane_photo_123.jpg", // the application needs to fill in the relevant resource id }; var action = { actionType: "PhotoFlash::Action", //the application needs to fill in the relevant action id actionId: "GetPhoto", //the application needs to fill in the relevant action type }; var entities = { entityList: [], }; entities.entityList.push(...getUserEntitiesFromToken(payload)); var policyStoreId = "PSEXAMPLEabcdefg111111"; // set your own policy store id const authResult = await client .isAuthorized({ policyStoreId: policyStoreId, principal: principalEntity, resource: resourceEntity, action: action, entities, }) .promise(); return authResult; } function getUserEntitiesFromToken(payload) { let attributes = {}; let claimsNotPassedInEntities = ['aud', 'sub', 'exp', 'jti', 'iss']; Object.entries(payload).forEach(([key, value]) => { if (claimsNotPassedInEntities.includes(key)) { return; } if (Array.isArray(value)) { var attibuteItem = []; value.forEach((item) => { attibuteItem.push({ string: item, }); }); attributes[key] = { set: attibuteItem, }; } else if (typeof value === 'string') { attributes[key] = { string: value, } } else if (typeof value === 'bigint' || typeof value ==='number') { attributes[key] = { long: value, } } else if (typeof value === 'bigint' || typeof value ==='number') { attributes[key] = { long: value, } } else if (typeof value === 'boolean') { attributes[key] = { boolean: value, } } }); let entityItem = { attributes: attributes, identifier: { entityType: "PhotoFlash::User", entityId: payload["sub"], // the application need to use the claim that represents the user-id } }; return [entityItem]; }

1 このコード例では、aws-jwt-verify ライブラリを使用して、OIDC 互換 によって署名された JWTs を検証します IdPs。