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 不允許從身分集區到缺少此類型條件之IAM角色的跨帳戶AssumeRoleWithWebIdentity操作。

本主題包含限制身分集區的來源身分的多種條件。如需完整清單,請參閱 AWS Web 身分聯合的可用金鑰

在基本或傳統身分集區的身分驗證中, AWS STS 如果具有正確的信任政策,您可以使用 擔任任何IAM角色。IAM Amazon Cognito 身分集區的角色信任服務主體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 這是身分集區中的使用者身分 ID。此值不是來自使用者原始身分提供者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 檢查原始身分集區是否 AWS 帳戶 與IAM角色相同。如果 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條件,將動作限制為存取政策IDs中的 Amazon Cognito 身分。請謹慎使用此選項,尤其是針對缺少一致使用者 ID 的未驗證身分。如需使用 Amazon Cognito 進行 Web 聯合IAM的政策變數的詳細資訊,請參閱 AWS Identity and Access Management 使用者指南 中的 IAM和 AWS STS 條件內容金鑰

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

注意

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

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

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

  1. 使用者的身分 ID。

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

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

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

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

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

類別 服務

分析

Amazon Data 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 1

資料庫

Amazon DynamoDB

Amazon SimpleDB

前端 Web 與行動裝置

AWS AppSync

Amazon Location Service

Amazon Simple Notification Service

Amazon Pinpoint

Amazon Location Service

遊戲開發

Amazon GameLift

物聯網 (IoT)

AWS IoT

機器學習

Amazon CodeWhisperer

Amazon Comprehend

Amazon Lex

Amazon Machine Learning

Amazon Personalize

Amazon Polly

Amazon Rekognition

Amazon SageMaker1

Amazon Textract¹

Amazon Transcribe

Amazon Translate

管理與治理

Amazon CloudWatch

Amazon CloudWatch Logs

聯網與內容交付

Amazon API Gateway

安全、身分與合規

Amazon Cognito 使用者集區

儲存

Amazon Simple Storage Service

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

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

Encrypt

Decrypt

ReEncrypt

GenerateDataKey

Amazon SageMaker

InvokeEndpoint

Amazon Textract

DetectDocumentText

AnalyzeDocument

Amazon Sumerian

View*

Amazon Location Service

SearchPlaceIndex*

GetPlace

CalculateRoute*

*Geofence

*Geofences

*DevicePosition*

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

訪客使用者的內嵌工作階段政策

Amazon Cognito 會先在IAM憑證請求中套用內嵌政策。內嵌工作階段政策會限制使用者的有效許可,無法包含下列清單以外的任何 AWS 服務 的存取。您也必須在套用至使用者IAM角色的政策 AWS 服務 中授予這些許可。使用者對於擔任角色工作階段的有效許可,是指派給其角色的政策及其工作階段政策的交集。如需詳細資訊,請參閱 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角色的政策中授予此許可。使用者對擔任角色工作階段的有效許可是指派給其角色IAM的政策及其工作階段政策的交集。如需詳細資訊,請參閱 AWS Identity and Access Management 使用者指南中的工作階段政策

如需此 AWS 受管政策和其他工作階段政策的淨效果概觀,請參閱 未經身分驗證的使用者可存取的服務

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

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "rum:PutRumEvents", "polly:*", "comprehend:*", "translate:*", "transcribe:*", "rekognition:*", "mobiletargeting:*", "firehose:*", "personalize:*", "sagemaker:InvokeEndpoint", "geo:GetMap*", "geo:SearchPlaceIndex*", "geo:GetPlace", "geo:CalculateRoute*", "geo:*Geofence", "geo:*Geofences", "geo:*DevicePosition*" ], "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:::amzn-s3-demo-bucket/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:::amzn-s3-demo-bucket/us-east-1:12345678-1234-1234-1234-123456790ab 中的物件。不過,該身分不會獲授予 arn:aws:s3:::amzn-s3-demo-bucket 中其他物件的存取權。

{ "Version": "2012-10-17", "Statement": [ { "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::amzn-s3-demo-bucket"], "Condition": {"StringLike": {"s3:prefix": ["${cognito-identity.amazonaws.com:sub}/*"]}} }, { "Action": [ "s3:GetObject", "s3:PutObject" ], "Effect": "Allow", "Resource": ["arn:aws:s3:::amzn-s3-demo-bucket/${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 開發人員指南中的使用 控制對 Amazon Kinesis Data Streams 資源的存取IAMAmazon 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}/*"] }] }

角色信任和許可

這些角色的不同之處,在於其信任關係。以下為未驗證的角色的範例信任政策:

{ "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": "unauthenticated" } } } ] }

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

當 Amazon Cognito 建立權杖時,會將權杖的 amr 設為 unauthenticatedauthenticated。如果 amrauthenticated,該權杖包括身分驗證期間使用的任何供應商。這表示,您只要將 amr 條件變更如下,即可建立只信任透過 Facebook 登入之使用者的角色:

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

在變更角色的信任關係時,或是嘗試跨身分集區使用角色時,請小心謹慎。如果您未正確設定角色以信任身分集區,STS則結果的例外狀況如下:

AccessDenied -- Not authorized to perform sts:AssumeRoleWithWebIdentity

如果您看到此訊息,請檢查您的身分集區和身分驗證類型是否有適當的角色。