【问题标题】:IAM Policy to prevent DynamoDB from creating records for UpdateItem防止 DynamoDB 为 UpdateItem 创建记录的 IAM 策略
【发布时间】:2018-09-01 03:23:13
【问题描述】:

我的应用程序允许用户从浏览器直接访问 DynamoDB。他们可以查看和编辑他们知道分区键(UUID)的任何记录。

我的问题是用户可以通过“编辑”不存在的分区键来创建新记录。有没有办法使用 IAM 政策来防止这种情况发生?

【问题讨论】:

    标签: amazon-dynamodb amazon-iam


    【解决方案1】:

    您需要使用 AWS Cognito 为您的 DynamoDB 表构建细粒度的访问控制。

    您可以使用带有 Lambda 的代码来做到这一点,您需要在代码中编写所有的授权逻辑。

    对细粒度授权的引用:

    它还包括行级授权和表级授权,与 AWS Cognito 合并。

    https://aws.amazon.com/blogs/mobile/building-fine-grained-authorization-using-amazon-cognito-user-pools-groups/

    希望对你有帮助。

    EDIT1:

    https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/api-permissions-reference.html

    dynamodb:PutItem 将阻止用户更新 dynamodb 记录。

    示例政策:

     {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Sid": "AllowAccessToOnlyItemsMatchingUserID",
                    "Effect": "Allow",
                    "Action": [
                        "dynamodb:GetItem",
                        "dynamodb:BatchGetItem",
                        "dynamodb:Query",
                        "dynamodb:UpdateItem"
                    ],
                    "Resource": [
                        "arn:aws:dynamodb:us-west-2:123456789012:table/TableName"
                    ]
                }
            ]
    }
    

    提供创建 IAM 策略以阻止用户创建新记录的所有权限参考。

    有条件更新:

    编辑现有项目的属性,或将新项目添加到表中 如果它不存在。您可以放置​​、删除或添加属性 价值观。您还可以对现有项目执行条件更新 (如果不存在,则插入一个新的属性名称-值对,或者 替换现有的名称-值对,如果它具有某些预期 属性值)。

    【讨论】:

    • 我没有使用 Lambda,这是从浏览器直接访问 DynamoDB。用户是公开的,因此我们无法在 Cognito 中为每个用户创建单独的记录。我的问题是是否可以配置 IAM 策略以防止在 DynamoDB 中创建新记录,同时允许编辑现有记录。
    • 如果您使用密钥从浏览器访问,您可以使用 IAM 策略控制该角色。更新答案。
    • 问题在于,如果您提供一个不存在的分区键作为要更新的项目,UpdateItem 也会创建一条新记录。
    • 执行条件更新,而不是直接更新,它不会插入新项目。
    • 但这是客户端的决定。我希望能够通过服务器端 IAM 策略来强制执行。
    【解决方案2】:

    您可以使用 ConditionExpression 仅在满足特定条件时才进行更新。由于所有项目都必须有一个哈希键(主键),因此您可以使用 ConditionExpression 仅在哈希键存在时才进行更新,这仅适用于现有项目。因此 UpdateItem 只会更新现有项目,不会创建新项目。

    例如:

    ConditionExpression: 'attribute_exists(myHashKey)'

    【讨论】:

    • 但是没有办法在 IAM 政策中强制执行这一点,对吧?因此,任何拥有凭据的人都可以创建新记录,而无需进行条件更新。
    • 抱歉,我明白你的意思,不,我不认为在 IAM 中有办法做到这一点。我能想到的最接近的方法是使用 LeadingKeys IAM 条件,以便用户只能创建或编辑哈希键以其用户 ID 开头的项目。
    猜你喜欢
    • 2012-05-18
    • 2020-07-21
    • 2020-06-11
    • 2018-04-13
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多