授予及取得儲存空間 bucket 存取權

本頁面將逐步說明如何管理 Google Distributed Cloud (GDC) 氣隙專案中儲存空間值區的存取權,確保適當人員擁有適當權限。本文將說明使用角色繫結和預先定義角色,取得及授予使用者和服務帳戶存取權的先決條件和步驟。這項資訊可協助您有效控管儲存空間資源的存取權,同時兼顧安全性和作業效率。

本頁面適用於基礎架構營運商群組的 IT 管理員,或應用程式營運商群組的開發人員,這些對象負責管理 GDC 氣隙環境中儲存空間值區的存取權設定。詳情請參閱 GDC air-gapped 的目標對象說明文件

事前準備

專案命名空間可管理 Management API 伺服器中的 bucket 資源。您必須擁有專案,才能使用 bucket 和物件。

授予 bucket 存取權

您可以在 Management API 伺服器中,使用預先定義的角色建立及套用 RoleBinding,為其他使用者或服務帳戶提供 bucket 存取權。

預先定義的角色

  • 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
    

取得 bucket 存取憑證

授予值區存取權後,系統會在 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 有一個名為:

object-storage-key-std-user-l74gbpyrsbmwy4mivocr3nur6dzrnhcfhe3otyplul42i732aama

取得使用者存取憑證

如果是使用者主體,Secret 會位於 Management API 伺服器的 object-storage-access-keys 命名空間中。

  1. 執行下列指令,列出您有權在 object-storage-access-keys 命名空間中查看的 Secret 資源:

    kubectl auth can-i --list --namespace object-storage-access-keys
    
    • 注意:如果您是管理員,且有權查看所有 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'
      

      模擬使用者,查看他們可以查看哪些祕密:

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

    如果您可以查看這個命名空間中的任何密鑰,輸出內容應會包含類似下列的密鑰名稱:

    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 資源。如果無法,請與管理員聯絡:

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 權限

這個角色可授予權限,以取得及列出值區中的物件和物件中繼資料。

專案值區物件檢視者動詞授予的所有物件儲存空間權限如下:

  • Bucket API 權限

    1. get
    2. list
    3. watch
  • 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 權限

這個角色可授予在 bucket 中放置及刪除物件、物件版本和標記的權限。此外,這個角色也會授予 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

專案值區管理員權限

這個角色可授予在專案命名空間中建立、更新或刪除 Bucket 資源的權限。此外,這個角色也會授予project-bucket-object-admin中的所有權限。

角色授予的額外權限清單如下:

  • Bucket API 權限

    1. 建立
    2. 更新
    3. 刪除