使用以角色為基礎的存取控制 - Amazon Cognito

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用以角色為基礎的存取控制

Amazon Cognito 身分集區會為您的已驗證使用者指派一組臨時、有限權限的憑證,以存取您的 AWS 資源。每個使用者的許可是透過您建立IAM的角色來控制。您也可以定義規則,以依據使用者 ID 權杖中的宣告,為每個使用者選擇角色。您可以為已驗證的使用者定義預設角色。您也可以為未驗證的訪客使用者定義具有有限許可的獨立IAM角色。

建立角色以進行角色映射

為每個角色新增適當的信任政策是很重要的,這樣才能讓 Amazon Cognito 針對身分集區中的已驗證使用者來採用信任政策。以下是這種信任政策的範例:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Federated": "cognito-identity.amazonaws.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "cognito-identity.amazonaws.com:aud": "us-east-1:12345678-corner-cafe-123456790ab" }, "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "authenticated" } } } ] }

此政策可讓來自 cognito-identity.amazonaws.com(OpenID Connect 權杖的發行者) 的聯合身分使用者擔任這個角色。此外,政策會限制權杖的 aud(在此案例中為身分集區 ID) 來配合身分集區。最後,政策會指定 Amazon Cognito GetOpenIdTokenAPI動作所發出之權杖的多值amr宣告其中一個陣列成員具有 值 authenticated

授予傳送角色許可

若要允許使用者在身分集區上設定具有超過使用者現有許可許可的角色,請授予他們將角色傳遞至 set-identity-pool-rolesiam:PassRole許可API。例如,如果使用者無法寫入 Amazon S3,但使用者在身分集區上設定IAM的角色授予 Amazon S3 寫入許可,則使用者只能在授予角色iam:PassRole許可時設定此角色。下列政策範例顯示如何允許 iam:PassRole 許可。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1", "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::123456789012:role/myS3WriteAccessRole" ] } ] }

在此政策範例中,已將 iam:PassRole 許可授與 myS3WriteAccessRole 角色。角色是使用角色的 Amazon Resource Name (ARN) 來指定。您也必須將此政策附加至使用者。如需詳細資訊,請參閱處理受管政策的相關文章

注意

Lambda 函數使用的是資源型政策,即是政策直接連接至 Lambda 函數本身。在建立叫用 Lambda 函數的規則時,並不會傳送角色,因此建立該規則的使用者不需擁有 iam:PassRole 許可。如需 Lambda 函數授權的詳細資訊,請參閱管理許可:使用 Lambda 函數政策

使用權杖來指派角色給使用者

針對透過 Amazon Cognito 使用者集區登入的使用者,可以在由使用者集區指派的 ID 權杖中傳遞角色。這些角色會出現在 ID 權杖的下列宣告中:

  • cognito:preferred_role 宣告是角色 ARN。

  • cognito:roles 宣告是以逗號分隔的字串,其中包含一組允許的角色 ARNs。

宣告設定如下:

  • cognito:preferred_role宣告設定為具有最高 (最小) Precedence 值的群組中的角色。如果只有一個允許的角色,則 cognito:preferred_role會設定為該角色。如果有多個角色,而沒有任何角色具有最高優先順序,則不會設定此宣告。

  • 如果至少有一個角色,就會設定 cognito:roles宣告。

使用權杖來指派角色時,如果有多個角色可以指派給使用者,Amazon Cognito 身分集區 (聯合身分) 會依下列方式來選擇角色:

  • 如果GetCredentialsForIdentityCustomRoleArn參數已設定且與cognito:roles宣告中的角色相符,請使用 參數。如果此參數不符合 cognito:roles中的角色,則拒絕存取。

  • 如果已設定 cognito:preferred_role宣告,則加以使用。

  • 如果未設定cognito:preferred_role宣告、已設定cognito:roles宣告,且未在呼叫 中CustomRoleArn指定 GetCredentialsForIdentity,則主控台或 AmbiguousRoleResolution 欄位 (在 SetIdentityPoolRolesRoleMappings 參數中API) 中的角色解析設定會用來決定要指派的角色。

使用以規則為基礎的映射來指派角色給使用者

規則可讓您將身分提供者權杖的宣告對應至IAM角色。

每個規則都會指定權杖宣告 (例如來自 Amazon Cognito 使用者集區的 ID 權杖中的使用者屬性)、比對類型、值和IAM角色。相符類型可以是 EqualsNotEqualStartsWithContains。如果使用者有符合宣告的值,則當使用者取得登入資料時,即可擔任該角色。例如,您可以建立規則,為自訂custom:dept屬性值為 的使用者指派特定IAM角色Sales

注意

在規則設定中,自訂屬性需要 custom:字首來將其與標準屬性區分。

除非CustomRoleArn指定 覆寫順序,否則會依序評估規則,並使用第一個相符規則IAM的角色。如需 Amazon Cognito 使用者集區中的使用者屬性詳細資訊,請參閱使用使用者屬性

您可以在身分集區 (聯合身分) 主控台中,針對身分驗證供應商設定多個規則。規則會依序套用。您可以曳規則來變更順序。第一個相符的規則優先。如果相符類型為 NotEqual,且宣告不存在,則不會評估規則。如果沒有規則相符,則會將 角色解析 設定套用至 使用預設的已驗證角色拒絕

在 API和 中CLI,您可以指定在RoleMapping類型 AmbiguousRoleResolution 欄位中沒有規則相符時要指派的角色,其在 SetIdentityPoolRolesRoleMappings 參數中指定API。

若要在 Amazon Cognito 主控台中將規則型映射新增至身分提供者,請新增或更新 IdP,然後選取在角色選取 下選擇具有規則的角色。您可以從該處新增規則,將提供者宣告對應至IAM角色。

您可以在 或使用 RoleMapping類型的 AWS CLI API RulesConfiguration 欄位為身分提供者設定規則型映射。您可以在 RoleMappings SetIdentityPoolRoles 參數中指定此欄位API。

例如,下列 AWS CLI 命令新增規則,將角色指派給您 Sacramento 位置中經過 OIDC IdP 身分驗證arn:aws:iam::123456789012:role/Sacramento_team_S3_admin的使用者arn:aws:iam::123456789012:oidc-provider/myOIDCIdP

aws cognito-identity set-identity-pool-roles --region us-east-1 --cli-input-json file://role-mapping.json

role-mapping.json 的內容

{ "IdentityPoolId": "us-east-1:12345678-corner-cafe-123456790ab", "Roles": { "authenticated": "arn:aws:iam::123456789012:role/myS3WriteAccessRole", "unauthenticated": "arn:aws:iam::123456789012:role/myS3ReadAccessRole" }, "RoleMappings": { "arn:aws:iam::123456789012:oidc-provider/myOIDCIdP": { "Type": "Rules", "AmbiguousRoleResolution": "AuthenticatedRole", "RulesConfiguration": { "Rules": [ { "Claim": "locale", "MatchType": "Equals", "Value": "Sacramento", "RoleARN": "arn:aws:iam::123456789012:role/Sacramento_team_S3_admin" } ] } } } }

針對每個使用者集區,或是您為身分集區設定的其他身分驗證供應商,最多可以建立 25 個規則。此限制不可調整。如需詳細資訊,請參閱 Amazon Cognito 中的配額

要用在以規則為基礎之映射中的宣告

Amazon Cognito

Amazon Cognito ID 權杖以 JSON Web 權杖 () 表示JWT。權杖中包含已驗證使用者身分的相關宣告,例如 namefamily_namephone_number。如需標準宣告的詳細資訊,請參閱 OpenID Connect 規格。除了標準宣告,Amazon Cognito 還有下列專屬的其他宣告:

  • cognito:groups

  • cognito:roles

  • cognito:preferred_role

Amazon

下列宣告及這些宣告的可能值可用於 Login with Amazon:

  • iss:www.amazon.com

  • aud:應用程式 ID

  • sub:來自 Login with Amazon 權杖的 sub

Facebook

下列宣告及這些宣告的可能值可用於 Facebook:

  • iss:graph.facebook.com

  • aud:應用程式 ID

  • sub:來自 Facebook 權杖的 sub

Google

Google 權杖包含來自 OpenID Connect 規格的標準宣告。OpenID 權杖中的所有宣告都可用於以規則為基礎的對應。請參閱 Google 的 OpenID Connect 網站,以了解來自 Google 權杖的可用宣告。

Apple

Apple 權杖包含來自 OpenID Connect 規格的標準宣告。請參閱 Apple 文件中的 Authenticating Users with Sign in with Apple,以進一步了解來自 Apple 權杖的可用宣告。Apple 的權杖並非一定會包含 email

OpenID

OpenID 權杖中的所有要求都適用於以規則為基礎的對應。如需標準宣告的詳細資訊,請參閱 OpenID Connect 規格。請參閱您的 OpenID 供應商說明文件,以了解任何可用的其他宣告。

SAML

宣告是從收到的SAML宣告剖析。SAML 宣告中提供的所有宣告都可以用於規則型映射。

以角色為基礎的存取控制最佳實務

重要

如果最終使用者可以修改您對應至角色的宣告,則任何最終使用者都可以擔任您的角色,並依情況設定政策。請只將無法由最終使用者直接設定的宣告對應至具有更高許可的角色。在 Amazon Cognito 使用者集區中,您可以依每個應用程式來設定每個使用者屬性的讀取和寫入許可。

重要

如果您為 Amazon Cognito 使用者集區中的群組設定角色,將會透過使用者的 ID 權杖來剖析這些角色。若要使用這些角色,身分集區的已驗證角色選項必須設定 Choose role from token (從權杖選擇角色)

您可以使用主控台中的角色解析設定和 的 RoleMappings 參數SetIdentityPoolRolesAPI,指定無法從權杖判斷正確角色時的預設行為。