ストレージ バケットへのアクセス権の付与と取得

このページでは、Google Distributed Cloud(GDC)のエアギャップ プロジェクト内のストレージ バケットへのアクセスを管理して、適切なユーザーに適切な権限を付与する方法について説明します。ロール バインディングと事前定義ロールを使用してユーザーとサービス アカウントのアクセス権を取得して付与するための前提条件と手順について説明します。この情報を使用すると、ストレージ リソースへのアクセスを効果的に制御し、セキュリティと運用効率の両方を維持できます。

このページは、インフラストラクチャ オペレーター グループの IT 管理者や、GDC のエアギャップ環境でストレージ バケットのアクセス設定を管理するアプリケーション オペレーター グループの開発者など、さまざまなユーザーを対象としています。詳細については、GDC エアギャップの対象読者に関するドキュメントをご覧ください。

始める前に

プロジェクト名前空間は、Management API サーバーのバケット リソースを管理します。バケットとオブジェクトを操作するには、プロジェクトが必要です。

バケットへのアクセス権を付与する

Management API サーバーで事前定義されたロールを使用して RoleBinding を作成して適用することで、他のユーザーまたはサービス アカウントにバケット アクセス権を付与できます。

事前定義ロール

  • project-bucket-object-viewer: これにより、ユーザーはプロジェクト内のすべてのバケットの一覧表示、それらのバケット内のオブジェクトの一覧表示、オブジェクトとオブジェクトのメタデータの読み取りを行うことができます。オブジェクトに対する書き込みオペレーションは許可されません。たとえば、アップロード、上書き、削除などです。組織とそのプロジェクト内のデュアルゾーン バケットに対する読み取り専用アクセス権と、それらのバケット内のオブジェクトに対する読み取り専用アクセス権を持ちます。

  • project-bucket-object-admin: これにより、ユーザーはプロジェクト内のすべてのバケットを一覧表示し、オブジェクトに対する書き込みオペレーションと読み取りオペレーションを実行できます。たとえば、アップロード、上書き、削除などです。組織とそのプロジェクト内のデュアルゾーン バケットに対する読み取り専用権限と、それらのバケット内のオブジェクトに対する読み取り / 書き込み権限を持ちます。

  • project-bucket-admin: これにより、ユーザーは指定された Namespace 内のすべてのバケットと、それらのバケット内のすべてのオブジェクトを管理できます。組織とそのプロジェクト内のデュアルゾーン バケットに対する読み取り専用権限と、それらのバケット内のオブジェクトに対する読み取り / 書き込み権限を持ちます。

上記のロールに付与される権限の一覧については、事前設定されたロールの権限セクションをご覧ください。

RoleBinding を作成する権限を付与するよう、プロジェクト 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: 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 にアクセス認証情報が作成されます。

シークレット名の形式は object-storage-key-STORAGE_CLASS-SUBJECT_TYPE-SUBJECT_HASH です。

  • STORAGE_CLASS の値は次のとおりです。
    • Standard ストレージ クラスの std
  • SUBJECT_TYPE の値は次のとおりです。
    • ユーザーの user
    • ServiceAccount の sa
  • SUBJECT_HASH は、サブジェクト名の base32 でエンコードされた SHA256 ハッシュです。

たとえば、ユーザー bob@foo.com には次の名前のシークレットがあります。

object-storage-key-std-user-l74gbpyrsbmwy4mivocr3nur6dzrnhcfhe3otyplul42i732aama

ユーザー アクセス認証情報を取得する

ユーザー サブジェクトの場合、Secret は Management API サーバーの object-storage-access-keys Namespace にあります。

  1. 次のコマンドを実行して、Namespace 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'
      

      ユーザーを偽装して、どの Secret を表示できるかを確認します。

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

    この Namespace の 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 はサービス アカウントと同じ Namespace に作成されます。

次のコマンドを実行して、Namespace で 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. 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 権限

このロールは、バケット内のオブジェクト、オブジェクト バージョン、タグの追加と削除を行う権限を付与します。また、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. 削除