ACK Serverless Proクラスターでは、Key Management Service (KMS) で作成されたキーを使用してKubernetes Secretsを暗号化できます。 これにより、情報漏洩のリスクが低減される。 このトピックでは、KMSが管理するキーを使用して、既存のACK Serverless ProクラスターのSecretsを暗号化する方法について説明します。
目次
前提条件
項目 | 説明 |
KMSキー | KMSコンソールでKMSキーが作成されます。 キーは、ACK Serverless Proクラスターが存在するリージョンに属します。 ACK Serverless Proクラスターは、デフォルトキー、ソフトウェア保護キー、およびハードウェア保護キーをサポートしています。 KMSのキー管理機能の詳細については、「キーの使い始め方」をご参照ください。 KMS課金の詳細については、「課金」をご参照ください。 重要 Secret暗号化を有効にした後、KMS APIまたはKMSコンソールを使用して、Secretsの暗号化と復号化に使用するキーを無効化または削除したり、キーを削除するスケジュールを作成したりしないでください。 そうしないと、APIサーバーが利用できなくなり、Secretsまたはサービスアカウントオブジェクトを取得できなくなります。 その結果、サービスの中断が発生する。 |
承認 | 次の要件を満たす必要があります。
|
制限
シークレット暗号化は、既存のACK Serverless Proクラスターに対してのみ有効にできます。 ACK Serverless Proクラスターを作成する場合、この機能は有効にできません。
シークレット暗号化の概要
Kubernetes Secretsは、アプリケーションのパスワード、Transport Layer Security (TLS) 証明書、Dockerイメージをダウンロードするための資格情報などの機密データを保存および管理するために使用されます。 KubernetesはクラスターのetcdにSecretsを保存します。 詳細については、「シークレット」をご参照ください。
ACK Proクラスターを使用すると、KMSで作成されたキーを使用してSecretsを暗号化できます。 KubernetesのKMSプロバイダーメカニズムは、暗号化中に使用されます。 KMSプロバイダーは、エンベロープ暗号化を使用して、etcdに保存されているSecretsを暗号化および復号します。 シークレットの暗号化と復号化の手順:
Kubernetes Secretを使用してパスワードを保存すると、APIサーバーはランダムデータ暗号化キー (DEK) を生成してシークレットを暗号化します。 次に、APIサーバーはDEKをKMSに送信します。 KMSは、指定されたキーを使用してDEKを暗号化し、暗号化されたDEKをAPIサーバーに返します。 APIサーバーは、暗号化されたSecretとDEKをetcdに保存します。
Kubernetes Secretを復号化すると、システムはKMSのdecrypt操作を呼び出して、最初にDEKを復号化します。 次に、システムはプレーンテキストDEKを使用してKubernetes Secretを復号し、復号されたSecretを返します。
詳細については、「KMSプロバイダー」および「エンベロープ暗号化の使用」をご参照ください。
既存のACK Serverless Proクラスターのシークレット暗号化を有効にする
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、Secret暗号化を有効にするACK Serverless Proクラスターの名前をクリックします。 クラスターの詳細ページで、[基本情報] タブをクリックします。 [基本情報] セクションで、[秘密の暗号化] をオンにします。
表示されるダイアログボックスで、作成したキーを選択し、[OK] をクリックします。
[クラスター] ページで、クラスターのステータスが [更新中] から [実行中] に変更された場合、クラスターのシークレット暗号化機能が有効になります。
シークレット暗号化機能が不要になった場合は、[基本情報] セクションの [シークレット暗号化] をオフにできます。
自動キーローテーションを使用してSecretsを暗号化する
KMSが提供する自動キーローテーション機能を使用して、Secretsを暗号化できます。 キーローテーション中、システムは元のキーを使用して既存のシークレットを暗号化し、新しいキーを使用して新しいシークレットを暗号化します。 自動キーローテーションの詳細については、「キーローテーションの設定」をご参照ください。
新しいキーを使用して既存のSecretsを暗号化するように強制するには、キーをローテーションした後に次のコマンドを実行します。
kubectl get secrets --all-namespaces -o json | kubectl annotate --overwrite -f - encryption-key-rotation-time="$(date -u +'%Y-%m-%dT%H:%M:%S%z')"
よくある質問
シークレット暗号化を有効にした後、kubectlを使用してシークレットを照会すると、暗号文が返されますか?
いいえ。 シークレットの暗号化を有効にすると、kubectlを使用してシークレットを照会すると、プレーンテキストが返されます。 シークレット暗号化機能は、etcdに格納されているシークレットを暗号化します。 シークレット暗号化を有効にすると、シークレットは暗号文としてetcdに保存されます。 ただし、kubectlクライアントを使用してクラスターのAPIサーバーが提供するSecret APIを呼び出してSecretを照会すると、シークレットのプレーンテキストが返されます。
RAMユーザーまたはRAMロールが既存のACK Proクラスターのシークレット暗号化機能を有効または無効にすることを禁止するにはどうすればよいですか。
RAMユーザーまたはRAMロールが既存のACK Proクラスターののシークレット暗号化機能を有効または無効にすることを禁止するには、RAMユーザーまたはRAMロールに次のポリシーをアタッチします。 詳細については、「カスタムRAMポリシーの作成」をご参照ください。
{
"Action": [
"cs:UpdateKMSEncryption"
],
"Effect": "Deny",
"Resource": [
"*"
]
}