我们使用S3作为我们的数据湖,它以customerId作为partitionId。雅典娜被用来查询这个数据湖。
在DDB和S3中查询数据时,我们使用细粒度访问控制(使用SDK).
是否也有方法使用雅典娜来确保细粒度的访问控制也在存储级别实施,而不是仅仅基于内存中的customerId进行过滤?
发布于 2022-10-14 12:18:43
雅典娜中的权限(假设您不使用Lake )是雅典娜、Glue和S3权限的组合。S3权限是最重要的权限,因为它们控制用户可以访问哪些数据。
如果您的数据是按客户ID进行分区的,这意味着每个客户的数据在S3上有一个不同的前缀。当您为用户创建IAM权限时,您将能够将该用户的权限范围限定为一个或多个前缀。
以下是仅在特定前缀中授予GetObject权限的IAM语句的片段。
{
"Effect": "Allow",
"Action": ["s3:GetObject"],
"Resource": ["arn:aws:s3:::bucket_name/prefix_including_customer_id/*"]
}Resource值是一个数组,您可以指定多个前缀。
您还需要授予s3:ListBucket权限。如果获取对象列表不敏感,则可以为整个桶授予此权限,否则需要一条稍微不同的语句将列表权限限制为相同的前缀:
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::bucket_name"],
"Condition": {
"StringLike": {
"s3:prefix": ["prefix_including_customer_id/*"]
}
}
}如果策略包含这些类型的语句,则只允许用户读取他们可以访问的对象,并且尝试读取其他对象,例如运行像SELECT * FROM customer_data这样的查询将导致访问拒绝错误。只有当它们运行一个对与它们有权访问的S3前缀匹配的分区键进行筛选的查询时,查询才会成功。
用户仍然能够看到分区键的所有值(只是看不到分区内的数据),这是不可避免的。
https://stackoverflow.com/questions/73816448
复制相似问题