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

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

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

始める前に

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

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

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

事前定義ロール

  • project-bucket-object-viewer: このロールにより、ユーザーはプロジェクト内のすべてのバケットを一覧表示し、それらのバケット内のオブジェクトを一覧表示し、オブジェクトとオブジェクトのメタデータを読み取ることができます。このロールでは、アップロード、上書き、削除などのオブジェクトに対する書き込みオペレーションは実行できません。

  • project-bucket-object-admin: このロールにより、ユーザーはプロジェクト内のすべてのバケットを一覧表示し、オブジェクトに対する書き込みオペレーションと読み取りオペレーション(アップロード、上書き、削除など)を実行できます。

  • project-bucket-admin: このロールを使用すると、ユーザーは指定された Namespace 内のすべてのバケットと、それらのバケット内のすべてのオブジェクトを管理できます。

これらのロールに付与される権限の完全なリストについては、プリセット ロールの権限のセクションをご覧ください。

プロジェクト ロール バインディングの作成に必要な権限を取得するには、プロジェクト IAM 管理者にプロジェクト IAM 管理者(project-iam-admin)ロールの付与を依頼してください。

次の例は、ユーザーとサービス アカウントにアクセス権を付与する RoleBinding の作成例です。

  1. システムに YAML ファイル(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  # Could be bob or bob@example.com based on your organization settings.
       apiGroup: rbac.authorization.k8s.io
     ```
    
  2. YAML ファイルを適用します。

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

バケットのアクセス認証情報を取得する

バケットへのアクセス権を付与すると、アクセス認証情報が Secret に作成されます。

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

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

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

object-storage-key-std-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja

ユーザー シークレットにアクセスする

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

  1. シークレット名を確認します。

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

    次のような出力が表示されます。

    secrets        []        [object-storage-key-std-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja,object-storage-key-std-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja]        [get]
    
  2. 対応する Secret の内容を取得して、バケットにアクセスします。

    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. 結果の情報を使用して、s3cmd を構成するセクションの手順に沿って操作します。

サービス アカウントのシークレットにアクセスする

サービス アカウント(SA)サブジェクトの場合、Secret はサービス アカウントと同じ Namespace に作成されます。名前を確認するには、次のコマンドを実行します。

  kubectl get --namespace NAMESPACE_NAME secrets -o=jsonpath=
  '{.items[?(@.metadata.annotations.object\.gdc\.goog/subject=="SA_NAME")].metadata.name}'

次のような出力が表示されます。

  object-storage-key-std-sa-mng3olp3vsynhswzasowzu3jgzct2ert72pjp6wsbzqhdwckwzbq

Pod で Secret を環境変数(https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-environment-variables)またはファイル(https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-files-from-a-pod)として参照できます。

プリセット ロールの権限

オブジェクト ストレージを使用する場合は、次のロールをリクエストする必要がある場合があります。

project-bucket-object-viewer 権限

このロールは、バケット内のオブジェクトとオブジェクトのメタデータを取得して一覧表示する権限を付与します。

project-bucket-object-viewer ロールには次の権限が付与されています。

  • バケットの API 権限:

    1. 取得
    2. リスト
    3. モニタリング
  • S3 オブジェクト ストレージの権限:

    1. GetObject
    2. GetObjectAcl
    3. GetObjectVersion
    4. ListBucket
    5. ListBucketVersions
    6. ListBucketMultipartUploads
    7. ListMultipartUploadParts

project-bucket-object-admin 権限

このロールは、バケット内のオブジェクト、オブジェクト バージョン、タグの追加と削除を行う権限を付与します。また、project-bucket-object-viewer のすべての権限も付与します。

project-bucket-object-admin ロールには、次のオブジェクト ストレージ権限が付与されています。

  • S3 オブジェクト ストレージの権限:

    1. AbortMultipartUpload
    2. DeleteObject
    3. PutObject

project-bucket-admin 権限

このロールは、プロジェクトの名前空間で Bucket リソースを作成、更新、削除する権限を付与します。また、project-bucket-object-admin のすべての権限も付与します。

project-bucket-object-admin ロールには次の権限が付与されています。

  • バケットの API 権限:

    1. 作成
    2. 更新
    3. 削除