Google Distributed Cloud(GDC)エアギャップ アプライアンスは、ソフトウェア定義ストレージ ベンダーとして ONTAP Select(OTS)を採用しています。OTS には独自の認証システムがあり、各 ID(コアサービスまたはクライアント)には関連付けられた名前と鍵があります。
このドキュメントでは、次の対象に対して実行する必要がある認証鍵と証明書をローテーションする手順について説明します。
- デバイスのコンプライアンスと安全性を確保するための定期的な鍵のローテーション。
- キーの漏洩を防ぐことができます。公開されているキーはできるだけ早くローテーションする必要があります。
始める前に
次のアクセス権があることを確認します。
- ONTAP クラスタへの管理コンソール アクセス
- Management API サーバーの Kubeconfig
IPsec 認証情報(PSK)をローテーションする
ONTAP は、9.10.1 以降で IPsec の証明書ベースの認証をサポートしています。この GDC リリースは 9.14.1 で、事前共有キーを使用します。
アプライアンスの場合、IPsec は次の 2 種類の OTS トラフィックに実装されます。
- ベアメタル ホストと SVM 間の外部トラフィック。
- ワーカーノード間の内部トラフィック。
それぞれについて説明します。
前提条件
- ONTAP クラスタへの管理コンソール アクセス
- 新しい事前共有キー
- Management API サーバーの Kubeconfig
- StrongSwan 構成を更新するためのホストへのアクセス権
影響
IPsec ポリシーのローテーション中に、ホストでストレージ システムへの IP 接続が失われます。アプリケーションの動作によっては、接続が停止したり、失敗したりする可能性があります。可能であれば、ローテーション中にユーザー ワークロードを一時停止できますが、必須ではありません。シークレットがリセットされると、接続はすぐに復元されます。
OTS 外部トラフィックの鍵のローテーション
ローテーションを検証するには、次のコマンドを使用して出力を比較します。
export KUBECONFIG= #path to root-admin kubeconfig
kubectl get StorageEncryptionConnections -n gpc-system
出力:
NAME INVENTORYMACHINE STORAGEVIRTUALMACHINE STORAGECIDR PRESHAREDKEY READY AGE
bm-1ba9796c bm-1ba9796c root-admin 10.4.4.0/24 bm-1ba9796c-pre-shared-key True 6h16m
bm-96a5f32a bm-96a5f32a root-admin 10.4.4.0/24 bm-96a5f32a-pre-shared-key True 16h
bm-e07f4a4f bm-e07f4a4f root-admin 10.4.4.0/24 bm-e07f4a4f-pre-shared-key True 21h
スクリプトを以前に実行した特定のホストの READY
フィールドが true であることを確認します。
検証中にエラーが見つかった場合は、PSK を手動でローテーションします。
次のコマンドを実行します。
export KUBECONFIG= #path to root-admin kubeconfig
mgmt_ip="$(kubectl get storagecluster -A -o jsonpath='{.items[0].spec.network.clusterManagement.ip}')" username="$(kubectl get secret storage-root-level1 -n gpc-system -o jsonpath='{.data.username}' | base64 -d)" password="$(kubectl get secret storage-root-level1 -n gpc-system -o jsonpath='{.data.password}' | base64 -d)"
パスワードを表示してクリップボードにコピーします。
echo $password
ONTAP コンソールにログインします。
ssh $username@$mgmt_ip
パスワードの入力を求められたら、前の手順でコピーしたパスワードを貼り付けます。
認証情報のローテーションには、次のスクリプトを使用します。
export KUBECONFIG= #path to root-admin kubeconfig
kubectl get StorageEncryptionConnections -n gpc-system
出力:
NAME INVENTORYMACHINE STORAGEVIRTUALMACHINE STORAGECIDR PRESHAREDKEY READY AGE bm-1ba9796c bm-1ba9796c root-admin 10.4.4.0/24 bm-1ba9796c-pre-shared-key True 6h16m bm-96a5f32a bm-96a5f32a root-admin 10.4.4.0/24 bm-96a5f32a-pre-shared-key True 16h bm-e07f4a4f bm-e07f4a4f root-admin 10.4.4.0/24 bm-e07f4a4f-pre-shared-key True 21h
ローテーションするホストごとに、次のコマンドを実行できます。
export bm_host= //name of bm-host from above export secret="${bm_host}-pre-shared-key" export job_name="os-policy-config-host-ipsec-${bm_host}" export ns="gpc-system" export svm="$(kubectl get storageencryptionconnections "${bm_host}" -n "${ns}" -o jsonpath='{.spec.storageVirtualMachineRef.name}')"
ストレージ暗号化接続のすべてのコンポーネントが表示されていることを確認します。管理クラスタ接続(root-admin または organization-admin)の場合は、root-admin クラスタを使用する必要があります。
kubectl get secrets -n "${ns}" "${secret}" kubectl get jobs -n "${ns}" "${job_name}"
両方の項目が表示されている場合は、次の手順に進みます。そうでない場合は、停止して ipsec の変更を続行しないでください。テクニカル サポートにお問い合わせください。
kubectl delete secrets -n "${ns}" "${secret}" kubectl delete jobs "${job_name}" -n "${ns}"
Management API サーバーを使用して storageencryptionconnection を削除します。
export KUBECONFIG= #path to root-admin kubeconfig
kubectl delete storageencryptionconnections "${bm_host}" annotation_key="reconcile_annotation_key" annotation_value="reconcile_annotation_value" kubectl patch storagevirtualmachines "${svm}" -n "${ns}" --type=merge -p "{\"metadata\":{\"annotations\":{\"$annotation_key\":\"$annotation_value\"}}}" kubectl patch storagevirtualmachines "${svm}" -n "${ns}" --type=json -p="[{\"op\": \"remove\", \"path\": \"/metadata/annotations/$annotation_key\"}]"
OTS 内部トラフィックの鍵のローテーション
同様に、ローテーションを検証するには、次のコマンドを使用して出力を比較します。
export KUBECONFIG= #path to root-admin kubeconfig
kubectl get secret ots-internal-pre-shared-key -n gpc-system
出力:
NAME TYPE DATA AGE
ots-internal-pre-shared-key Opaque 1 18m
kubectl get jobs -n gpc-system | grep os-policy-config-host-ipsec
出力:
os-policy-config-host-ipsec-bm-3d33bb857t5bh Complete 1/1 17s 10m
os-policy-config-host-ipsec-bm-774fa8e6frgr7 Complete 1/1 30s 11m
os-policy-config-host-ipsec-bm-8e452fb29q5wd Complete 1/1 23s 11m
すべてのジョブが Complete
ステータスであることを確認します。
kubectl get StorageEncryptionConnections -n gpc-system
出力:
NAME INVENTORYMACHINE STORAGEVIRTUALMACHINE STORAGECIDR PRESHAREDKEY READY AGE
bm-3d33bb85 bm-3d33bb85 root-admin 10.4.4.0/24 bm-3d33bb85-pre-shared-key True 6h16m
bm-774fa8e6 bm-774fa8e6 root-admin 10.4.4.0/24 bm-774fa8e6-pre-shared-key True 16h
bm-8e452fb2 bm-8e452fb2 root-admin 10.4.4.0/24 bm-8e452fb2-pre-shared-key True 21h
すべてのホストで READY
フィールドが true であることを確認します。
ステップ 2 のすべての CR をリストされた順序で削除します。
内部トラフィックの Secret
sh kubectl delete secret ots-internal-pre-shared-key -n gpc-system
を削除する3 つの OS ポリシージョブをすべて削除します。
sh kubectl delete jobs os-policy-config-host-ipsec-bm-3d33bb857t5bh -n gpc-system kubectl delete jobs os-policy-config-host-ipsec-bm-774fa8e6frgr7 -n gpc-system kubectl delete jobs os-policy-config-host-ipsec-bm-8e452fb29q5wd -n gpc-system
3 つの storageencryptionconnection
sh kubectl delete StorageEncryptionConnections bm-3d33bb85-root-admin -n gpc-system kubectl delete StorageEncryptionConnections bm-774fa8e6-root-admin -n gpc-system kubectl delete StorageEncryptionConnections bm-8e452fb2-root-admin -n gpc-system
をすべて削除します。
数分間(3 ~ 5 分程度)待ちます。すべての CR が READY または Complete ステータスになるまで、ステップ 2 を繰り返します。
音量ボタンをローテーションする
このセクションでは、OTS ボリューム認証情報をローテーションする手動の手順について説明します。
始める前に
次の手順を行います。
- ノートパソコンの前提条件を満たしていることを確認します。
- BM01 または BM02 を介して OTS クラスタのコンソールにログインできることを確認します。
ボリューム鍵のローテーションを開始する
OTS コンソールで、1 回限りの鍵のローテーションをトリガーします。
volume encryption rekey start -vserver SVM_name -volume volume_name
次のコマンドは、SVMvs1
の vol1
の暗号鍵を変更します。
cluster1::> volume encryption rekey start -vserver vs1 -volume vol1
vserver とボリュームの名前を確認するには、show
コマンドを使用します。
vserver show
volume show
音量キーのローテーションを確認する
鍵のローテーションが開始されたら、再キー設定のステータスを確認します。
volume encryption rekey show
再キー設定オペレーションのステータスを表示します。
cluster1::> volume encryption rekey show
Vserver Volume Start Time Status
------- ------ ------------------ ---------------------------
vs1 vol1 9/18/2017 17:51:41 Phase 2 of 2 is in progress.
再キー設定オペレーションが完了したら、ボリュームで暗号化が有効になっていることを確認します。
volume show -is-encrypted true
暗号化されたボリュームを cluster1
に表示します。
cluster1::> volume show -is-encrypted true
Vserver Volume Aggregate State Type Size Available Used
------- ------ --------- ----- ---- ----- --------- ----
vs1 vol1 aggr2 online RW 200GB 160.0GB 20%
外部 HSM 証明書をローテーションする
このセクションでは、ONTAP の外部 HSM 証明書をローテーションして更新する方法について説明します。
前提条件
- ONTAP クラスタまたは関連する SVM への管理者アクセス権
- 現在のパスワード
- 適切なクラスタへの kubectl アクセス
手順
古い HSM 証明書をバックアップします。
kubectl get secret aa-aa-external-hsm-creds -n gpc-system -o yaml > external-hsm-creds-old.yaml
Kubernetes で HSM 証明書の Secret を更新します。
古いシークレット yaml ファイルをコピーします。
sh cp external-hsm-creds-old.yaml external-hsm-creds-new.yaml
新しい
external-hsm-creds-new.yaml
ファイルを、サーバー CA 証明書、公開クライアント証明書、クライアントの秘密鍵などの新しい HSM 認証情報で更新します。変更を適用して、HSM シークレット オブジェクトを更新します。
kubectl apply -f external-hsm-creds-new.yaml
ONTAP で HSM 証明書を更新します。
ONTAP CLI にログインします。
新しいサーバー CA 証明書をインストールします。
cluster::> security certificate install -type server-ca -vserver <>
新しいクライアント証明書をインストールします。
cluster::> security certificate install -type client -vserver <>
新しくインストールした証明書を使用するように、キー マネージャーの構成を更新します。
cluster::> security key-manager external modify -vserver <> -client-cert <> -server-ca-certs <>
検証
キーマネージャーのステータスで変更を確認します。
cluster::> security key-manager external show-status
キーサーバーが引き続き
Available
ステータスかどうかを確認します。
ストレージ管理者の認証情報をローテーションする
このセクションでは、ストレージ管理者のユーザーとパスワードをローテーションして設定する方法について説明します。
前提条件
- ONTAP クラスタまたは関連する SVM への管理者アクセス権
- 現在のパスワード
- 適切なクラスタへの kubectl アクセス
手順
次のコマンドで開始し、表示されるプロンプトに従います。
cluster::> security login password
シークレットを次のように更新します。
オプション 1(インタラクティブ):
kubectl edit secret -n <netapp_namespace> netapp_credential
エディタを使用して、パスワードを新しい base64 エンコード値に変更します。
オプション 2(jq 依存関係を含むパッチ):
k get secret -n <netapp_namespace> netapp_credential -o json | jq '.data["password"]="<new-base64-encoded-password>"' | kubectl apply -f -
ONTAP 緊急アクセス認証情報をローテーションする
ファイル ストレージとブロック ストレージの設定時に、ONTAP に直接アクセスするために使用できる緊急アクセス ユーザー アカウントが 4 つ作成されます。これらの認証情報は、Management API サーバーのシークレットとして取得できます。これらの認証情報が使用されたら、ローテーションする必要があります。
設定時に、レベル 1 とレベル 2 の 2 種類のシークレットが作成されます。レベル 1 は storage-root-level1 and storage-root-level1-backup
です。レベル 2 は storage-root-level2 and storage-root-level2-backup
です。レベル 2 のシークレットはセーフに保存する必要があります。各レベルには、通常とバックアップの 2 つのシークレットがあります。ソフトウェアは通常のシークレットとバックアップ シークレットの両方の削除を同時に処理しますが、セキュリティを強化するために、一度にローテーションするパートナー シークレットは 1 つだけにすることをおすすめします。
レベル 1 のシークレットは 90 日後に自動的にローテーションされますが、レベル 2 のシークレットはローテーションされません。いずれのタイプのシークレットも、使用する場合は次の手順で手動でローテーションする必要があります。
前提条件
- 必要なアクセス権: Management API サーバー
検証
- シークレットのローテーションは、シークレットが削除対象としてマークされたままかどうかを確認することで検証できます。そうでない場合、シークレットはローテーションされています。次の手順のステップ 1 に沿って確認します。
シークレットがレベル 2 のシークレットの場合は、物理メディアにコピーして金庫に保管します。次に、アノテーション
"disk.gdc.goog/persisted"
を使用して、シークレットを永続化済みとしてマークする必要があります。kubectl annotate secrets <secret_name> -n gpc-system disk.gdc.goog/persisted=''
検証中にエラーが見つかった場合は、次の手順に沿ってシークレットを手動でローテーションします。
手順
Secret が削除対象としてマークされているかどうかを確認します。
次のコマンドを実行します。
kubectl get secret <secret_name> -n gpc-system -o yaml
この例のように、
deletionTimestamp
フィールドがレスポンスに存在する場合、シークレットは削除対象としてマークされます。それ以外の場合は、そうではありません。apiVersion: v1 data: password: KFZbQTJdYjIwSUtVVV1aNytJJVM= username: cm9vdC1sdmwy immutable: true kind: Secret metadata: annotations: cluster-name: aa-aa-stge01 creationTimestamp: "2022-12-21T05:03:02Z" deletionGracePeriodSeconds: 0 deletionTimestamp: "2022-12-21T14:42:13Z" finalizers: - ontap.storage.private.gdc.goog/breakglass-finalizer labels: breakglass-secret: "true" name: storage-root-level2 namespace: gpc-system resourceVersion: "591897" uid: 6f331f8a-bf48-4d59-9725-6c99c5e766f7 type: Opaque
ONTAP へのアクセスに使用した後にシークレットをローテーションします。
- パートナー認証情報が存在し、削除対象としてマークされていないかどうかを確認します。削除対象としてマークされている場合は、続行せずに、後でこの手順に戻ります。
レベル 2 のシークレットがローテーションされている場合、
disk.gdc.goog/persisted
アノテーションを追加して、パートナー シークレットが永続化されていることをマークする必要があります。kubectl annotate secrets <secret_name> -n gpc-system disk.gdc.goog/persisted=''
次のコマンドを使用して、クラスタからシークレットを削除します。
kubectl delete secret <secret_name> -n gpc-system
この時点で、削除プロセスが開始されます(シークレットが削除対象としてマークされているかどうかを確認することで、削除プロセスが開始されたことを確認できます)。シークレットの削除と再生成には 1 時間近くかかることがあります。
ストレージ管理者と SVM 証明書をローテーションする
これらの証明書は、GDC によって ONTAP システムにインストールされたサーバー証明書です。
ストレージ管理者(クラスタ管理者)アカウント用の証明書が 1 つあります。名前の先頭には ONTAP システムのホスト名が付き、末尾には一意のハッシュが付きます。クラスタ管理 vserver にインストールされます。GDC は、管理タスクにこの証明書を内部的に使用します。
ONTAP SVM 用に定義されたサーバーサイド証明書もいくつかあります。これらは、SVM と通信するクライアントの信頼性を確立します。
すべての証明書は同じプロセスでローテーションできます。ルート管理クラスタのルート CA 証明書の不一致により、次の表に示されているクラスタ証明書と SVM 証明書のローテーションでは、それぞれのリスト内のすべての証明書をローテーションする必要があります。つまり、クラスタ証明書をローテーションする必要がある場合は、他のすべてのクラスタ証明書もローテーションする必要があります。SVM 証明書についても同様です。この制限は、自動証明書管理が実装されると解消されます。
前提条件
- ONTAP クラスタまたは関連する SVM への管理者アクセス権
- 適切な Kubernetes クラスタに対する kubectl アクセス権
- クライアント CA 証明書のインストール手順に沿って、クライアント CA 証明書を再インストールします。
証明書と Kubernetes Secret のマッピング
ONTAP にインストールされている証明書ごとに、証明書の詳細を含む対応する Kubernetes Secret が Management API サーバーにあります。GDC は証明書を生成します。証明書を置き換えるプロセスは簡単です。特定の証明書に対応する Secret を削除すると、証明書がすぐに再生成されます。新しい証明書は、古い証明書と置き換える形で ONTAP に手動でインストールできます。
kubectl get secrets -n <namespace> -s <secret> -o yaml
を使用して Kubernetes の証明書を検査し、security certificate show -vserver <svm_name>
から確認できる ONTAP の詳細と一致することを確認します。Namespace は常に「gpc-system」になります。Secret 名については、次の表をご覧ください。
証明書とシークレットのマッピングは、次の方法で確認することもできます。
kubectl get certificates -n <namespace>
関連するクラスタ証明書
ONTAP 共通名 | Vserver | K8S 証明書名 | Kubernetes Secret 名 | 説明 |
なし | <hostname> | <hostname>-admin-cert | <hostname>-admin-cert-secret | クラスタ管理者証明書 |
なし | <hostname> | <hostname>-server-cert | <hostname>-server-cert-secret | ONTAP サーバー証明書として使用される GDC 発行者によって署名されたサーバー証明書 |
なし | <hostname> | <hostname>-read-only-cert | <hostname>-read-only-cert-secret | 読み取り専用のモニタリング アクセス |
関連する SVM 証明書
Vserver | K8S 証明書名 | Kubernetes Secret 名 | 説明 |
root-admin | root-admin-server-cert | root-admin-server-cert-secret | SVM サーバー証明書として使用される GDC 発行元によって署名されたサーバー証明書 |
root-admin | root-admin-s3-server-cert | root-admin-s3-server-cert-secret | ONTAP S3 サーバー証明書として使用される GDC 発行者によって署名されたサーバー証明書 |
root-admin | root-admin-client-cert | root-admin-client-cert-secret | SVM 管理者アクセス |
root-admin | root-admin-s3-identity-client-cert | root-admin-s3-identity-client-cert-secret | S3 ID アクセス |
検証
Vserver 証明書
すべての証明書がローテーションされたら、ローテーションされたサーバー証明書に関連付けられているすべてのクラスタで、Trident バックエンドが正常に接続されていることを確認します。
次のコマンドを実行します。
export KUBECONFIG= #path to root-admin kubeconfig
kubectl get tridentbackendconfigs -n netapp-trident
出力は次のようになります。
NAME BACKEND NAME BACKEND UUID PHASE STATUS netapp-trident-backend-tbc-ontap-san iscsi-san a46ce1c7-26da-42c9-b475-e5e37a0911f8 Bound Success
PHASE
が Bound で、Status
が Success であることを確認します。
ルート管理者証明書
管理者証明書をテストするには、新しいテスト StorageVirtualMachine を作成し、GDC が適切に調整できることを確認します。手順は次のとおりです。
- 既存の StorageVirtualMachine を一覧表示し、テストとして複製するものを選択します。
- その Kubernetes 仕様を抽出します。
- 定義を編集して名前を変更し、不要なフィールドを削除します。
- テスト定義を適用します。
- StorageVirtualMachine のステータスが
Ready
になるまで待ちます。 - テスト StorageVirtualMachine を削除します。
- ONTAP から実際の SVM を削除します。
例
この例では、GDC NetApp Namespace gpc-system
を使用し、organization-root-user
を新しい SVM(test-svm
)に一時的に複製します。
SVM を一覧表示します。
kubectl get storagevirtualmachines -n ngpc-system
出力:
NAME AGE organization-root-admin 13d
仕様を抽出します。
kubectl get storagevirtualmachines -n gpc-system -o yaml > svm.yaml
次のように spec を編集します。
apiVersion: system.gpc.gke.io/v1alpha1 kind: StorageVirtualMachine metadata: labels: ontap.storage.gpc.gke.io/role: user name: test-svm namespace: netapp-alatl12-gpcstge02 spec: aggregates: - alatl12-gpcstge02-c1-aggr1 - alatl12-gpcstge02-c2-aggr1 clusterName: alatl12-gpcstge02 iscsiTarget: port: a0a-4 subnetName: root-svm-data nasServer: port: a0a-4 subnetName: root-svm-data svmNetwork: port: e0M subnetName: Default
クラスタに適用します。
kubectl create -f svm.yaml
新しい SVM の準備ができるまで待ちます。次の出力を定期的に確認します。
kubectl get storagevirtualmachines -n gpc-system test-svm
成功は次のように示されます。
Conditions: Last Transition Time: 2022-03-30T21:30:27Z Message: Observed Generation: 1 Reason: SVMCreated Status: True Type: Ready
または
AnsibleJobSucceed
。SVM リソースを削除します。
kubectl delete storagevirtualmachines -n gpc-system test-svm
ONTAP から完全に削除します。リソースを削除しても、ONTAP からは削除されません。
NetApp コンソールにログインして SVM を削除します。
alatl12-gpcstge02::> vserver delete test-svm
出力:
Warning: When Vserver "test-svm" is deleted, the following objects are automatically removed as well: LIFs: 7 Routes: 2 Admin-created login accounts: 2 Do you want to continue? {y|n}: y [Job 3633] Success
検証中にエラーが見つかった場合は、次の手順に沿って ONTAP 証明書を手動でローテーションします。
手順
上記の ONTAP 証明書名が該当しない場合は、ONTAP でローテーションする必要はありません。Kubernetes で証明書と Secret を検査し、Secret を削除します。
前の表の Secret 名を参照して、新しい証明書を生成します。
kubectl get certificates -n <namespace>
$ kubectl patch Certificates <cert_name> -n gpc-system \ --type=merge -p "{\"spec\":{\"privateKey\": {\"rotationPolicy\": \"Always\"}}}" $ kubectl delete secret -n <namespace> <secret_name>
特定の vserver にインストールされている証明書(ONTAP にインストールされ、該当なしとマークされていない証明書)を表示します。
cluster::> security certificate show -vserver <svm_name> -type server
Kubernetes で一致する Secret を検査します(前の表を参照)。
kubectl get certificates -n <namespace>
一致に満足したら、シークレットを削除して新しい証明書を生成します。
kubectl delete secret -n <namespace> <secret_name>
シークレットを再検査して、新しい証明書が再生成されたことを確認します。確認が完了したら、ONTAP で新しいサーバー証明書を作成します。次の手順は、接尾辞が「server-cert」の前の証明書に対してのみ実行します。
kubectl
などのツールを使用して新しい TLS 証明書の本文を直接抽出し、ONTAP にインストールします。$ gdch_cert_details -n <namespace> -s <secret_name> cluster::> security certificate install -vserver <svm_name> -type server
最初のプロンプトは次のようになります。
Please enter Certificate: Press <Enter> when done
tls.crt
と入力します。tls.crt
に複数の証明書ブロックがある場合は、最初のブロックを入力し、残りの証明書ブロックを中間証明書として保持して、次の手順で参照します。システムから
Please enter Private Key: Press <Enter> when done
というプロンプトが表示されます。tls.key
ファイルの内容を貼り付けて、Enter キーを押します。次に、
Do you want to continue entering root and/or intermediate certificates {y|n}:
というプロンプトが表示されます。tls.crt
ファイルに証明書が 1 つだけ含まれている場合は、N
と入力して Enter キーを押します。それ以外の場合は、「Y
」と入力して Enter キーを押します。Y
と入力した場合: 中間証明書の入力を求めるプロンプトが表示されます。tls.crt
ファイルから 1 つずつ貼り付け、そのたびに Enter キーを押します。最後に、ca.crt
ファイルからルート証明書を貼り付けて、Enter キーを押します。N
と入力した場合:(このプロンプトで証明書に関する対応は不要です)ONTAP はシリアル番号を返します。この番号は新しい証明書と CA のシリアル番号を表すため、記録しておきます。このシリアル番号は、以降のステップで
<new\_server\_serial>
および<new\_ca>
として参照されます。S3 サーバー証明書を構成する場合は、これらの証明書の手順に従わないでください。vserver とクラスタの SSL 構成の現在の状態を表示します。サーバー証明書の発行 CA、サーバー証明書の共通名、サーバー証明書のシリアル番号をメモしておきます。これらはそれぞれ
<old\_server\_common\_name>
、<old\_ca>
、<old\_server\_serial>
として参照されます。cluster::> security ssl show -vserver <vserver>
これにより、古いサーバー証明書情報を含む SSL 情報が返されます。SSL 構成を変更した後、この情報を参照して、更新されていることを確認できます。
SSL 構成を変更します。
cluster::> security ssl modify -server-enabled -client-enabled true -vserver <svm_name> -serial <new_server_serial> -ca <new_ca>
vserver とクラスタの SSL 構成の新しい状態を表示します。これで、インストールされたサーバー証明書のシリアル番号が更新されているはずです。
cluster::> security ssl show -vserver <vserver>
前の手順を確認したら、古いサーバー証明書を削除します。
cluster::> security certificate delete -vserver <svm_name> -common-name <old_server_common_name> -ca <old_ca> -type server -serial <old_server_serial>
クライアント CA 証明書
次のコマンドを使用して、
gpc-system
Namespace のtrust-store-internal-only
ConfigMap からすべての CA 証明書を取得します。kubectl get cm -n gpc-system trust-store-internal-only -o jsonpath='{.data.ca\.crt}'
前の手順で取得した CA 証明書ごとに、ONTAP クラスタで次のコマンドを実行します。
cluster::> security certificate install -vserver <svm_name> -type client-ca
次のプロンプトが表示されます。
Please enter Certificate: Press <Enter> when done.
手順 1 で取得した各証明書ブロックを貼り付けて、Enter キーを押します。CA 証明書ごとにこのインストール コマンドを繰り返します。
Harvest 証明書をローテーションする
ハーベスト証明書の生成は <hostname>-read-only-cert-secret
に依存します。続行する前に、<hostname>-read-only-cert-secret
がローテーションされていることを確認します。
Harvest Pod にインストールされている証明書を表示します。
export KUBECONFIG= #path to root-admin kubeconfig
cluster_name="$(kubectl get storagecluster -A -o jsonpath='{.items[0].metadata.name}')" secret_name="$cluster_name"-read-only-cert-secret
export TLS_CRT="$(kubectl get secret -n gpc-system $secret_name -o jsonpath='{.data.tls\.crt}')"
export TLS_KEY="$(kubectl get secret -n gpc-system $secret_name -o jsonpath='{.data.tls\.key}')"
export CA_CRT="$(kubectl get secret -n gpc-system $secret_name -o jsonpath='{.data.ca\.crt}')"
Harvest 認証情報 Secret にパッチを適用して、更新された証明書を提供します。
$ kubectl patch secret \ -n gpc-system netapp-harvest-configuration-credential \ -p "{\"data\":{\"tls.crt\":\"${TLS_CRT:?}\",\"tls.key\":\"${TLS_KEY:?}\",\"ca.crt\":\"${CA_CRT:?}\"}}"
Harvest サービスを再起動して、更新された構成を読み込みます。
kubectl delete pod -n gpc-system -l 'app=harvest.netapp.io'
ファイル システム証明書をローテーションする
次のコマンドを実行して、file-storage-webhooks-serving-cert
と file-observability-backend-target-cert
の証明書を再生成します。
kubectl delete secret file-storage-webhooks-serving-cert -n file-system
kubectl delete secret file-observability-backend-target-cert -n file-system
Pod を再起動して、更新された構成を読み込みます。
kubectl delete pod -n file-system -l 'app=file-observability-backend-controller'
kubectl delete pod file-storage-backend-controller -n file-system
Trident と ONTAP の証明書をローテーションする
Trident は ONTAP と通信する必要があります。これは、先ほど定義したクライアント証明書 <svm\_name>-client-cert-secret>
を使用する Trident バックエンドで構成されます。クライアント証明書のローテーションは Trident の一部ではありませんが、Trident はこの証明書の一部に依存しているため、更新する必要があります。
手順
CA 証明書の更新の場合:
KUBECONFIG
をエクスポートして、問題の Trident コンポーネントに固有のクラスタの kubeconfig を指定します。各クラスタには Trident が構成されます。client-cert シークレットから base64 でエンコードされた CA 証明書を取得し、変数として保存します。
ca_cert=$(kubectl get secrets -n "${ns}" "${secret}" -o jsonpath='{.data.ca\.crt}')
tridentBackendConfig オブジェクトにパッチを適用します。
kubectl patch tridentBackendConfigs netapp-trident-backend-tbc-ontap-san -n netapp-trident --type=merge -p "{\"spec\":{\"trustedCACertificate\":\"$ca_cert\"}}"
実際のクライアント証明書と鍵の場合:
client-cert シークレットから base64 エンコードされた TLS 証明書を取得し、変数として保存します。
tls_cert=$(kubectl get secrets -n "${ns}" "${secret}" -o jsonpath='{.data.tls\.crt}')
client-cert シークレットから base64 で二重エンコードされた TLS 鍵を取得し、変数として保存します。
tls_key=$(kubectl get secrets -n "${ns}" "${secret}" -o jsonpath='{.data.tls\.key}' | base64 -w 0)
秘密鍵を使用してバックエンド シークレットを更新します。
kubectl patch secrets netapp-trident-backend-tbc-ontap -n netapp-trident --type=merge -p "{\"data\":{\"clientPrivateKey\": \"$tls_key\"}}"
TLS 証明書を使用してバックエンド構成をパッチ適用します。
kubectl patch tridentBackendConfigs netapp-trident-backend-tbc-ontap-san -n netapp-trident --type=merge -p "{\"spec\":{\"clientCertificate\":\"$tls_cert\"}}"
Trident コントローラ証明書をローテーションする
Trident コンテナは Trident Operator と通信する必要があります。この通信は HTTPS 経由で行われ、サーバー証明書とクライアント証明書をこの一部として管理する必要があります。
検証
daemonset と Deployment(該当する場合)の両方が正常な状態で起動していることを確認します。
検証中にエラーが見つかった場合は、次の手順に沿ってサーバー証明書とクライアント証明書を手動でローテーションします。
手順
サーバー証明書とクライアント証明書の両方に、ONTAP 側に対応する証明書がありません。これらはクラスタに厳密に含まれています。
有効期限が切れる証明書に対応するシークレットを削除します。
kubectl delete secret -n netapp-trident <secret_name>
netapp-trident-csi daemonset を再起動します。
kubectl rollout restart daemonset netapp-trident-csi -n netapp-trident
サーバー証明書のローテーションでは、netapp-trident-csi デプロイも再起動する必要があります。
kubectl rollout restart deployments netapp-trident-csi -n netapp-trident
Trident CA 証明書
CA 証明書は、Trident サーバーとクライアントの証明書に署名するための認証局を提供するために使用されます。
証明書名 | Namespace | シークレット | 説明 |
netapp-trident-csi-cert | netapp-trident | netapp-trident-csi-cert | Trident CA 証明書 |
検証
シークレットが再生成されたことを確認できます。クライアント証明書とサーバー証明書を有効にするには、この証明書のローテーション後に、前述の手順に沿って Trident コントローラの証明書をローテーションすることもできます。
検証中にエラーが見つかった場合は、次の手順に沿って CA 証明書を手動でローテーションします。
手順
この鍵をローテーションするには、Kubernetes から Secret を削除するだけで済みます。
kubectl delete secret -n netapp-trident <secret_name>
Trident CSI ノードと SVM(データ)
これは、ブロック アクセスのデータプレーンへのアクセスを有効にするための、SVM 全体の iSCSI CHAP 認証情報セットです。これはファイル プロトコルには適用されません。
Management API サーバー
Namespace | シークレット | 説明 |
gpc-system | <organization>-<type>-svm-credential | Trident の設定に必要な SVM 構成 |
組織管理者と Management API サーバー
Namespace | シークレット | 説明 |
gpc-system | <organization>-<type>-svm-credential | Trident の設定に必要な SVM 構成 |
netapp-trident | netapp-trident-backend-tbc-ontap | Trident バックエンドの管理に必要なシークレット |
検証
バックエンドが正常に構成されていることを確認します。
#export kubeconfig of org cluster export KUBECONFIG= #path to root-admin kubeconfig kubectl get tridentBackendConfigs -n netapp-trident
バックエンドのステータスが
Success
であることを確認します。
検証中にエラーが見つかった場合は、次の手順でシークレットを手動でローテーションします。
手順
イニシエータ シークレットとターゲット イニシエータ シークレットの両方について、特殊文字を含まない長さ 16 の新しいランダム文字列を生成します。
#export kubeconfig of Management API server
export KUBECONFIG= #path to root-admin kubeconfig
initiator_secret=$(head /dev/random | tr -dc A-Za-z0-9 | head -c16 | base64)
target_secret=$(head /dev/random | tr -dc A-Za-z0-9 | head -c16 | base64)
kubectl patch secrets -n gpc-system "$org-$type-svm-credential" --type=merge -p "{\"data\":{\"initiatorSecret\": \"$initiator_secret\", \"targetSecret\": \"$target_secret\"}}"
#export kubeconfig of org cluster
export KUBECONFIG= #path to root-admin kubeconfig
kubectl patch secrets -n netapp-trident netapp-trident-backend-tbc-ontap --type=merge -p "{\"data\":{\"chapInitiatorSecret\": \"$initiator_secret\", \"chapTargetInitiatorSecret\": \"$target_secret\"}}"
Trident AES 鍵
AES 鍵は、Trident の内部使用のために iSCSI CHAP 認証情報を暗号化するために Trident によって内部的に使用されます。これは 32 バイトの長さでなければならないランダムな文字シーケンスです。
Trident を実行しているクラスタ(root/org-admin/user/system クラスタ)
Namespace | シークレット | 説明 |
netapp-trident | netapp-trident-aes-key | Trident が iSCSI CHAP 認証情報を暗号化するために必要な AES 鍵 |
検証
バックエンドが正常に構成されていることを確認します。
#export kubeconfig of org cluster export KUBECONFIG= #path to root-admin kubeconfig kubectl get tridentBackendConfigs -n netapp-trident
バックエンドのステータスが
Success
であることを確認します。テスト ボリュームを作成しようとする:
pvc 情報を含む YAML ファイルを作成します。
echo " kind: PersistentVolumeClaim apiVersion: v1 metadata: name: block-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi storageClassName: standard-rwo" > pvc.yaml
Kubernetes クラスタに適用します。
kubectl apply -f pvc.yaml
iSCSI 暗号化による CSI ログのエラーがないことを確認します。
kubectl logs deploy/netapp-trident-csi -n netapp-trident -c trident-main | grep "Error encrypting"
エラーがなかった場合、ログは返されません。
ファイルと PVC をクリーンアップします。
kubectl delete -f pvc.yaml rm -f pvc.yaml
検証中にエラーが見つかった場合は、次の手順に沿って鍵を手動でローテーションします。
手順
このキーをローテーションする前に、クラスタに PV を含む保留中の Pod がないことを確認してください。ある場合は、完全にプロビジョニングされるまで待ってから鍵をローテーションします。
aesKey の特殊文字を含まない 32 文字の新しいランダム文字列を生成します。
#export kubeconfig of org cluster
export KUBECONFIG= #path to root-admin kubeconfig
aes_key=$(head /dev/random | tr -dc A-Za-z0-9 | head -c32 | base64)
#save old key just in case of errors
old_key=$(kubectl get secrets -n netapp-trident "netapp-trident-aes-key" -o jsonpath='{.data.aesKey}')
kubectl patch secrets -n netapp-trident "netapp-trident-aes-key" --type=merge -p "{\"data\":{\"aesKey\": \"$aes_key\"}}"
kubectl rollout restart deployment netapp-trident-csi -n netapp-trident
ロールバック
エラーが発生した場合は、最後に使用した認証情報にロールバックします。
kubectl patch secrets -n netapp-trident "netapp-trident-aes-key" --type=merge -p "{\"data\":{\"aesKey\": \"$old_key\"}}" kubectl rollout restart deployment netapp-trident-csi -n netapp-trident
確認手順をやり直します。