作为AWS众多云服务的核心成员之一,DynamoDB得到了非常广泛的应用。下面就通过一系列教程来介绍一下如何通过AWS SDK来操作DynamoDB。本次主要介绍如何对DynamoDB中的数据进行访问控制。

AWS DynamoDB
AWS DynamoDB系列教程:
- AWS DynamoDB系列之一:简介
- AWS DynamoDB教程之二:主键的设计及GSI
- AWS DynamoDB系列之三:Streams
- AWS DynamoDB系列之四:在Node.js中访问DynamoDB
- AWS DynamoDB系列之五:在本地安装DynamoDB
- AWS DynamoDB教程之六:如何使用APIGateway Service Proxy访问DynamoDB数据
- AWS DynamoDB教程之七:DynamoDB的访问控制
- AWS DynamoDB教程之八:数据备份/恢复及导出
- AWS DynamoDB教程之九:性能监测和调优,Audit Table及TTL
基本操作步骤
1)在IAM中定义相应的role,并创建关联的policies
2)针对特定用户,关联相应的role
3)使用该用户登录并访问受限资源
创建一个只能访问特定行的policy
选择IAM > Policy > Create
定义一个policy,允许用户对ScoreTable中PK为9901的行进行BatchGetItem,GetItem,Query操作。
json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"dynamodb:BatchGetItem",
"dynamodb:GetItem",
"dynamodb:Query"
],
"Resource": "arn:aws:dynamodb:eu-west-1:xxxxxxxx:table/ScoreTable>",
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:LeadingKeys": "9901"
}
}
}
]
}
创建允许读取表元数据的policy
同时允许对所有表进行DescribeTable,ListTables操作。
json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"dynamodb:DescribeTable",
"dynamodb:ListTable"
],
"Resource": "*"
}
]
}
对列进行访问控制
控制对列的访问需要使用Attribute Condition
json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"dynamodb:BatchGetItem",
"dynamodb:GetItem",
"dynamodb:Query"
],
"Resource": "arn:aws:dynamodb:eu-west-1:xxxxxx:table/ScoreTable",
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:Attributes": [
"studentId",
"subject",
"score"
]
},
"StringEqualsIfExists": {
"dynamodb:Select": "SPECIFIC_ATTRIBUTES"
}
}
}
]
}
在应用了这个policy到指定用户之后,还需要在客户端代码中通过ProjectionExpression通知DynamoDB,该用户只需要访问特定的属性:
python
table.query(
ProjectionExpression="studentId,subject,score",
KeyConditionExpression=Key('studentId').eq('9901')
)
将对行和列的访问控制组合在一起
json
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:Attributes": [
"studentId",
"subject",
"score"
],
"dynamodb:LeadingKeys": "9901"
},
"StringEqualsIfExists": {
"dynamodb:Select": "SPECIFIC_ATTRIBUTES"
}
}
注意事项
在使用对列控制的policy时,尽量避免使用Deny类型的policy。其原因在于:如果deny column 1,column 2,那么在增加一个新的列时,其默认是可以访问的,这就可能存在安全隐患。
甚至可以和Cognito结合控制访问
json
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:LeadingKeys": [
"${cognito-identity.amazonaws.com:sub}"
]
}
}