オブジェクト ストレージの認証情報をローテーションする

Google Distributed Cloud(GDC)エアギャップ アプライアンス オブジェクト ストレージは、OTS(ONTAP Select)によって提供されます。OTS には独自のオブジェクト ストレージ ユーザー管理システムがあります。各 OTS オブジェクト ストレージ ユーザー認証情報は、クラスタ内の Secret として保存されます。

このドキュメントでは、OTS オブジェクト ストレージのユーザー認証情報をローテーションする手順について説明します。次のような状況では、オブジェクト ストレージのユーザー認証情報をローテーションします。

  • すべてのユーザー鍵をローテーションする定期的な鍵のローテーション。
  • 重要な露出を軽減します。公開されたユーザーキーはできるだけ早くローテーションする必要があります。

始める前に

次の手順を行います。

  1. ノートパソコンの前提条件を満たしていることを確認します。
  2. OTS クラスタにログインして vserver object-store-server CLI コマンドを実行できることを確認します。
  3. kubectl を使用して、管理者としてインフラストラクチャ クラスタと管理クラスタにログインできることを確認します。

UID を変換

各オブジェクト ストレージ ユーザーには、Kubernetes Secret として保存され、Kubernetes ワークロードがバックエンド オブジェクト ストレージにアクセスするために使用するアクセスキーとシークレット キーがあります。ユーザー鍵のローテーションには、すべてのシークレットの更新が含まれます。

オブジェクト ストレージ ユーザーのリストを取得するには、次のコマンドを使用して 3 つのノードのいずれかにログインします。

vserver object-store-server user show

出力は UID のリストで、次のようになります。

[
    "root",
    "k8ssa_gpc-system_inventory-export-images",
    "k8ssa_gpc-system_inventory-export-hardware",
    "k8su_test-user@example.com"
]

ユーザーには次の 3 種類があります。

オブジェクト ストレージ ユーザー
UID ユーザーの種類 シークレット名 シークレット Namespace
root システム管理者 objectstorage-tenant-bucket-controller-standard-system-s3-sa gpc-system
objectstorage-tenant-bucket-controller-standard-user-s3-sa
objectstorage-tenant-bucket-controller-nearline-user-s3-sa
k8ssa_&ltnamespace>_&ltsa> Kubernetes サービス アカウント object-storage-key-std-sa-&ltencoded-sa> &ltnamespace>
k8su_&ltusername> Kubernetes ユーザー object-storage-key-std-user-&ltencoded-username> object-storage-access-keys

root ユーザーには 3 つの同一のシークレットがあり、複数のストレージ クラスとテナント カテゴリを含むデータセンターの構造を反映しています。一方、アプライアンスにはオブジェクト ストレージの単一の階層しかありません。root ユーザーに関連付けられている3 つのシークレットすべてを同時にローテーションする必要があります。

root ユーザーを除くユーザー識別子(UID)は、k8ssa_<namespace>_<sa> または k8su_<username> のいずれかの形式に準拠する必要があります。<encoded-sa> または <encoded-username> のいずれかを取得します。

echo -n 'UID_SUFFIX' | shasum -a 256 | cut -d " " -f 1 | xxd -r -p | base32 | awk '{print tolower($0)}' | sed 's/=*$//g'

UID の UID_SUFFIX<sa> に置き換えると、<encoded-sa> が得られます。

UID の UID_SUFFIX<username> に置き換えると、<encoded-username> が得られます。

ユーザー鍵をローテーションする

  1. OTS クラスタにログインします。

  2. オブジェクト ストレージ ユーザーの UID のリストを取得します。

    vserver object-store-server user show
    

    結果は UID のリストです。例については、Translate UID をご覧ください。リスト内の各 UID に対して次の手順を繰り返します。

  3. ターゲット ユーザーの古いアクセスキーとシークレット キーを取得します。

    set -privilege advanced
    vserver object-store-server user show -user UID
    

    UID は、ターゲット ユーザーの UID に置き換えます。

  4. オブジェクト ストレージ内のターゲット ユーザーの新しいアクセスキーとシークレット キーを生成します。このステップの後、古いキーと新しいキーが共存し、どちらもアクセスに使用できます。

    vserver object-store-server user regenerate-keys -vserver root-admin -user UID
    
  5. 新しいアクセスキーとシークレット キーで Kubernetes Secret を更新します。ルート インフラストラクチャ クラスタまたは管理クラスタのシークレットを更新するだけで、必要に応じてシークレットが他のクラスタに伝播されます。

    kubectl --kubeconfig KUBECONFIG patch secret -n SECRET_NAMESPACE SECRET_NAME --type='json' -p='[{"op": "replace", "path": "/data/access-key-id", "value": "'"$(echo -n "ACCESS_KEY" | base64)"'"}, {"op": "replace", "path": "/data/secret-access-key", "value": "'"$(echo -n "ACCESS_KEY" | base64)"'"}]'
    

    次のように置き換えます。

    • KUBECONFIG: kubeconfig へのパス。API サーバーは root ユーザーのコントロール プレーン API サーバーである必要があります。そうでない場合は、管理 API サーバーである必要があります。
    • SECRET_NAME: ユーザーの Secret 名。UID の変換セクションから取得できます。ユーザーに複数の Kubernetes Secret(root ユーザー)に置き換えて、コマンドを実行します。
    • SECRET_NAMESPACE: ユーザーの Secret 名前空間。UID の変換セクションから導出できます。
    • ACCESS_KEY: 前の手順で生成された新しいアクセスキー。
    • SECRET_KEY: 前の手順で生成された新しいシークレット キー。
  6. シークレットを使用するワークロードは、自動的に更新されるように実装する必要があります。そうでない場合は、ワークロードを再起動して、シークレットの変更を反映する必要があります。

    たとえば、root ユーザーの場合は、インフラストラクチャ クラスタで次のワークロードを再起動する必要があります。

    kubectl --kubeconfig KUBECONFIG rollout restart deployment obj-bucket-cm-backend-controller -n obj-system
    

検証

オブジェクト ストレージのバケットの作成オブジェクトのアップロードとダウンロードに沿って、新しいバケットを作成し、RBAC を使用してアクセス権を付与します。バケットが正常に作成され、サブジェクトにアクセスに必要な権限が付与されている場合、オブジェクト ストレージ キーのローテーションは完了します。