使用具有水平信息隐藏功能的Amazon Dynamo DB进行细粒度访问控制

Agr*_*raj 8 access-control multi-tenant amazon-web-services amazon-dynamodb amazon-iam

我已经浏览了文档并且它与我的用例密切相关,除了我不能使用Google,Facebook或亚马逊作为我的身份提供者,但我已经为经过身份验证的用户提供了企业级OAuth 2.0访问令牌.

我了解我可以使用AWS STS的Enterprise Federated支持来获取临时凭证并使用它们来进一步访问AWS资源,但我无法理解如何配置IAM策略以使用这些凭据来实现水平信息隐藏.

我在DynamoDB中有一些表,其中存储了我的应用程序的所有用户的详细信息,我的应用程序支持多个租户,因此我希望一个租户的用户无法访问其他租户的数据.我可以配置的IAM策略类型如下:

"Condition": {
            "ForAllValues:StringEquals": {
               "dynamodb:LeadingKeys":  ["${www.amazon.com:user_id}"]
            }
        }
Run Code Online (Sandbox Code Playgroud)

现在我的用户没有通过亚马逊(或Google或Facebook)登录,因此我无法使用"$ {www.zonzon.com:user_id}"等密钥.此外,我的某些表的哈希键是复合的.

所以我的问题是如何在数据库级别实现多租户,并能够分离或分离每个租户的数据,即隐藏我的表的某些行与不应该访问它的用户.

是否可以在定义IAM策略时指定自定义策略变量并指定如何在运行时解析这些变量?或者其他一些方式?

我在Dynamo中的表当前有复合哈希键,它是Tenant_ID和User_ID的组合,所以我可以在IAM策略中指定某种规则,以便我能够实现水平信息隐藏吗?

如果您需要有关我的用例的更多信息,请告诉我.

此致,阿格拉伊

F_S*_*O_K 1

为了在 DynamoDB 中启用细粒度数据访问,您必须在 DynamoDB IAM 策略中指定IAM 策略元素变量。

典型的策略可能如下所示:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "FullAccessToUserItems",
            "Effect": "Allow",
            "Action": [
                "dynamodb:*"
            ],
            "Resource": [
                "arn:aws:dynamodb:*:table/*"
            ],
            "Condition": {
                "ForAllValues:StringEquals": {
                    "dynamodb:LeadingKeys": [
                        "${cognito-identity.amazonaws.com:sub}"
                    ]
                }
            }
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

其中${cognito-identity.amazonaws.com:sub}是代表 Cognito 中用户子账户的 IAM 策略变量。

不幸的是,亚马逊没有发布可用策略变量的列表。但这确实意味着您的用户管理必须通过亚马逊进行管理,以实现细粒度的安全性。您无法定义自己的策略变量 - 它们必须是预定义的 Amazon 变量 - 因此细粒度安全性仅在您的用户在 Amazon 中管理的情况下可用。

此外,您的 DynamoDB 分区键必须与策略变量匹配。例如,您的表分区键必须是 Cognito 子分区。

如果您的 OAuth 令牌是从 Cognito 收到的,您只需将其发布到 Amazon Token Endpoint,这将返回一个包含用户 Cognito 子项的 id_token 。