AWS DynamoDB教程之七:DynamoDB的访问控制


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

AWS DynamoDB
AWS DynamoDB

AWS DynamoDB系列教程:

基本操作步骤

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}"
    ]
  }
}

文章作者: 逻思
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 逻思 !