DynamoDB细粒度访问控制:是否可以使用${cognito-identity.amazonaws.com:email}?

3

我的用户拥有Cognito账号。

根据这篇文章的说法,我们可以使用以下策略限制对DynamoDB API的访问:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetItem",
                "dynamodb:PutItem",
                "dynamodb:Query"
            ],
            "Resource": [
                "arn:aws:dynamodb: <REGION>:<AWS_ACCOUNT_ID>:table/<TABLE>"
            ],
            "Condition": {
                "ForAllValues:StringEquals": {
                    "dynamodb:LeadingKeys": [
                        "${cognito-identity.amazonaws.com:sub}"
                    ]
                }
            }
        }
    ]
}

如果索引键是email(并且主排序键是utc),那么对于我的情况来说,看起来非常简单,因此我将上面的示例调整为以下内容:

    {
        "Effect": "Allow",
        "Action": "dynamodb:UpdateItem",
        "Resource": "arn:aws:dynamodb:us-east-1:123456789123:table/history",
        "Condition": {
            "ForAllValues:StringEquals": {
                "dynamodb:LeadingKeys": [
                    "${cognito-identity.amazonaws.com:email}"
                ],
                "dynamodb:Attributes": [
                    "email",
                    "utc",
                    "updated",
                    "isNew"
                ]
            }
        }

但是我一直收到错误信息 AccessDeniedException: User: arn:aws:sts :: 9876543210:assumed-role / policyname / CognitoIdentityCredentials未被授权执行:dynamodb:UpdateItem对资源:arn:aws:dynamodb:us-east-1:123456789123:table / history

我尝试使用*权限进行js http调用,并且它能够正常工作,因此问题只存在于该策略中。

2个回答

2

我在这个帖子中发现,我可以使用
${cognito-idp.us-east-1.amazonaws.com:sub}
这不是电子邮件,但将来我可以使用此 sub 列出用户。详见


你为了让 ${cognito-idp.us-east-1.amazonaws.com:sub} 起作用,做了什么特别的吗?我有一个来自 Cognito 用户池的 IdToken,它被发送到具有 Cognito 授权者的 ApiGateway。映射模板可用于将用户 sub 设置为发送到 DynamoDB 的消息的一部分,但检查用户是否被允许写入使用 ${cognito-idp.us-east-1.amazonaws.com:sub} 的行的策略不起作用。如果我将其硬编码为用户的子级,则一切正常。所以可能是此表达式没有返回任何内容或出现了某些问题... - TheCutter
我遇到了相同的问题,当IAM主要密钥策略为${cognito-idp.us-east-1.amazonaws.com:sub}或${cognito-idp.us-east-1.amazonaws.com/us-east-1_XXXX:sub}时,使用UserPool Id向Dynamodb写入被拒绝。 - Jonathan Dunlap
我已经从一个 AWS 开发成员那里得到了关于这个话题的答案。请在这里看一下:https://forums.aws.amazon.com/thread.jspa?threadID=305485 - TheCutter

1

${cognito-identity.amazonaws.com:email} 不是一个有效的策略变量。它不能解析为用户的电子邮件地址。

这很遗憾,因为大多数开发人员(像您一样)会发现使用用户的电子邮件地址比使用 cognito-identity.amazonaws.com:subcognito-identity.amazonaws.com:aud 更直观。


我认为电子邮件地址是用户的良好唯一标识。现在,我需要创建一个新表格并使用另一个哈希键或使用API Gateway与Lambda :( - Vitaly Zdanevich
没错。也许可以在 AWS 支持中提出此问题。也许有一天他们会添加这个功能。 - F_SO_K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接