IAM 角色 - Amazon Cognito

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

IAM 角色

建立身分集區時,系統會提示您更新使用者所擔任的 IAM 角色。IAM 角色的運作方式如下:當使用者登入您的應用程式時,Amazon Cognito 會為使用者產生臨時 AWS 登入資料。這些暫時登入資料會與特定 IAM 角色建立關聯。使用 IAM 角色,您可以定義一組許可以存取資 AWS 源。

您可以為已驗證和未驗證的使用者指定預設的 IAM 角色。此外,您也可以定義規則,以依據使用者 ID 權杖中的聲明,為每個使用者選擇角色。如需詳細資訊,請參閱 使用以角色為基礎的存取控制

Amazon Cognito 主控台預設會建立 IAM 角色,可存取 Amazon Mobile Analytics 和 Amazon Cognito Sync。或者,您也可以選擇使用現有 IAM 角色。

修改 IAM 角色以允許或限制存取其他服務。若要執行此作業,請登入 IAM 主控台。然後選取 Roles (角色),再選取角色。附屬於所選角色的政策列示在 Permissions (許可) 索引標籤中。您可以選取對應的 Manage Policy (管理政策) 連結,以自訂存取政策。若要進一步了解如何使用及定義政策,請參閱 IAM 政策概觀

注意

根據最佳實務,請定義遵循授予最低權限原則的政策。換言之,政策僅包含使用者執行任務所需要的許可。如需詳細資訊,請參閱《IAM 使用者指南》中的授予最低權限

請記住,未登入您應用程式的使用者會擔任未驗證的身分。一般而言,您指派給未驗證身分的許可,應該比已驗證身分的許可更具限制性。

設定信任政策

Amazon Cognito 使用 IAM 角色為您的應用程式使用者產生暫時憑證。對許可的存取權是由角色的信任關係來控制。進一步了解 角色信任和許可

所呈現的權杖 AWS STS 是由身分集區產生,該身分集區會將使用者集區、社交或 OIDC 提供者權杖或 SAML 判斷提供者權杖轉換為其自己的權杖。身分集區權杖包含身分集區 ID 的 aud 宣告。

下列範例角色信任原則允許同盟服務主cognito-identity.amazonaws.com體呼叫 AWS STS API AssumeRoleWithWebIdentity。只有在 API 請求中的身分集區權杖具有以下宣告時,請求才會成功。

  1. 身分集區識別碼 us-west-2:abcdefg-1234-5678-910a-0e8443553f95aud 宣告。

  2. 當使用者已登入且不是來賓使用者時,新增的authenticated amr 宣告。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "cognito-identity.amazonaws.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "cognito-identity.amazonaws.com:aud": "us-west-2:abcdefg-1234-5678-910a-0e8443553f95" }, "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "authenticated" } } } ] }

基本 (傳統) 身份驗證中 IAM 角色的信任政策

您必須至少套用一個條件,以限制與身分識別集區搭配使用之角色的信任原則。當您建立或更新身分識別集區的角色信任政策時,如果您嘗試儲存變更,但沒有至少一個限制來源身分的條件金鑰,IAM 會傳回錯誤訊息。 AWS STS 不允許跨帳戶AssumeRoleWithWebIdentity操作,從身分集區到缺少此類型條件的 IAM 角色。

本主題包含數個限制身分識別集區之來源身分識別的條件。如需完整清單,請參閱 AWS Web 身分同盟的可用金鑰

在具有身分集區的基本或傳統身份驗證中, AWS STS 如果具有正確的信任策略,則可以承擔任何 IAM 角色。Amazon Cognito 身分識別集區的 IAM 角色會信任服務主體cognito-identity.amazonaws.com擔任該角色。此組態不足以保護您的 IAM 角色,以防止非預期的資源存取。此類型的角色必須將其他條件套用至角色信任原則。如果沒有下列條件之一,您就無法建立或修改身分識別集區的角色。

cognito-identity.amazonaws.com:aud

將角色限制為來自一或多個識別集區的作業。Amazon Cognito 會指出身分集區權杖中aud宣告中的來源身分集區。

cognito-identity.amazonaws.com:amr

將角色限制為authenticatedunauthenticated (訪客) 使用者。Amazon Cognito 會指出身分集區權杖中amr宣告中的身分驗證狀態。

cognito-identity.amazonaws.com:sub

透過 UUID 將角色限制為一個或多個使用者。此 UUID 是身分集區中使用者的身分識別碼。此值不是來自使用者原始身分識別提供者的sub值。Amazon Cognito 在身分集區令牌的sub聲明中表示此 UUID。

增強流程身份驗證要求 IAM 角色與身分集區 AWS 帳戶 相同,但基本身份驗證並非如此。

其他考量適用於採用跨帳戶 IAM 角色的 Amazon Cognito 身分識別集區。這些角色的信任原則必須接受cognito-identity.amazonaws.com服務主體,必須包含特定cognito-identity.amazonaws.com:aud條件。為了防止意外存取您的 AWS 資源,aud條件索引鍵會將角色限制為使用者從條件值中的身分集區。

身分集區為身份發出的令牌包含有關身份集區來源 AWS 帳戶 的信息。當您在 AssumeRoleWithWebIdentityAPI 請求中顯示身分集區權杖時,請 AWS STS 檢查原始身分集區是否與 IAM 角色 AWS 帳戶 相同。如果 AWS STS 判斷要求是跨帳戶,它會檢查角色信任原則是否有aud條件。如果角色信任原則中沒有這樣的條件,則 assume-role 呼叫會失敗。如果請求不是跨帳戶,則不 AWS STS 會強制執行此限制。最佳作法是一律將此類型的條件套用至身分識別集區角色的信任原則。

其他信任政策條件

跨身分集區重複使用角色

若要跨多重身分集區重複使用角色 (因為這些集區共用一組通用的許可),您可以併入多個身分集區,如下所示:

"StringEquals": { "cognito-identity.amazonaws.com:aud": [ "us-east-1:12345678-abcd-abcd-abcd-123456790ab", "us-east-1:98765432-dcba-dcba-dcba-123456790ab" ] }
限制對特定身分的存取權

若要建立政策,並僅限用於一組特定的應用程式使用者,請勾選 cognito-identity.amazonaws.com:sub值:

"StringEquals": { "cognito-identity.amazonaws.com:aud": "us-east-1:12345678-abcd-abcd-abcd-123456790ab", "cognito-identity.amazonaws.com:sub": [ "us-east-1:12345678-1234-1234-1234-123456790ab", "us-east-1:98765432-1234-1234-1243-123456790ab" ] }
限制對特定供應商的存取權

若要建立政策,並僅限用於透過特定供應商 (可能是您自己的登入供應商) 登入的使用者,請勾選 cognito-identity.amazonaws.com:amr值:

"ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "login.myprovider.myapp" }

例如,只信任 Facebook 的應用程式會有下列 amr 子句:

"ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "graph.facebook.com" }

存取政策

您附加至角色的許可會套用至擔任該角色的所有使用者。若要將使用者的存取權分割,請使用政策條件和變數。如需詳細資訊,請參閱 IAM 政策元素:變數和標籤。您可以使用此 sub 條件,在存取政策中限制對 Amazon Cognito 身分 ID 的動作。請謹慎使用此選項,尤其是針對缺少一致使用者 ID 的未驗證身分。如需有關與 Amazon Cognito 進行網路聯合的 IAM 政策變數的詳細資訊,請參閱AWS Identity and Access Management 使用者指南中的 IAM 和 AWS STS 條件內容金鑰

為了提升安全性保護,Amazon Cognito 針對您在強化流程中指派未驗證的使用者,使用 GetCredentialsForIdentity 對憑證套用縮減規模政策。縮減規模政策會在您套用至未經身分驗證角色的 IAM 政策中新增 內嵌工作階段政策AWS 受管理工作階段。由於您必須同時針對角色和工作階段政策授予 IAM 政策的存取,因此縮減規模政策會限制使用者存取下列清單外的服務。

注意

在基本 (傳統) 流程中,您可以發出自己的 AssumeRoleWithWebIdentity API 請求,並將這些限制套用至請求。對於最佳安全實務,請勿將此縮減規模政策以上的任何許可指派給未經身分驗證的使用者。

Amazon Cognito 也可防止已驗證和未經驗證的使用者向 Amazon Cognito 身分集區和 Amazon Cognito Sync 發出 API 請求。其他 AWS 服務 可能會限制來自 Web 身分的服務存取。

在具有強化流程的成功請求中,Amazon Cognito 會在背景發出 AssumeRoleWithWebIdentity API 請求。在此請求中的參數中,Amazon Cognito 包括以下內容。

  1. 使用者的身分 ID。

  2. 您的使用者想要擔任的 IAM 角色。

  3. 加上內嵌工作階段政策policy 參數。

  4. 一種PolicyArns.member.N參數,其值為AWS 受管政策,可在 Amazon 中授予其他許可 CloudWatch。

未經身分驗證的使用者可存取的服務

使用強化流程時,Amazon Cognito 會縮小套用於使用者工作階段的政策範圍,防止使用者使用下列清單以外的任何其他服務。對於子服務,只允許特定的動作。

類別 服務

分析

Amazon 數據 Firehose

Amazon Managed Service for Apache Flink

應用程式整合

Amazon Simple Queue Service

擴增實境和虛擬實境

Amazon Sumerian¹

商業應用程式

Amazon Mobile Analytics

Amazon Simple Email Service

運算

AWS Lambda

密碼編譯和 PKI

AWS Key Management Service¹

資料庫

Amazon DynamoDB

Amazon SimpleDB

前端 Web 與行動裝置

AWS AppSync

Amazon Location Service

Amazon Simple Notification Service

Amazon Pinpoint

遊戲開發

Amazon GameLift

物聯網 (IoT)

AWS IoT

機器學習

Amazon CodeWhisperer

Amazon Comprehend

Amazon Lex

Amazon Machine Learning

Amazon Personalize

Amazon Polly

Amazon Rekognition

Amazon SageMaker ¹

Amazon Textract¹

Amazon Transcribe

Amazon Translate

管理與治理

Amazon CloudWatch

Amazon CloudWatch 日誌

聯網與內容交付

Amazon API Gateway

安全、身分與合規

Amazon Cognito 使用者集區

儲存

Amazon Simple Storage Service

¹ 對於下表 AWS 服務 中的,內嵌政策會授與動作的子集。表格會顯示每個子集中的可用動作。

AWS 服務 未經身分驗證的強化流程使用者的最大許可
AWS Key Management Service

Encrypt

Decrypt

ReEncrypt

GenerateDataKey

Amazon SageMaker

InvokeEndpoint

Amazon Textract

DetectDocumentText

AnalyzeDocument

Amazon Sumerian

View*

若要授與此清單以 AWS 服務 外的存取權,請在您的身分識別集區中啟動基本 (傳統) 驗證流程。如果您的使用者在 AWS 服務 看到 NotAuthorizedException 錯誤,而指派給 IAM 角色或未經身分驗證的使用者的政策允許此類服務,請評估您是否可以從使用案例中移除該服務。如果不能,請切換至基本流程。

內嵌工作階段政策

內嵌工作階段原則會限制使用者的有效權限,無法存取下列清單中的任何 AWS 服務 外部權限。您還必須 AWS 服務 在套用至使用者 IAM 角色的政策中授予這些許可。使用者對於擔任角色工作階段的有效許可,是指派給其角色的政策及其工作階段政策的交集。如需詳細資訊,請參閱 AWS Identity and Access Management 使用者指南中的工作階段政策

Amazon Cognito 會將下列內嵌政策新增至 AWS 區域 中使用者預設啟用的工作階段。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "cloudwatch:*", "logs:*", "dynamodb:*", "kinesis:*", "mobileanalytics:*", "s3:*", "ses:*", "sns:*", "sqs:*", "lambda:*", "machinelearning:*", "execute-api:*", "iot:*", "gamelift:*", "scs:*", "cognito-identity:*", "cognito-idp:*", "lex:*", "polly:*", "comprehend:*", "translate:*", "transcribe:*", "rekognition:*", "mobiletargeting:*", "firehose:*", "appsync:*", "personalize:*", "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "sagemaker:InvokeEndpoint", "cognito-sync:*", "sumerian:View*", "codewhisperer:*", "textract:DetectDocumentText", "textract:AnalyzeDocument", "sdb:*" ], "Resource": [ "*" ] } ] }

對於所有其他區域,內嵌範圍向下兼容規則會包含預設區域中列出的所有項目,但下列 Action 陳述式除外。

"cognito-sync:*", "sumerian:View*", "codewhisperer:*", "textract:DetectDocumentText", "textract:AnalyzeDocument", "sdb:*"

AWS 受管理工作階段原則

Amazon Cognito 也會使用  AWS  受管政策 AmazonCognitoUnAuthedIdentitiesSessionPolicy 將未經驗證使用者的許可範圍,限於增強型流程中未經驗證的使用者。您也必須在連接到未驗證 IAM 角色的政策中授予此許可。

AmazonCognitoUnAuthedIdentitiesSessionPolicy 受管政策具有下列許可。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "rum:PutRumEvents", "polly:*", "comprehend:*", "translate:*", "transcribe:*", "rekognition:*", "mobiletargeting:*", "firehose:*", "personalize:*", "sagemaker:InvokeEndpoint" ], "Resource": "*" }] }

存取政策範例

在本節中,您可以找到 Amazon Cognito 存取政策範例,這些政策會授予您的使用者執行特定操作所需的最低許可。您可以盡可能使用政策變數,進一步限制特定身分 ID 的許可。例如,使用 ${cognito-identity.amazonaws.com:sub}。如需詳細資訊,請參閱 AWS Mobile 部落格了解 Amazon Cognito 身分驗證第 3 部分:角色和政策

注意

基於安全最佳實務,政策應該只包含使用者執行任務所需的許可。這表示您應該盡可能嘗試一律限定個別身分才能存取物件。

授予身分對 Amazon S3 中的單一物件具有讀取存取權

下列存取政策會將讀取許可授予身分,以從指定的 S3 儲存貯體擷取單一物件。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:GetObject" ], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket/assets/my_picture.jpg"] } ] }

授予身分同時對 Amazon S3 中的身分特定路徑具有讀取和寫入存取權

下列存取政策將字首映射至 ${cognito-identity.amazonaws.com:sub} 變數,以授予讀取和寫入許可來存取 S3 儲存貯體中的特定字首 “folder”。

使用此政策,透過 ${cognito-identity.amazonaws.com:sub} 插入的身分 (例如 us-east-1:12345678-1234-1234-1234-123456790ab) 可取得、放入和列出 arn:aws:s3:::mybucket/us-east-1:12345678-1234-1234-1234-123456790ab 中的物件。不過,該身分不會獲授予 arn:aws:s3:::mybucket 中其他物件的存取權。

{ "Version": "2012-10-17", "Statement": [ { "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket"], "Condition": {"StringLike": {"s3:prefix": ["${cognito-identity.amazonaws.com:sub}/*"]}} }, { "Action": [ "s3:GetObject", "s3:PutObject" ], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket/${cognito-identity.amazonaws.com:sub}/*"] } ] }

將 Amazon DynamoDB 精細定義存取權指派給身分

以下存取政策使用 Amazon Cognito 環境變數,提供對 DynamoDB 資源的精細定義存取控制。這些變數依身分 ID 授予對 DynamoDB 中的項目的存取權。如需詳細資訊,請參閱《Amazon DynamoDB 開發人員指南》中的使用 IAM 政策條件進行精細定義存取控制

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem" ], "Resource": [ "arn:aws:dynamodb:us-west-2:123456789012:table/MyTable" ], "Condition": { "ForAllValues:StringEquals": { "dynamodb:LeadingKeys": ["${cognito-identity.amazonaws.com:sub}"] } } } ] }

授予身分許可以叫用 Lambda 函數

下列存取政策授予身分許可以叫用 Lambda 函數。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": [ "arn:aws:lambda:us-west-2:123456789012:function:MyFunction" ] } ] }

授予身分許可以發佈記錄到 Kinesis 資料串流

以下存取政策允許身分對任何 Kinesis Data Streams 使用 PutRecord 操作。它可以套用到需要將資料記錄新增至帳戶中所有串流的使用者。如需詳細資訊,請參閱《Amazon Kinesis Data Streams 開發人員指南》中的使用 IAM 控制對 Amazon Kinesis 資料串流資源的存取

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "kinesis:PutRecord", "Resource": [ "arn:aws:kinesis:us-east-1:111122223333:stream/stream1" ] } ] }

授予身分存取 Amazon Cognito Sync 存放區中的資料

以下存取政策授予身分許可只能存取他們自己在 Amazon Cognito Sync 存放區中的資料。

{ "Version": "2012-10-17", "Statement":[{ "Effect":"Allow", "Action":"cognito-sync:*", "Resource":["arn:aws:cognito-sync:us-east-1:123456789012:identitypool/${cognito-identity.amazonaws.com:aud}/identity/${cognito-identity.amazonaws.com:sub}/*"] }] }