AWS身份和访问管理(IAM)是否提供了一种方法,让用户只能编辑或删除他之前添加的Amazon DynamoDB表中的项目?
这是在AWS为Amazon DynamoDB添加细粒度访问控制后实现的,这有助于AWS身份和访问管理(IAM)策略来规范对DynamoDB表中存储的项目和属性的访问。
这篇介绍性的博客文章展示了这个特性的卓越粒度,以及对许多现实世界用例的简化:
- Horizontal -您可以通过匹配哈希键值来选择性地隐藏或公开特定表中的特定DynamoDB项
- 垂直 -您可以通过匹配属性名称来选择性地隐藏或公开特定表中所有DynamoDB项的特定属性
- 组合 -您可以在同一策略中执行水平和垂直控制
有关确定谁可以访问AmazonDynamoDB表和索引中的单个数据项和属性以及可以对其执行的操作的功能的更多详细信息,请参阅AmazonDynamo数据库的细粒度访问控制。
- 这还包括一个具体的例子,说明如何在AmazonDynamoDB表的主键中包括用户id,以及此后根据调用用户通过适当的IAM条件水平和垂直隐藏信息
附录
Werner Vogels的《利用DynamoDB的细粒度访问控制简化移动应用程序数据管理:》也强调了这一新功能的深远影响
使用细粒度访问控制,我们通过使您能够编写访问策略来解决此问题,这些策略包括描述额外级别的过滤和控制的条件。这消除了对代理层的需要,简化了应用程序堆栈,并节省了成本。
[…]
随着今天的发布,在移动设备上运行的应用程序可以将工作负载发送到DynamoDB表、行甚至列,而无需经过中间的代理层。[…]此功能允许在移动设备上运行的应用程序仅修改属于特定用户的行。此外,通过将用户的数据整合到DynamoDB表中,您可以大规模获得对用户群的实时见解,而无需使用昂贵的联接和批处理方法(如分散/聚集)。
我很确定你的问题的答案是肯定的。您可能必须使用AWS Cognito,其背后有IAM角色策略。
您可能需要对此进行一些处理,但如果您添加以下策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:Scan",
"dynamodb:UpdateItem"
],
"Resource": [
"arn:aws:dynamodb:ap-southeast-2: NUMBER:table/myapplication_product"
],
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:LeadingKeys": [
"${cognito-identity.amazonaws.com:sub}"
]
}
}
}
]
}
首先,这将限制对dynamodb资源的访问仅限于命名的方法,但"Condition"块将额外限制对与您试图更改的哈希键匹配的标识的访问-显然,这不会影响扫描(仅影响GetItem和UpdateItem)。现在,你到底是如何匹配这些钥匙的,这就是我提到的技巧,但解决方案就在那里。希望这能有所帮助。
我认为这是不可能的。IAM角色基本上控制客户端可以进行哪些API调用。一旦客户端获得执行操作的权限,DynamoDB就不会记录该操作并将其附加到客户端。
如果你需要这种行为,你可能应该在你的表中保留一个属性,该属性会更新一些关于用户进行操作的元数据。
您可以添加一个IAM用户,该用户被限制为PutItem/UpdateItem/DeleteItem DynamoDB操作,并且被ARN限制为特定的表。请参阅使用IAM控制对Amazon DynamoDB资源的访问。
您可以在IAM策略中为除ListTables之外的所有Amazon DynamoDB操作使用资源级别ARN。
然而,没有内置的方法可以将表更新限制为"创建表的用户",但我想你可以在创建表时编写脚本。