本頁面將逐步說明如何管理 Google Distributed Cloud (GDC) 實體隔離專案中的 Storage bucket 存取權,確保合適的人員具備適當權限。包括必要條件,以及使用角色繫結和預先定義的角色,取得及授予使用者和服務帳戶存取權的步驟。這項資訊可讓您有效控管儲存空間資源的存取權,同時維持安全性及作業效率。
本文適用於基礎架構營運商群組中的 IT 管理員,或應用程式營運商群組中的開發人員,他們負責管理 Google Distributed Cloud 實體隔離方案環境中 Storage bucket 的存取權設定。詳情請參閱「GDC 實體隔離方案說明文件的目標對象」。
事前準備
專案命名空間會管理 Management API 伺服器中的 bucket 資源。您必須有專案,才能使用 bucket 和物件。
授予 bucket 存取權
您可以建立並套用 RoleBinding,參照 Management API 伺服器中預先定義的角色,將 S3 API 資源 (例如 bucket 和 bucket 中的物件) 的存取權授予 User 和 ServiceAccount 主體。
預先定義的角色
project-bucket-object-viewer:允許使用者列出專案中的所有 bucket、列出這些 bucket 中的物件,以及讀取物件和物件中繼資料。但無法對物件執行寫入作業。例如上傳、覆寫、刪除。具備組織及其專案中雙可用區 bucket 的唯讀權限,以及這些 bucket 中物件的唯讀權限。
project-bucket-object-admin:可讓使用者列出專案中的所有 bucket,並對物件執行寫入和讀取作業。例如上傳、覆寫、刪除。具備組織及其專案中雙可用區 bucket 的唯讀權限,以及這些 bucket 中物件的讀寫權限。
project-bucket-admin:使用者可以管理指定命名空間中的所有 bucket,以及這些 bucket 中的所有物件。具備組織及其專案中雙可用區 bucket 的唯讀權限,以及這些 bucket 中物件的讀寫權限。
如要查看上述角色授予的完整權限清單,請參閱「預先定義的角色權限」一節。
您必須具備專案的 IAM 專案管理員角色,才能在該專案中建立角色繫結。以下範例說明如何建立 RoleBinding 資源,向使用者和服務帳戶授予存取權:
在系統上建立 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:服務帳戶名稱
套用 YAML 檔案:
kubectl apply \ -f rolebinding-object-admin-all-buckets.yaml
取得 bucket 存取憑證
授予 bucket 存取權後,系統會在 Secret 中建立存取憑證。您必須提供憑證,才能設定 Distributed Cloud CLI,並執行指令與 bucket 互動。
Secret 名稱的格式為 object-storage-key-STORAGE_CLASS-SUBJECT_TYPE-SUBJECT_HASH。
STORAGE_CLASS的值如下:Standard儲存空間級別為std。
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 命名空間中。
執行下列指令,列出您有權在命名空間
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 名稱:
列出屬於指定使用者的所有 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:?} | grep "object-storage-key-"
取得對應 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==解碼存取金鑰 ID 和密鑰:
echo "MEhYM08wWUMySjcyMkVKTFBKRU8=" | base64 -d \ && echo \ && echo "Ump0MVRleVN4SmhCSVJhbmlnVDAwbTJZc0IvRlJVendqR0JuYVhiVA==" | base64 -d輸出內容大致如下:
0HX3O0YC2J722EJLPJEO Rjt1TeySxJhBIRanigT00m2YsB/FRUzwjGBnaXbT按照「設定 gdcloud CLI」一節的說明,使用產生的資訊。
取得服務帳戶存取權
只有在專案命名空間中存在 bucket 時,系統才會建立並提供 S3 密鑰憑證。
如果是服務帳戶 (SA) 主體,Secret 會建立在與服務帳戶相同的命名空間中。
執行下列指令,確認您可以在命名空間中取得及列出 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 伺服器也提供預先定義的角色,可用於管理及操作雙可用區 bucket。
project-bucket-object-viewer 權限
這個角色可授予權限,取得及列出 bucket 中的物件和物件中繼資料。
project-bucket-object-viewer 動詞授予的所有物件儲存庫權限清單如下:
Bucket API 權限:
- get
- list
- watch
S3 物件儲存空間權限:
- GetBucketVersioning
- GetObject
- GetObjectAcl
- GetObjectLegalHold
- GetObjectRetention
- GetObjectTagging
- GetObjectVersion
- GetObjectVersionTagging
- ListBucket
- ListBucketVersions
- ListBucketMultipartUploads
- ListMultipartUploadParts
project-bucket-object-admin 權限
這個角色可授予權限,允許在 bucket 中放置及刪除物件,以及物件版本和標記。此外,這項角色也會授予 project-bucket-object-viewer 中的所有權限。
以下是角色授予的所有其他物件儲存庫權限清單:
S3 物件儲存空間權限:
- AbortMultipartUpload
- DeleteObject
- DeleteObjectTagging
- DeleteObjectVersion
- DeleteObjectVersionTagging
- PutObject
- PutObjectTagging
- PutObjectVersionTagging
- PutOverwriteObject
- RestoreObject
project-bucket-admin 權限
這項角色可授予權限,在專案命名空間中建立、更新或刪除 Bucket 資源。此外,這項角色也會授予 project-bucket-object-admin 中的所有權限。
以下是該角色授予的其他權限清單:
Bucket API 權限:
- 建立
- 更新
- 刪除