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ロールを持つユーザーとしてクラスターにアクセスできる。 -
TechPreviewNoUpgrade機能セットを有効にしたため、KMSEncryptionフィーチャーゲートが有効になります。 - 外部ホストされており、クラスターからアクセス可能な HashiCorp Vault Enterprise インスタンスがあります。Vault Enterprise は、クラスターサービスネットワーク内にホストしてはなりません。Vault Community Edition はサポートされていません。
Vault インスタンスを以下のように設定した。
-
マウントパス (デフォルトの
transit/パスなど) で Transit シークレットエンジンが有効になっています。 -
aes256-gcm96タイプを使用して暗号鍵を作成した (FIPS 140-3 に準拠する場合に推奨)。 - KMS プラグインがキー情報を暗号化、復号化、および読み取ることを許可する Vault ポリシー
-
ポリシーが添付された
AppRoleなどの認証方法が設定されています。
-
マウントパス (デフォルトの
- KMS プラグインイメージ用の SHA256 ダイジェストを含む、完全修飾 OCI イメージプル仕様書をお持ちです。イメージは、Red Hat Ecosystem Catalog または Docker Hub から入手できます。詳細は、HashiCorp Vault KMS プラグインコンテナーイメージおよび Red Hat Ecosystem Catalog を参照してください。非接続環境では、イメージはアクセス可能なレジストリーにミラーリングされます。
-
Skopeoとjqツールがインストールされています。 以下の機能を持つ Vault ポリシーを設定しました。
path "transit/encrypt/kms-key" { capabilities = ["update"] } path "transit/decrypt/kms-key" { capabilities = ["update"] } path "transit/keys/kms-key" { capabilities = ["read"] } path "sys/license/status" { capabilities = ["read"] }transit をTransit のマウントパスに、kms-key をVault Transit のキー名に置き換えてください。- etcd のバックアップを作成した。
手順
以下のコマンドを入力して、KMS プラグインイメージの SHA256 ダイジェストを取得します。
$ skopeo inspect docker://quay.io/redhat-isv-containers/698df066f8d1ddf179c15ef9:<version> | jq -r '.Digest'<version> を、お使いのクラスターと互換性のあるプラグインのバージョン (例:0.1.0-beta-ubi)に置き換えてください。結果として得られたダイジェストを使用して、
quay.io/redhat-isv-containers/698df066f8d1ddf179c15ef9@sha256:<digest>の形式で完全修飾プル仕様を構築します。以下のコマンドを入力して、Vault の認証情報を使用して
openshift-config名前空間にシークレットを作成します。$ oc create secret generic vault-approle-secret \ --from-literal=role-id=<your_role_id> \ --from-literal=secret-id=<your_secret_id> \ -n openshift-config<your_role_id>と<your_secret_id>を、ご自身の Vault AppRole の認証情報に置き換えてください。オプション:Vault サーバーがカスタム TLS 認証局を使用している場合は、次のコマンドを入力して、CA バンドルを含む config map を
openshift-config名前空間に作成します。$ oc create configmap vault-ca-bundle \ --from-file=ca-bundle.crt=<path_to_ca_bundle> \ -n openshift-config以下のコマンドを入力して、
APIServerカスタムリソースを編集します。$ oc edit apiserver clusterspec.encryptionセクションに KMS 設定を追加します。apiVersion: config.openshift.io/v1 kind: APIServer metadata: name: cluster spec: encryption: type: KMS kms: type: Vault vault: kmsPluginImage: <registry>/<repository>@sha256:<digest> vaultAddress: https://vault.example.com:8200 vaultNamespace: my-namespace vaultAuthNamespace: my-auth-namespace vaultKeyPath: transit/keys/kms-key tls: caBundle: name: vault-ca-bundle serverName: vault.example.com authentication: type: AppRole appRole: secret: name: vault-approle-secret各項目の説明:
kmsPluginImage- KMS プラグインコンテナーイメージを、SHA256 ダイジェスト付きの完全修飾 OCI プル仕様として指定します。イメージタグと短い名前は使用できません。非接続環境では、ミラーリングされた場所を使用してください。
vaultAddress- Vault サーバーの HTTPS URL を指定します。パス、クエリーパラメーター、およびフラグメントは許可されていません。
vaultNamespace- Vault の名前空間を指定します。この値はオプションです。
vaultAuthNamespace-
Transit ネームスペースと異なる場合に、認証に使用する Vault ネームスペースを指定します。デフォルトでは、
vaultNamespace の値が使用されます。この値はオプションです。 vaultKeyPath-
Transit 暗号化キーのパスを
<mount>/keys/<key_name>の形式で指定します。 tls.caBundle.name-
CA バンドルを含む
openshift-config名前空間内の config map を指定します。Vault がカスタム CA を使用する場合にのみ必要です。 tls.serverName- 証明書の検証に使用する TLS サーバー名を指定します。この値はオプションです。
認証.appRole.secret.name-
AppRole の認証情報を含む
openshift-config名前空間内のシークレット名を指定します。
保存して終了します。
kube-apiserver、openshift-apiserver、および認証Operator は、設定を検証し、新しいリビジョンを展開します。
検証
暗号化タイプを確認するには、以下のコマンドを入力します。
$ oc get apiserver cluster -o jsonpath='{.spec.encryption.type}'出力には
KMSが表示されます。以下のコマンドを入力して、KMS プラグインの健全性と設定の検証を確認してください。
$ oc get kubeapiserver cluster -ojsonpath='{.status.encryptionStatus}' | jq .preflight.result.statusにSucceededが表示され、healthReportsのすべてのノードにHealthyが表示されていることを確認してください。kube-apiserverのロールアウトの進捗を監視するには、以下のコマンドを入力します。$ oc get co kube-apiserverロールアウト時の出力例
NAME VERSION AVAILABLE PROGRESSING DEGRADED SINCE MESSAGE kube-apiserver 5.0.0-rc.4 True True False 35m NodeInstallerProgressing: 2 nodes are at revision 6; 1 node is at revision 7PROGRESSING がFalseと表示されたら、ロールアウトは完了です。以下のコマンドを入力して、暗号化移行のステータスを確認します。
$ oc get kubeapiserver cluster -o jsonpath='{.status.conditions[?(@.type=="Encrypted")]}' | jq .完了時の出力例
{ "lastTransitionTime": "2026-09-24T16:41:48Z", "message": "All resources encrypted: secrets, configmaps", "reason": "EncryptionCompleted", "status": "True", "type": "Encrypted" }etcd で暗号化を確認する前に、
理由がEncryptionCompletedと表示されるまで待ってください。etcd で秘密情報が暗号化されていることを確認します。
警告暗号化の検証を行う前に、すべてのコントロールプレーンノードで
kube-apiserver のロールアウトが完了するまで待ってください。ノードが以前のリビジョンを実行している間に作成されたシークレットは、KMS で暗号化されません。以下のコマンドを入力して、テスト用のシークレットを作成します。
$ oc create secret generic test-secret --from-literal=key=value -n default以下のコマンドを入力して、etcd Pod 名を取得します。
$ 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出力例
00000000 6b 38 73 3a 65 6e 63 3a 6b 6d 73 3a 76 32 3a 31 |k8s:enc:kms:v2:1|出力は
k8s:enc:kms:v2:で始まり、その後に暗号化されたバイナリーデータが続きます。以下のコマンドを入力して、テスト用のシークレットを削除します。
$ oc delete secret test-secret -n default