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

本页面将指导您如何管理对 Google Distributed Cloud (GDC) 网闸隔离项目中的存储桶的访问权限,以确保合适的人员拥有合适的权限。其中涵盖了使用角色绑定和预定义角色获取和授予用户和服务账号访问权限的前提条件和步骤。这些信息可让您有效控制对存储资源的访问,并保持安全性和运营效率。

本页面适用于基础架构运维者群组中的 IT 管理员或应用运维者群组中的开发者等受众群体,他们负责管理 GDC 网闸隔离配置环境中存储桶的访问权限设置。如需了解详情,请参阅适用于 GDC 网闸隔离配置文档的受众群体。

准备工作

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

授予存储桶访问权限

您可以通过创建和应用引用 Management API 服务器中预定义角色的 RoleBinding,向 User 和 ServiceAccount 主体授予对 S3 API 资源(例如存储桶和这些存储桶中的对象)的访问权限。

预定义角色

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

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

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

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

您必须拥有项目的 IAM Project Admin 角色,才能在该项目中创建角色绑定。以下示例展示了如何创建向用户和服务账号授予访问权限的 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: PROJECT_NAMESPACE
      name: readwrite-all-buckets
    roleRef:
      kind: Role
      name: project-bucket-object-admin
      apiGroup: rbac.authorization.k8s.io
    subjects:
    - kind: ServiceAccount
      namespace: PROJECT_NAMESPACE
      name: SA_NAME
    - kind: User
      namespace: PROJECT_NAMESPACE
      name: bob@example.com
      apiGroup: rbac.authorization.k8s.io
      # Could be bob or bob@example.com based on your organization settings.
    

    请替换以下内容:

    • PROJECT_NAMESPACE:项目命名空间的名称
    • SA_NAME:服务账号的名称

  2. 应用 YAML 文件:

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

获取存储桶访问凭证

授予对存储桶的访问权限后,系统会在 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 有两个名为以下名称的密钥:

  1. object-storage-key-std-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja

获取用户访问权限

对于用户主体,Secret 位于 Management API 服务器中的 object-storage-access-keys 命名空间中。

  1. 运行以下命令以查找 Secret 名称:

    kubectl auth can-i --list --namespace object-storage-access-keys | grep "object-storage-key-"
    

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

    secrets        []        [object-storage-key-std-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja]        [get]
    
  2. 获取相应 Secret 的内容,以访问 Standard 存储类别中的存储桶:

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

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

    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 部分中的说明操作,并使用生成的信息。

获取服务账号访问权限

仅当项目命名空间中存在存储桶时,系统才会创建 S3 密钥凭据并可供获取。

对于服务账号 (SA) 主题,请从用户集群中查找 Secret 名称。

  1. 对于 Standard Storage 类,请运行以下命令以获取 Secret 名称:

    kubectl get -n=<PROJECT-NAME> serviceaccount <SA-NAME> -o json | jq -r '.secrets[] | select(.name | test("object-storage-key-std"))'
    
  2. 手动查看列出的 Secret 名称,或使用 grep 查找 object-storage-key-(std|nl):

    kubectl get -n=PROJECT_NAME \
        serviceaccount SA_NAME \
        -o=jsonpath='{.secrets}{"\n"}' | grep -E 'object-storage-key-(std|nl)'
    

    替换以下内容:

    • PROJECT_NAME:您的项目的名称。
    • SA_NAME:您的服务账号的名称。
  3. 您可以在 Pod 中将 Secret 作为环境变量或文件进行引用。

预设角色权限

全局 API 服务器中提供了预定义角色,用于对双区域存储桶进行管理和操作访问。这些角色还授予对可用区级存储桶的访问权限,但前提是使用 IAMRoleBinding 资源,而不是 RoleBinding 或 ClusterRoleBinding 资源。如需详细了解角色绑定,请参阅授予和撤消访问权限。

project-bucket-object-viewer 权限

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

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

  • Bucket API 权限:

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

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

project-bucket-object-admin 权限

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

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

  • S3 对象存储权限:

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

project-bucket-admin 权限

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

Role 授予的其他权限如下:

  • Bucket API 权限:

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