翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
ID プロバイダでの Amazon Verified Permissions の使用
ID ソースは、Amazon Verified Permissions の外部 ID プロバイダー (IdP) を表します。ID ソースは、ポリシーストアとの信頼関係を持つ IdP で認証されたユーザーからの情報を提供します。アプリケーションが ID ソースからのトークンを使用して認証リクエストを行うと、ポリシーストアはユーザープロパティとアクセス許可から認証を決定できます。Verified Permissions ID ソースは、中央の ID ストアと認証サービスに直接接続することで認証を向上させます。
Verified Permissions では、OpenID Connect (OIDC)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 の承認決定に役立つさまざまな情報を含める機能があります。具体的には次のとおりです。
-
cognito:
プレフィックスが付いたユーザー名およびグループクレーム -
を使用したカスタムユーザー属性
custom: prefix
-
ランタイムに追加されたカスタムクレーム
-
sub
や などの OIDC 標準クレームemail
これらのクレームの詳細と管理方法については、「」の「Verified Permissions ポリシー」を参照してくださいスキーマとポリシーでの ID ソースの使用。
重要
Amazon Cognito トークンは有効期限が切れる前に取り消すことができますが、JWT は署名と有効性を備えた自己完結型のステートレスリソースと見なされます。JSON ウェブトークン RFC 7519
Verified Permissions のユーザープール ID ソースの Cedar ポリシーは、英数字とアンダースコア () 以外の文字を含むクレーム名に特別な構文を使用します_
。これには、 cognito:username
や などの:
文字を含むユーザープールプレフィックスクレームが含まれますcustom:department
。cognito: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.com
。aud
クレームが必ずしも対象者に関連付けられているわけではありません。
Verified Permissions は、ID ソースの対象者とクライアントの検証を次のように実行します。
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