gpt4 book ai didi

amazon-dynamodb - 使用 Cognito 的 DynamoDB 细粒度访问

转载 作者:行者123 更新时间:2023-12-04 08:45:51 25 4
gpt4 key购买 nike

我正在开发一项需要访问 DynamoDB 表的服务,该表必须通过授权用户访问表来管理。帐户管理由 Cognito 处理。我目前正在调查对 DynamoDB 表的直接访问,并根据具有相关 IAM 策略的用户组限制读/写访问。

表中存在多个组织,多个用户与一个组织相关联。该模型的示例如下。我还以多对一关系存储部门和部门信息。

用户的 Cognito Sub 作为用户 ID 存储在数据库中的 USR# 下。

+-------+-------+-----------------+------------+--------+
| PK | SK | Name | GSI1PK | GSI2PK |
+-------+-------+-----------------+------------+--------+
| ORG#1 | ORG#1 | Acme Inc | | |
| ORG#1 | USR#1 | John Doe | | |
| ORG#2 | ORG#2 | Globetex | | |
| ORG#2 | USR#2 | Jane Doe | | |
| ORG#1 | SEC#1 | Sector A1 | ORG#1SEC#1 | SEC#1 |
| DEP#1 | DEP#1 | Human Resources | ORG#1SEC#1 | DEP#1 |
+-------+-------+-----------------+------------+--------+

到目前为止,我可以在特定 IAM 策略中以硬编码方式限制对每个组织的访问。但是,这是不可扩展的。如果要存在一百个组织,则还必须存在一百个具有单独策略的用户组。此政策的示例如下。

有没有什么方法可以创建一个使用自定义 Cognito 变量的 IAM 策略,例如“organization”,它允许我创建一个单一的策略来限制对仅以该组织开头的行的访问?我无法使用以下代码使其正常工作。

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:PutItem",
"dynamodb:Query"
],
"Resource": [
"arn:aws:dynamodb:region:id:table/TableName"
],
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:LeadingKeys": [
"${cognito-identity.amazonaws.com:org}"
]
}
}
}
]
}

编辑:为清楚起见,我的查询是在验证时将自定义 Cognito 变量动态插入到 IAM 策略中。

例如,用户 A 将 custom:org = Acme 作为 Cognito 属性,而用户 B 将 custom:org = Globex 作为其自定义 Cognito 属性。

上面代码中详述的单个策略可以将此属性直接插入到策略中,因此一个策略可以用于不同组织中的多个用户。

经过进一步研究后,我不确定这是否可行,但如果有人有任何尝试此类事情的经验,我很乐意听到。

最佳答案

根据 this article,我认为你很接近它应该是 StringLike 而不是 StringEquals

"Condition": {
"ForAllValues:StringLike": {
"dynamodb:LeadingKeys": [
"{TENANTID}-*"
]
}

可能还想阅读 Multi-tenant SaaS Storage Strategies白皮书

编辑我不相信静态策略有可能做你想做的事。

但是链接文章中的代码确实提供了“管理来自任何租户的用户的访问”的能力。

重点是role/AccessDynamoWithTenantContext的使用

    tenantPolicy = getPolicy(event['tenantID'])

assumed_role = sts_client.assume_role(
RoleArn="arn:aws:iam::<account-id>:role/AccessDynamoWithTenantContext",
RoleSessionName="tenant-aware-product",
Policy=tenantPolicy,
)

并在getPolicy()中动态注入(inject)tenentId

policy = json.dumps(policyTemplate).replace("{TENANTID}", tenantID)

return policy

关于amazon-dynamodb - 使用 Cognito 的 DynamoDB 细粒度访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64334798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com