我的应用程序允许用户从浏览器直接访问 DynamoDB。他们可以查看和编辑他们知道分区键 (UUID) 的任何记录。
我的问题是用户可以通过"编辑"不存在的分区键来创建新记录。有没有办法使用 IAM 策略来防止这种情况?
您需要使用 AWS Cognito 为您的 DynamoDB 表构建精细的访问控制。
您可以使用带有 Lambda 的代码来完成此操作,您需要在代码中编写所有授权逻辑。
对细粒度授权的引用:
它还包括行级授权以及与 AWS Cognito 合并的表级授权。
https://aws.amazon.com/blogs/mobile/building-fine-grained-authorization-using-amazon-cognito-user-pools-groups/
希望对您有所帮助。
编辑1:
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 策略以阻止用户创建新记录的所有权限引用。
条件更新:
编辑现有项目的属性,或向表添加新项目 如果尚不存在。您可以放置、删除或添加属性 值。您还可以对现有项目执行条件更新 (如果不存在,请插入新的属性名称-值对,或者 替换现有的名称-值对(如果它有一定的预期) 属性值)。
可以使用 ConditionExpression 仅在满足特定条件时才执行更新。由于所有项都必须具有哈希键(主键),因此可以使用 ConditionExpression 仅在哈希键存在时才执行更新,这仅适用于现有项。因此,UpdateItem 只会更新现有项目,而不会创建新项目。
例如:
ConditionExpression: 'attribute_exists(myHashKey)'