使用水平信息隐藏的Amazon Dynamo DB细粒度访问控制

9
我已经阅读了文档,它与我的用例非常相似,但我不能使用谷歌、Facebook或亚马逊作为我的身份提供者,但我已经拥有企业级OAuth 2.0访问令牌来验证用户。
我知道我可以可能使用AWS STS的企业联合支持获取临时凭证,并使用它们进一步访问AWS资源,但我不明白如何配置IAM策略以使用这些凭据实现水平信息隐藏。
我在DynamoDB中有某些表,在其中存储应用程序的所有用户的详细信息,我的应用程序支持多租户,因此我希望一个租户的用户无法访问其他租户的数据。我可以配置的IAM策略类型是:
"Condition": {
            "ForAllValues:StringEquals": {
               "dynamodb:LeadingKeys":  ["${www.amazon.com:user_id}"]
            }
        }

现在我的用户不是通过亚马逊(或谷歌或Facebook)登录的,因此我不能使用诸如 "${www.amazon.com:user_id}" 等密钥。另外,我的某些表的哈希键是复合的。
所以我的问题是如何在数据库级别实现多租户,并能够根据租户分离或分隔数据,即隐藏某些表行使其对应用户无法访问。
在定义 IAM 策略时是否可以指定自定义策略变量,并指定运行时如何解析它们?还是有其他方法?
我的 Dynamo 表目前具有组合哈希键,这些哈希键是 Tenant_ID 和 User_ID 的组合,那么我是否可以在 IAM 策略中指定某种规则,以便能够实现水平信息隐藏?
如果需要更多关于我的用例的信息,请告知。
敬礼, Agraj
1个回答

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

其中${cognito-identity.amazonaws.com:sub}是一个IAM策略变量,表示Cognito中用户的sub。

不幸的是,亚马逊没有发布可用策略变量的列表。这意味着您的用户管理必须通过亚马逊进行管理,以启用细粒度安全。您不能定义自己的策略变量 - 它们必须是预定义的亚马逊变量 - 因此只有在您的用户在亚马逊中进行管理时,才可以使用细粒度安全。

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

如果您从Cognito收到了OAuth令牌,您可以将其简单地发布到Amazon Token Endpoint,该端点会返回包含用户Cognito sub的id_token。


谢谢Stu的回复。然而,我目前无法接受它作为正确答案,因为我现在无法尝试。我已经离开那个项目两年了。如果有其他人能够验证这个答案是正确的,我很乐意接受它作为正确答案。 - Agraj
我正在考虑在我的单表设计中使用dynamodb的LeadingKeys条件,但最大的限制因素是只能使用分区键,而不能使用分区键 - 排序键组合。 - vladimirp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接