授予及取得 Storage bucket 存取權

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

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

事前準備

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

授予 bucket 存取權

您可以建立並套用 RoleBinding,參照 Management API 伺服器中預先定義的角色,將 S3 API 資源 (例如值區和這些值區中的物件) 的存取權授予 UserServiceAccount 主體。

預先定義的角色

  • project-bucket-object-viewer:使用者可列出專案中的所有 bucket、列出這些 bucket 中的物件,以及讀取物件和物件中繼資料。您無法對物件執行寫入作業。例如上傳、覆寫、刪除。具備機構及其專案中雙區域值區的唯讀權限,以及這些值區中物件的唯讀權限。

  • project-bucket-object-admin:使用者可列出專案中的所有值區,並對物件執行寫入和讀取作業。例如上傳、覆寫、刪除。具備機構及其專案中雙區域值區的唯讀權限,以及這些值區中物件的讀寫權限。

  • project-bucket-admin:使用者可管理指定命名空間中的所有 bucket,以及這些 bucket 中的所有物件。具備機構及其專案中雙區域值區的唯讀權限,以及這些值區中物件的讀寫權限。

如要查看上述角色授予的完整權限清單,請參閱「預先定義的角色權限」一節。

您必須具備專案的專案 IAM 管理員角色,才能在該專案中建立角色繫結。以下範例會建立 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
    

取得 bucket 存取憑證

授予值區存取權後,系統會在 Secret 中建立存取憑證。您需要憑證才能設定 Distributed Cloud CLI,並執行指令與 bucket 互動。

密鑰名稱的格式為 object-storage-key-STORAGE_CLASS-SUBJECT_TYPE-SUBJECT_HASH

  • STORAGE_CLASS 的值包括:
    • std 適用於 Standard 儲存空間級別。
  • SUBJECT_TYPE 的值包括:
    • user
    • sa for 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 | grep "object-storage-key-"
    

    如果可以查看這個命名空間中的任何 Secret,輸出內容會包含一或多個以 object-storage-key- 開頭的 Secret 名稱,類似於下列內容:

    secrets        []        [object-storage-key-std-user-l74gbpyrsbmwy4mivocr3nur6dzrnhcfhe3otyplul42i732aama]        [get]
    
    • 注意:如果您是管理員,且有權查看所有 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:?} | grep "object-storage-key-"
      
  2. 取得對應 Secret 的內容:

    kubectl get -o yaml --namespace object-storage-access-keys secret SECRET_NAME
    

    您會收到類似下列內容的輸出:

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

export SA_NAMESPACE=PROJECT_NAMESPACE
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-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 管理員權限

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

角色授予的其他權限清單如下:

  • Bucket API 權限

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