当使用Cognito用户池登录时,我很难理解如何在DynamoDB上使用细粒度访问控制。我一直在关注医生并在谷歌上搜索,但由于某种原因,我似乎无法让它发挥作用。
下面列出了我的AWS设置。如果我删除角色策略中的条件,我可以获得和放置没有问题的项目,所以条件似乎就是问题所在。但我不知道如何或在哪里调试依赖于已验证身份的策略——哪些变量可用,它们的值是什么,等等。
如有任何帮助,我们将不胜感激!
DynamoDB表
- 表名:文档
- 主分区键:userID(字符串)
- 主要排序关键字:docID(字符串)
DynamoDB示例行
{
"attributes": {},
"docID": "0f332745-f749-4b1a-b26d-4593959e9847",
"lastModifiedNumeric": 1470175027561,
"lastModifiedText": "Wed Aug 03 2016 07:57:07 GMT+1000 (AEST)",
"type": "documents",
"userID": "4fbf0c06-03a9-4cbe-b45c-ca4cd0f5f3cb"
}
Cognito用户池用户
- 用户状态:已启用/已确认
- MFA状态:禁用
- sub:4fbf0c06-03a9-4cbe-b45c-ca4cd0f5f3cb
- 电子邮件验证:true
"RoleName"的角色策略
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:PutItem"
],
"Resource": [
"arn:aws:dynamodb:ap-southeast-2:NUMBER:table/documents"
],
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:LeadingKeys": [
"${cognito-identity.amazonaws.com:sub}"
]
}
}
}
]
}
从cognitoUser.getUserAttributes()返回的登录信息
attribute sub has value 4fbf0c06-03a9-4cbe-b45c-ca4cd0f5f3cb
attribute email_verified has value true
attribute email has value ****@****com
错误消息
Code: "AccessDeniedException"
Message: User: arn:aws:sts::NUMBER:assumed-role/ROLE_NAME/CognitoIdentityCredentials is not authorized to perform: dynamodb:GetItem on resource: arn:aws:dynamodb:ap-southeast-2:NUMBER:table/documents
策略变量"${cognito-identity.amazonaws.com:sub}"
不是从Cognito用户池中获得的用户子。事实上,当您将Cognito用户池中的用户与联合身份服务联合时,Cognito联合身份服务会生成用户的身份id。
由于"${cognito-identity.amazonaws.com:sub}"
中的值永远不会与DynamoDB行中的值匹配,因此它将以AccessDenied失败。要做到这一点,Dynamo条目中的userId
实际上应该是标识id,而不是sub。目前,IAM策略变量和Cognito用户池服务之间没有直接链接。
这里有一些文档链接可能会有所帮助
1.Cognito Federated Identity Service的IAM角色
2.将用户池与Cognito联合身份服务集成
添加到Chetan的答案中:
目前,IAM策略变量和Cognito用户池服务之间没有直接链接。
截至2023年8月(但我相信这在更早的时候是可能的),这种说法已不再成立。
相反,确实可以通过PrincipalTag将IAM策略变量映射到Cognito用户池属性(标准和自定义)。
是的,你可以做到:
- 使用默认或自定义映射创建AWS::Cognito::IdentityPoolPrincipalTag:
username
(标签密钥)->sub
(索赔)
- 在IAM策略中使用
${aws:PrincipalTag/username}
:
{
"Version": "2012-10-17",
"Statement": [
{
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:LeadingKeys": [
"${aws:PrincipalTag/username}"
]
}
},
"Action": [
"dynamodb:GetItem",
"dynamodb:PutItem"
],
"Resource": "arn:aws:dynamodb:[REGION]:[ACCOUNT]:table/[TABLE]",
"Effect": "Allow"
}
]
}
上面的IAM片段将允许对DynamoDB表项进行细粒度访问。例如:
具有sub
属性4fbf0c06-03a9-4cbe-b45c-ca4cd0f5f3cb
的Cognito用户池用户能够访问具有值4fbf0c06-03a9-4cbe-b45c-ca4cd0f5f3cb
的主键userID
的项目。
你可以在我对类似问题的回答中看到细节。