如何解决使用Cognito的DynamoDB细粒度访问
我正在开发一项服务,该服务需要访问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()
中的tenentId
policy = json.dumps(policyTemplate).replace("{TENANTID}",tenantID)
return policy
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。