授予和获取存储桶访问权限

本页面将引导您了解如何管理对 Google Distributed Cloud (GDC) 气隙项目中的存储分区的访问权限,以便合适的人员拥有合适的权限。本文档介绍了使用角色绑定和预定义角色获取和授予用户和服务账号访问权限的前提条件和步骤。借助这些信息,您可以有效控制对存储资源的访问权限,同时确保安全性和运营效率。

本页面面向基础架构运维人员组中的 IT 管理员或应用运维人员组中的开发者等受众群体,他们负责管理 GDC 气隙环境中存储分区的访问权限设置。如需了解详情,请参阅 GDC 气隙环境文档的受众群体

准备工作

项目命名空间用于管理 Management API 服务器中的存储桶资源。您必须拥有项目才能使用存储分区和对象。

授予存储桶访问权限

您可以在 Management API 服务器中创建并应用具有预定义角色的 RoleBinding,以向其他用户或服务账号提供存储桶访问权限。

预定义角色

  • project-bucket-object-viewer::此角色允许用户列出项目中的所有存储桶、列出这些存储桶中的对象,以及读取对象和对象元数据。它不允许您对对象执行写入操作。例如:上传、覆盖、删除。对组织及其项目中的双可用区存储分区以及这些存储分区中的对象拥有只读权限。

  • project-bucket-object-admin::此角色允许用户列出项目中的所有存储桶,并对对象执行写入和读取操作。例如:上传、覆盖、删除。对组织及其项目中的双区域存储分区拥有只读权限,以及对这些存储分区中的对象拥有读写权限。

  • project-bucket-admin::此角色可让用户管理指定命名空间中的所有存储桶,以及这些存储桶中的所有对象。对组织及其项目中的双区域存储分区拥有只读权限,以及对这些存储分区中的对象拥有读写权限。

如需查看上述角色授予的权限的完整列表,请参阅预设角色权限部分。

请让您的项目 IAM 管理员授予您创建 RoleBinding 的权限。以下示例展示了如何创建 RoleBinding 以向用户和服务账号授予访问权限:

  1. 在您的系统上创建一个 YAML 文件,例如 rolebinding-object-admin-all-buckets.yaml

    # Example file name:
    # rolebinding-object-admin-all-buckets.yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      namespace: NAMESPACE_NAME
      name: readwrite-all-buckets
    roleRef:
      kind: Role
      name: project-bucket-object-admin
      apiGroup: rbac.authorization.k8s.io
    subjects:
    - kind: ServiceAccount
      namespace: NAMESPACE_NAME
      name: SA_NAME
    - kind: User
      namespace: NAMESPACE_NAME
      name: bob@example.com
      apiGroup: rbac.authorization.k8s.io
      # Could be bob or bob@example.com based on your organization settings.
    
  2. 应用 YAML 文件:

    kubectl apply \
    -f rolebinding-object-admin-all-buckets.yaml
    

获取存储桶访问凭据

授予对存储桶的访问权限后,系统会在 Secret 中创建访问凭据。

Secret 名称的格式为 object-storage-key-STORAGE_CLASS-SUBJECT_TYPE-SUBJECT_HASH

  • STORAGE_CLASS 的值包括:
    • std 存储类别的 Standard
  • SUBJECT_TYPE 的值包括:
    • user 适用于用户。
    • sa(适用于 ServiceAccount)。
  • SUBJECT_HASH 是主题名称的 base32 编码 SHA256 哈希值。

举例来说,用户 bob@foo.com 拥有一个名为以下内容的 Secret:

object-storage-key-std-user-l74gbpyrsbmwy4mivocr3nur6dzrnhcfhe3otyplul42i732aama

获取用户访问凭据

对于用户正文,Secret 位于管理 API 服务器中的 object-storage-access-keys 命名空间中。

  1. 运行以下命令,列出您有权在命名空间 object-storage-access-keys 中查看的 Secret 资源:

    kubectl auth can-i --list --namespace object-storage-access-keys
    
    • 注意:如果您是管理员,有权查看所有 Secret 资源或模拟其他用户,则可以运行以下命令之一来查找指定用户的 Secret 名称:

      列出属于指定用户的所有 Secret:

      export USER_NAME=bob@example.com
      kubectl get secrets --namespace object-storage-access-keys -o json | jq  -r --arg USER_NAME "${USER_NAME:?}" '.items[] | select( (.metadata.annotations."object.gdc.goog/subject"==$USER_NAME)) | .metadata.name'
      

      模拟用户以查看他们可以查看哪些 Secret:

      export USER_NAME=bob@example.com
      kubectl auth can-i --list --namespace object-storage-access-keys --as "${USER_NAME:?}"
      

    如果您可以查看此命名空间中的任何 Secret,则应看到包含类似于以下内容的 Secret 名称的输出:

    object-storage-key-std-user-l74gbpyrsbmwy4mivocr3nur6dzrnhcfhe3otyplul42i732aama
    
  2. 获取相应 Secret 的内容:

    kubectl get -o yaml --namespace object-storage-access-keys secret object-storage-key-std-user-l74gbpyrsbmwy4mivocr3nur6dzrnhcfhe3otyplul42i732aama
    

    您将收到类似如下所示的输出:

    data:
      access-key-id: MEhYM08wWUMySjcyMkVKTFBKRU8=
      create-time: MjAyMi0wNy0yMiAwMTowODo1OS40MTQyMTE3MDMgKzAwMDAgVVRDIG09KzE5OTAuMzQ3OTE2MTc3
      secret-access-key: Ump0MVRleVN4SmhCSVJhbmlnVDAwbTJZc0IvRlJVendqR0JuYVhiVA==
    
  3. 解码访问密钥 ID 和密钥:

    echo "MEhYM08wWUMySjcyMkVKTFBKRU8=" | base64 -d \
        && echo \
        && echo "Ump0MVRleVN4SmhCSVJhbmlnVDAwbTJZc0IvRlJVendqR0JuYVhiVA==" | base64 -d
    

    您将收到类似如下所示的输出:

    0HX3O0YC2J722EJLPJEO
    Rjt1TeySxJhBIRanigT00m2YsB/FRUzwjGBnaXbT
    
  4. 按照配置 gdcloud CLI 部分中的说明,使用生成的信息进行操作。

获取服务账号访问权限

对于服务账号 (SA) 正文,Secret 是在与服务账号相同的命名空间中创建的。

运行以下命令以验证您是否可以获取和列出命名空间中的 Secret 资源。如果无法获取和列出,请与管理员联系:

export SA_NAMESPACE=NAMESPACE_NAME
kubectl auth can-i --list --namespace $SA_NAMESPACE

如需查找 Secret 名称,请运行以下命令:

export SA_NAME=SA_NAME
kubectl get secrets --namespace $SA_NAMESPACE  -o json | jq  -r --arg USER_NAME "${SA_NAME:?}" '.items[] | select( (.metadata.annotations."object.gdc.goog/subject"==$USER_NAME)) | .metadata.name'

您将收到类似如下所示的输出:

object-storage-key-std-sa-mng3olp3vsynhswzasowzu3jgzct2ert72pjp6wsbzqhdwckwzbq

您可以在 pod 中将 Secret 引用为环境变量文件

预设角色权限

请注意,预定义角色也可在全局 API 服务器中使用,以便对双区域存储分区进行管理和操作访问。

project-bucket-object-viewer 权限

此角色授予以下权限:获取和列出存储桶中的对象以及对象的元数据。

project-bucket-object-viewer 动词授予的所有对象存储权限如下:

  • 存储分区 API 权限

    1. get
    2. list
    3. 监测
  • S3 对象存储权限

    1. GetBucketVersioning
    2. GetObject
    3. GetObjectAcl
    4. GetObjectLegalHold
    5. GetObjectRetention
    6. GetObjectTagging
    7. GetObjectVersion
    8. GetObjectVersionTagging
    9. ListBucket
    10. ListBucketVersions
    11. ListBucketMultipartUploads
    12. ListMultipartUploadParts

project-bucket-object-admin 权限

此角色授予在存储桶中放置和删除对象、对象版本和标记的权限。此外,它还会授予 project-bucket-object-viewer 中的所有权限。

角色授予的所有其他对象存储权限如下:

  • S3 对象存储权限

    1. AbortMultipartUpload
    2. DeleteObject
    3. DeleteObjectTagging
    4. DeleteObjectVersion
    5. DeleteObjectVersionTagging
    6. PutObject
    7. PutObjectTagging
    8. PutObjectVersionTagging
    9. PutOverwriteObject
    10. RestoreObject

project-bucket-admin 权限

此角色授予在项目命名空间中创建、更新或删除存储分区资源的权限。此外,它还会授予 project-bucket-object-admin 中的所有权限。

该角色授予的额外权限包括:

  • 存储分区 API 权限

    1. 创建
    2. 更新
    3. 删除