作者:MeshCloud脉时云 公有云架构师 吴子成
引言
需求场景:限定用户对指定Bucket下指定目录对象文件有指定的访问权限
示例 Demo场景:
- 人员甲:可以对指定bucket的目录拥有上传、下载、列出对象的权限(gsutil cp/ls)
- 人员乙:可以对指定bucket的目录拥有上传、下载、删除以及覆盖同名文件的权限(gsutil cp/rm/ls)
整体架构
场景预设信息
- 存储桶名称:bucket-zicheng
- 访问控制类型:Uniform
- 桶目录结构:
目标
- 人员甲对data2目录,和/data1/data1_1有上传、下载、列出具体对象的权限
- 人员乙对data2目录,和/data1/data1_1有上传、下载、删除、覆盖同名文件的权限
准备工作
提前创建GCS桶,并按预设定的桶目录结构创建好目录。
实施步骤
1) 配置人员甲的权限
给予Storage Object Creator、Storage Object Viewer权限,并配置特殊路径条件访问策略。
点击”GRANT ACCESS”添加service account赋予对应权限
添加对应的权限和条件
上传权限(Storage Object Creator)条件配置明细:
test
下载权限(Storage Object Viewer)条件配置明细:
resource.type == “storage.googleapis.com/Object” && (
resource.name.startsWith(“projects/_/buckets/bucket-zicheng/objects/data2/”) || (
resource.name.startsWith(“projects/_/buckets/bucket-zicheng/objects/data1/data1_1/”)))
列出具体对象权限(Storage Object Viewer)条件配置明细:
resource.type == “storage.googleapis.com/Bucket” && (
resource.name.startsWith(“projects/_/buckets/bucket-zicheng/objects/data2/”) || (
resource.name.startsWith(“projects/_/buckets/bucket-zicheng/objects/data1/data1_1/”)))
这里资源类型选的是Bucket,是因为要列出指定目录下的所有对象。
p.s.
条件类型为name时,对象路径的值为projects/_/buckets/bucket-name/objects/object-name
需要注意的是,object为目录时,object-name需要带正斜杠,如
projects/_/buckets/bucket-zicheng/objects/data2/
2) 配置人员乙的权限
创建自定义role
添加Storage Object Creator、Storage Object Viewer和最小权限storage.objects.delete
自定义role的条件配置明细:(覆盖同名文件权限=上传权限+删除权限)
resource.type == “storage.googleapis.com/Object” && (
resource.name.startsWith(“projects/_/buckets/bucket-zicheng/objects/data2/”) || (
resource.name.startsWith(“projects/_/buckets/bucket-zicheng/objects/data1/data1_1/”)))
验证
1) 人员甲
上传1.txt到/data2和/data1/data1_1目录成功,上传到/data1/data1_2目录提示403没有权限
下载/data2/1.txt到/tmp目录成功,下载/data1/data1_2目录下的msg.log提示403没有权限
list具体对象,list /data2/1.txt成功,list /data1/data1_2/msg.log提示403没有权限
2) 人员乙
上传1.txt到/data2覆盖同名文件成功
删除/data2/1.txt成功,删除/data1/data1_2/msg.log提示403没有权限