翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
ID プロバイダでの Amazon Verified Permissions の使用
ID ソースは、Amazon Verified Permissions の外部 ID プロバイダー (IdP) を表します。ID ソースは、ポリシーストアとの信頼関係を持つ IdP で認証されたユーザーからの情報を提供します。アプリケーションが ID ソースからのトークンを使用して認可リクエストを行うと、ポリシーストアはユーザープロパティとアクセス許可から認可を決定できます。Amazon Cognito ユーザープールまたはカスタム OpenID Connect (OIDC) IdP を ID ソースとして追加できます。
Verified Permissions で OpenID Connect (OIDC)groups
をプリンシパルグループにマッピングし、ロールベースのアクセスコントロール () を評価するポリシーを構築できますRBAC。
注記
Verified Permissions は、IdP トークンからの情報に基づいて認可の決定を行いますが、IdP と直接やり取りすることはありません。
Amazon Cognito ユーザープールまたは OIDC ID step-by-stepプロバイダーRESTAPIsを使用して Amazon API Gateway の認可ロジックを構築するチュートリアルについては、 AWS セキュリティブログのAmazon Cognito で Amazon Verified Permissions APIsを使用してAPIゲートウェイを承認する」または「独自の 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
。この場合、ID が のユーザープール内のユーザーを参照a1b2c3d4-5678-90ab-cdef-EXAMPLE22222
します。 us-west-2_EXAMPLE|a1b2c3d4-5678-90ab-cdef-EXAMPLE22222
ユーザープールトークンクレームには、属性、スコープ、グループ、クライアント IDs、カスタムデータを含めることができます。Amazon Cognito JWTs には、Verified Permissions の承認決定に役立つさまざまな情報を含める機能があります。具体的には次のとおりです。
-
cognito:
プレフィックスが付いたユーザー名およびグループクレーム -
を使用したカスタムユーザー属性
custom: prefix
-
実行時に追加されたカスタムクレーム
-
OIDC
sub
や などの標準クレームemail
これらのクレームの詳細と、それらを の Verified Permissions ポリシーで管理する方法について説明しますID プロバイダートークンをスキーマにマッピングする。
重要
有効期限が切れる前に Amazon Cognito トークンを取り消すことはできますが、 JWTs は署名と有効性が自己完結したステートレスリソースと見なされます。JSON Web Token 7519 RFC
次の例は、プリンシパルに関連付けられた Amazon Cognito ユーザープールクレームの一部を参照するポリシーを作成する方法を示しています。
permit( principal, action, resource == ExampleCo::Photo::"VacationPhoto94.jpg" ) when { principal["cognito:username"]) == "alice" && principal["custom:department"]) == "Finance" };
次の例は、Cognito ユーザープール内のユーザーであるプリンシパルを参照するポリシーを作成する方法を示しています。プリンシパル ID は の形式であることに注意してください"<userpool-id>|<sub>"
。
permit( principal == ExampleCo::User::"us-east-1_example|a1b2c3d4-5678-90ab-cdef-EXAMPLE11111", action, resource == ExampleCo::Photo::"VacationPhoto94.jpg" );
Verified Permissions のユーザープール ID ソースの Cedar ポリシーは、英数字とアンダースコア () 以外の文字を含むクレーム名に特別な構文を使用します_
。これには、 cognito:username
や などの:
文字を含むユーザープールプレフィックスクレームが含まれますcustom:department
。cognito:username
または custom:department
クレームを参照するポリシー条件を記述するには、principal["custom:department"]
それぞれ principal["cognito:username"]
および として記述します。
注記
トークンに cognito:
または custom:
プレフィックスを持つクレームと、リテラル値 cognito
または を持つクレーム名が含まれている場合custom
、 を使用した認可リクエストIsAuthorizedWithTokenは で失敗しますValidationException
。
クレームのマッピングの詳細については、「」を参照してくださいID トークンをスキーマにマッピングする。Amazon Cognito ユーザーの認可の詳細については、「Amazon Amazon Cognitoデベロッパーガイド」の「Amazon Verified Permissions による認可」を参照してください。
OIDC ID ソースの使用
また、準拠している OpenID Connect (OIDC) IdP をポリシーストアの ID ソースとして設定することもできます。 OIDCプロバイダーは Amazon Cognito ユーザープールに似ています。これらは認証の積JWTsとして生成されます。OIDC プロバイダーを追加するには、発行者を指定する必要があります。 URL
新しい OIDC ID ソースには、次の情報が必要です。
-
発行者 URL。Verified Permissions は、この で
.well-known/openid-configuration
エンドポイントを検出できる必要がありますURL。 -
CNAME ワイルドカードを含まない レコード。たとえば、 は にマッピング
a.example.com
できません*.example.net
。逆に、*.example.com
を にマッピングすることはできませんa.example.net
。 -
認可リクエストで使用するトークンタイプ。この場合、ID トークンを選択します。
-
ID ソースに関連付けるユーザーエンティティタイプ。例:
MyCorp::User
。 -
ID ソースに関連付けるグループエンティティタイプ。例:
MyCorp::UserGroup
。 -
ID トークンの例、または ID トークン内のクレームの定義。
-
ユーザーおよびグループエンティティ に適用するプレフィックスIDs。CLI および ではAPI、このプレフィックスを選択できます。API ゲートウェイでのセットアップ、ID プロバイダー、またはガイド付きセットアップオプションを使用して作成したポリシーストアでは、Verified Permissions は発行者名から を引いたプレフィックスを割り当てます。たとえば
https://
、 ですMyCorp::User::"auth.example.com|a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
。
API オペレーションを使用してOIDCソースからのリクエストを承認する方法の詳細については、「」を参照してください認可に使用できるAPIオペレーション。
次の例は、会計部門の従業員、機密分類を持つ従業員、および衛星オフィスにいない従業員に対して、年次レポートへのアクセスを許可するポリシーを作成する方法を示しています。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 は、アプリケーションが使用する ID プロバイダーインスタンスに関連付けられた識別子です。たとえば、 です1example23456789
。対象者とは、 などのアクセストークンの意図された証明書利用者または送信先に関連付けられたURLパスですhttps://mytoken.example.com
。アクセストークンを使用する場合、aud
クレームは常に対象者に関連付けられます。
Verified Permissions は、次のように ID ソースオーディエンスとクライアント検証を実行します。
のクライアント側の認可 JWTs
アプリケーションでJSONウェブトークンを処理し、ポリシーストアの ID ソースを使用せずに Verified Permissions にクレームを渡すことができます。JSON ウェブトークン (JWT) からエンティティ属性を抽出し、Verified Permissions に解析できます。
この例では、.1 を使用してアプリケーションから Verified Permissions を呼び出す方法を示しますJWT。
async function authorizeUsingJwtToken(jwtToken) { const payload = await verifier.verify(jwtToken); let 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 }; let 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 }; let 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 }; let entities = { entityList: [], }; entities.entityList.push(...getUserEntitiesFromToken(payload)); let 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 === 'boolean') { attributes[key] = { boolean: value, } } }); let entityItem = { attributes: attributes, identifier: { entityType: "PhotoFlash::User", entityId: payload["sub"], // the application needs to use the claim that represents the user-id } }; return [entityItem]; }
1 このコード例では、 aws-jwt-verify