本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
IAM 角色
建立身分集區時,系統會提示您更新使用者擔任IAM的角色。IAM 角色的運作方式如下:當使用者登入您的應用程式時,Amazon Cognito 會為使用者產生臨時 AWS 憑證。這些臨時憑證會與特定IAM角色相關聯。使用 IAM角色,您可以定義一組存取 資源 AWS 的許可。
您可以為已驗證和未驗證的使用者指定預設IAM角色。此外,您也可以定義規則,以依據使用者 ID 權杖中的聲明,為每個使用者選擇角色。如需詳細資訊,請參閱使用以角色為基礎的存取控制。
根據預設,Amazon Cognito 主控台會建立IAM角色,提供對 Amazon Mobile Analytics 和 Amazon Cognito Sync 的存取。或者,您可以選擇使用現有IAM角色。
修改IAM角色以允許或限制對其他 服務的存取。若要這麼做,請登入IAM主控台
注意
根據最佳實務,請定義遵循授予最低權限原則的政策。換言之,政策僅包含使用者執行任務所需要的許可。如需詳細資訊,請參閱 IAM 使用者指南 中的授予最低權限。
請記住,未登入您應用程式的使用者會擔任未驗證的身分。一般而言,您指派給未驗證身分的許可,應該比已驗證身分的許可更具限制性。
設定信任政策
Amazon Cognito 使用 IAM角色來產生應用程式的使用者的臨時憑證。對許可的存取權是由角色的信任關係來控制。進一步了解 角色信任和許可。
呈現給 的權杖由身分集區 AWS STS 產生,該集區會將使用者集區、社交或OIDC提供者權杖或SAML聲明轉譯為其自己的權杖。身分集區權杖包含身分集區 ID 的 aud
宣告。
下列範例角色信任政策允許聯合服務主體cognito-identity.amazonaws.com
呼叫 AWS STS API AssumeRoleWithWebIdentity
。只有在請求中的身分集區權杖具有下列宣告時,API請求才會成功。
-
身分集區識別碼
us-west-2:abcdefg-1234-5678-910a-0e8443553f95
的aud
宣告。 -
當使用者已登入且不是來賓使用者時,新增的
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
-
將角色限制為
authenticated
或unauthenticated
(訪客) 使用者。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 檢查原始身分集區是否與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
條件,將動作限制為存取政策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 會在背景中提出AssumeRoleWithWebIdentity
API請求。在此請求中的參數中,Amazon Cognito 包括以下內容。
-
使用者的身分 ID。
-
您的使用者想要擔任IAM的角色ARN的 。
-
加上內嵌工作階段政策的
policy
參數。 -
其值為 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 |
|
Amazon SageMaker |
|
Amazon Textract |
|
Amazon Sumerian |
|
Amazon Location Service |
|
若要授予 AWS 服務 超出此清單的 存取權,請在您的身分集區中啟用基本 (傳統) 身分驗證流程。如果您的使用者看到IAM未驗證使用者角色的指定政策允許NotAuthorizedException
AWS 服務 錯誤,請評估您是否可以從使用案例中移除該服務。如果不能,請切換至基本流程。
訪客使用者的內嵌工作階段政策
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 資源的存取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}/*"] }] }
角色信任和許可
這些角色的不同之處,在於其信任關係。以下為未驗證的角色的範例信任政策:
{ "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 GetOpenIdToken
API操作所發出之權杖的多值amr
宣告其中一個陣列成員具有 值 unauthenticated
。
當 Amazon Cognito 建立權杖時,會將權杖的 amr
設為 unauthenticated
或 authenticated
。如果 amr
是 authenticated
,該權杖包括身分驗證期間使用的任何供應商。這表示,您只要將 amr
條件變更如下,即可建立只信任透過 Facebook 登入之使用者的角色:
"ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "graph.facebook.com" }
在變更角色的信任關係時,或是嘗試跨身分集區使用角色時,請小心謹慎。如果您未正確設定角色來信任身分集區,STS則結果的例外狀況如下:
AccessDenied -- Not authorized to perform sts:AssumeRoleWithWebIdentity
如果您看到此訊息,請檢查您的身分集區和身分驗證類型是否有適當的角色。