【问题标题】:How can I use IAM policies to gain fine-grained access control for DynamoDB?如何使用 IAM 策略来获得对 DynamoDB 的细粒度访问控制?
【发布时间】:2014-08-11 04:18:15
【问题描述】:

我目前正在尝试使用Amazon DynamoDB 直接在浏览器中使用AWS SDK for JavaScript in the Browser 创建一个完整的JavaScript 应用程序。 但是,我无法确保对 DynamoDB 的访问安全。

IAM 中,我使用此策略创建了一个名为Users 的组:

{
  "Version": "2012-10-17",
  "Statement": [{
      "Effect": "Allow",
      "Action": [
        "dynamodb:BatchGetItem",
        "dynamodb:BatchWriteItem",
        "dynamodb:DeleteItem",
        "dynamodb:GetItem",
        "dynamodb:PutItem",
        "dynamodb:Query",
        "dynamodb:UpdateItem"
      ],
      "Resource": ["arn:aws:dynamodb:eu-west-1:1234567891234:table/*"],
      "Condition": {
        "ForAllValues:StringEquals": {
          "dynamodb:LeadingKeys": ["${aws:username}"]}
    }
  }]
}

我有一个名为Bahaika 的用户属于Users 组。

在 DynamoDB 中,我创建了两个项目:

-------------------------
|  Dog ID  |   User Id  |
-------------------------
|   Dog1   |  Bahaika   |
-------------------------
|   Dog2   | NotBahaika |
-------------------------

当我使用 Bahaika 的 Access Key IDSecret Access Key 登录时,我希望只能获取 Dog1,而不是 Dog2。

我还想在将项目添加到表时自动添加User ID 属性。 最后,我希望能够列出 User ID 等于记录的表的所有项目。

我怎样才能做到这一点?

我已经读过Fine-Grained Access Control for DynamoDB 但我想我错过了一些东西。

【问题讨论】:

  • 什么不工作,当你以 Bahaika 的身份登录时,你看到两者或没有狗(听起来像前者,但要澄清一下)?
  • 我的两只狗都有一个AccessDenied。当我禁用该策略时,我可以访问所有狗。

标签: amazon-web-services amazon-dynamodb amazon-iam


【解决方案1】:

您的IAM Condition dynamodb:LeadingKeys 使用的是常规的IAM policy variable ${aws:username},在使用Web Identity Federation 时不存在,请参阅Request Information That You Can Use for Policy Variables 中的表格。相反,您需要使用Fine-Grained Access Control for DynamoDB 中引用的${www.amazon.com:user_id} 以及各种Example Policies for Fine-Grained Access Control

【讨论】:

  • 当我硬编码访问密钥 ID 和秘密访问密钥时,我是否使用了 Web Identity Federation?我不太了解dynamodb:LeadingKeys 的作用。以及如何在 IAM 控制台中找出用户的 user_id 是什么?
  • 啊,不,我忽略了这方面,并简单地得出结论,因为这是在浏览器中使用适用于 JavaScript 的 AWS 开发工具包进行任何读取操作的唯一安全方法,抱歉。您确定您只想获得对该表的读取权限,因此可能会冒着在您的 JavaScript 应用程序中硬编码 AWS 凭证的风险吗?
  • 也许我错过了一些关于安全性的东西:这就是我想象系统的方式:首先用户登录我的网站,我的网站将 AKID 和 SAK(为他的帐户)还给他,他使用它以安全的方式连接到 dynamodb(使用读/写操作)。这种方法错了吗?
  • 这是不安全的,因为在浏览器中 JavaScript 应用程序容易受到各种攻击 - 在这里解释这些超出了范围,但请参阅在客户端浏览器中加载凭据部分Configuring the SDK in the Browser 来自 AWS 的自动声明,确认硬编码只有在您将应用程序限制为只读凭证时才是安全的。而且即便如此这些凭据也可能被其他用户劫持以读取他们不应该访问的信息。
  • 那么,无论我使用什么方法,客户端的 JavaScript 都不安全?为了安全,我是否必须使用“WebService”方法? “登录亚马逊”会强制我的用户拥有亚马逊账户吗?还是只是我的 IAM 控制台中的帐户?因为我想处理付款等帐户...
【解决方案2】:

如果您可以使用他们的 Amazon、Facebook 或 Google 凭证对您的用户进行身份验证,那么您可以使用 Web 身份联合,它(简单来说)将使用您的应用程序可以使用的临时 AWS 安全凭证交换来自这 3 个提供商之一的令牌用于访问 DynamoDB。 AWS 文档中有几篇关于此主题的文章值得一读。

http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/browser-configuring-wif.html http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WIF.html

【讨论】:

    猜你喜欢
    • 2021-01-03
    • 2021-10-01
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多