6.2. Kubernetes KMS v2 の設定
etcd の外部 KMS 暗号化を設定することで、鍵管理を一元化し、規制遵守要件を満たすことができます。
Kubernetes KMS v2 は、テクノロジープレビュー版の機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
6.2.1. KMS 暗号化を有効にする リンクのコピーリンクがクリップボードにコピーされました!
etcd データに対して外部キー管理サービス (KMS) 暗号化を有効にすることで、キー管理を一元化し、コンプライアンス要件を満たすことができます。
前提条件
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。 -
KMSEncryptionフィーチャーゲートを有効にするために、TechPreviewNoUpgrade機能セットを有効にしました。 -
コントロールプレーンノードからアクセス可能な
HashiCorp Vault Enterpriseインスタンスがあります。Vault Community Edition はご利用いただけません。 - コントロールプレーンノードは、Vault サーバーへのネットワークアクセス権を持っています。
Vault インスタンスを以下のように設定しました。
-
Transit シークレットエンジンがデフォルトの
transit/マウントパスで有効になっています -
暗号鍵は、
aes256-gcm96タイプで作成されました (FIPS 140-3 準拠に推奨)。 - Kubernetes KMS v2 プラグインがキー情報を暗号化、復号化、および読み取ることを許可する Vault ポリシー
-
ポリシーが添付されている認証方法 (トークン、
AppRole、またはuserpass)
-
Transit シークレットエンジンがデフォルトの
Kubernetes KMS v2 プラグインには、以下の機能を備えた Vault ポリシーが必要です。
path "transit/encrypt/kms-key" {
capabilities = ["update"]
}
path "transit/decrypt/kms-key" {
capabilities = ["update"]
}
path "transit/keys/kms-key" {
capabilities = ["read"]
}
path "auth/token/lookup-self" {
capabilities = ["read"]
}
別の名前を使用する場合は、kms-key を Vault Transit キーの名前に置き換えてください。
KMS 暗号化を有効にする前に、etcd のバックアップを作成してください。
手順
各コントロールプレーンホストに KMS プラグインを静的 Pod としてデプロイします。
-
プラグインを
unix:///var/run/kmsplugin/kms.sockでリッスンするように設定してください。 -
静的 Pod の場合、
/var/run/kmsplugin をhostPathとしてマウントします。 - KMS プロバイダーの接続詳細と認証情報を設定します。
以下の手順では、
HashiCorpVault KMS プラグインを静的 Pod としてデプロイする方法を示します。-
プラグインを
静的な Pod マニフェストファイルを作成します。
$ cat > /tmp/vault-kms-plugin.yaml <<'EOF' apiVersion: v1 kind: Pod metadata: name: vault-kms-plugin namespace: kube-system labels: app: vault-kms-plugin tier: control-plane spec: priorityClassName: system-node-critical hostNetwork: true containers: - name: vault-kms-plugin image: quay.io/redhat-isv-containers/698df066f8d1ddf179c15ef9:<version> command: - /vault-kubernetes-kms - -vault-address=<https://vault.example.com:8200> - -<vault_namespace>=admin - -auth-method=userpass - -userpass-username=<vault_username> - -userpass-password=<vault_password> - -transit-mount=transit - -transit-key=kms-key - -socket=unix:///var/run/kmsplugin/kms.sock volumeMounts: - name: kmsplugin mountPath: /var/run/kmsplugin resources: requests: cpu: 100m memory: 128Mi limits: cpu: 500m memory: 512Mi securityContext: privileged: true volumes: - name: kmsplugin hostPath: path: /var/run/kmsplugin type: DirectoryOrCreate EOFご使用の環境に合わせて、以下の値を置き換えてください。
- <version>
-
Vault KMS プラグインのイメージバージョンタグ。
0.1.0-beta-ubiを使用してください。 - <vault_username>
- 認証に使用する Vault ユーザー名。
- <vault_password>
- 認証用の Vault パスワードを入力してください。
- https://vault.example.com:8200
- 保管庫のアドレス。このフィールドを、ご使用の Vault サーバーの URL に合わせて更新してください。
- <vault_namespace>
オプションフィールド。
マニフェストでは、OpenShift Container Platform に推奨されているイメージである、Quay.io の Red Hat 認定コンテナーイメージ (
quay.io/redhat-isv-containers/698df066f8d1ddf179c15ef9) を使用しています。注記または、イメージフィールドを
docker.io/hashicorp/vault-kube-kms:0.1.0-beta-ubiに置き換えることで、Docker Hub の HashiCorp イメージを 使用することもできます。
以下のコマンドを実行して、静的 Pod マニフェストを各コントロールプレーンノードにデプロイします。
$ MANIFEST=$(cat /tmp/vault-kms-plugin.yaml | base64) $ for node in $(oc get nodes --selector=node-role.kubernetes.io/master -o name | cut -d/ -f2); do echo "Deploying to $node..." oc debug node/$node -- chroot /host bash -c \ "echo '$MANIFEST' | base64 -d > /etc/kubernetes/manifests/vault-kms-plugin.yaml" donekubelet は
/etc/kubernetes/manifests/から静的 Pod を自動的に検出して起動します。以下のコマンドを入力して、静的 Pod が実行されていることを確認してください。
$ oc get pods -n kube-system -o wide | grep vault-kms出力例
vault-kms-plugin-ip-10-0-16-7.compute.internal 1/1 Running 0 2m 10.0.16.7 vault-kms-plugin-ip-10-0-32-93.compute.internal 1/1 Running 0 2m 10.0.32.93 vault-kms-plugin-ip-10-0-69-106.compute.internal 1/1 Running 0 2m 10.0.69.106静的な Pod 名には、ノード名が接尾辞として含まれます。コントロールプレーンノードごとに 1 つの Pod が表示されるはずです。
以下のコマンドを入力して、コントロールプレーンノード上にソケットが存在することを確認します。
$ oc debug node/<node_name> -- chroot /host ls -la /var/run/kmsplugin/kms.sock出力例
srwxr-xr-x. 1 root root 0 <timestamp> /var/run/kmsplugin/kms.sock注記静的 Pod は各ノード上の kubelet によって管理され、
oc delete pod コマンドでは削除できません。静的 Pod を削除するには、各コントロールプレーンノードの/etc/kubernetes/manifests/ディレクトリーからマニフェストファイルを削除してください。以下のコマンドを入力して、
APIServer のカスタムリソースを編集します。$ oc edit apiserver clusterspec.encryptionセクションに KMS 設定を追加します。apiVersion: config.openshift.io/v1 kind: APIServer metadata: name: cluster spec: encryption: type: KMS保存して終了します。
移行は自動的に開始されます。
kube-apiserver、openshift-apiserver、およびoauth-apiserver のOperator が再起動され、新しいリビジョンが展開されます。注記openshift-apiserverと認証オペレーターは、通常 5-10 分で移行を完了します。kube-apiserverオペレーターは、保守的なロールアウトストラテジーを採用しており、一度に 1 つのコントロールプレーンノードを更新し、次のノードに進む前にヘルスチェックを待機します。この処理には、クラスターの負荷状況によっては 30 分以上かかる場合があります。
検証
暗号化の種類を確認するには、以下のコマンドを入力してください。
$ oc get apiserver cluster -o jsonpath='{.spec.encryption.type}'出力には
KMSが表示されるはずです。kube-apiserver の展開状況を監視するには、以下のコマンドを入力してください。$ oc get kubeapiserver cluster -o jsonpath='{.status.nodeStatuses}' | jq -r '.[] | "\(.nodeName | split(".")[0]): current=\(.currentRevision) target=\(.targetRevision)"'展開中の出力例
ip-10-0-16-166: current=10 target=0 ip-10-0-32-93: current=9 target=10 ip-10-0-69-106: current=9 target=0オペレーターは一度に 1 つのノードずつ展開します。すべてのノードで
現在のリビジョンが同じになり、ターゲットが0になった時点で、ロールアウトは完了です。以下のコマンドを入力して、暗号化移行のステータスを確認してください。
$ oc get kubeapiserver cluster -o jsonpath='{.status.conditions[?(@.type=="Encrypted")]}' | jq .完了時の出力例
{ "lastTransitionTime": "2026-05-15T17:39:02Z", "message": "All resources encrypted: secrets, configmaps", "reason": "EncryptionCompleted", "status": "True", "type": "Encrypted" }etcd で暗号化の検証に進む前に、
理由がEncryptionCompletedと表示されるまで待ってください。etcd 内のシークレットが暗号化されていることを確認する:
警告暗号化の検証を行う前に、すべてのコントロールプレーンノードで
kube-apiserver のロールアウトが完了するまで待ってください。展開中は、API リクエストはノード全体に分散されるため、一部のノードがまだ以前のリビジョンを使用している間に作成されたシークレットは、Kubernetes KMS v2 では暗号化されません。以下のコマンドを入力して、テスト用のシークレットを作成します。
$ oc create secret generic test-secret --from-literal=key=value -n default以下のコマンドを入力して、etcdPod 名を取得します。
$ oc get pods -n openshift-etcd -l app=etcd -o name | head -1以下のコマンドを入力して、etcd 内の秘密データを確認してください。
$ oc exec -n openshift-etcd <etcd_pod_name> -- etcdctl get /kubernetes.io/secrets/default/test-secret --print-value-only | hexdump -C | head -1出力は
k8s:enc:kms:v2:で始まり、その後に暗号化されたバイナリーデータが続くはずです。以下のコマンドを入力して、テストシークレットを削除してください。
$ oc delete secret test-secret -n default