Alibaba Cloud Key Management Service (KMS) を使用すると、ACK Edge Pro クラスターの etcd に格納された Kubernetes シークレットを暗号化できます。これにより、etcd のデフォルトアクセス制御に加えて、追加の保護レイヤーが提供されます。本トピックでは、ACK Edge Pro クラスターにおけるシークレット暗号化の有効化および管理方法について説明します。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
クラスターと同じリージョンの KMS キー。 ACK Edge Pro クラスターは、デフォルトキー、ソフトウェアで保護されたキー、およびハードウェアで保護されたキーをサポートしています。詳細については、「Key Management の使い始め」および「課金」をご参照ください。
100.64.0.0/10 へのアウトバウンドネットワークアクセス。 Secret の暗号化が有効化されると、コントロールプレーンは KMS API を呼び出して Secret を暗号化および復号します。セキュリティグループまたは VPC ネットワーク ACL のアウトバウンドルールで、CIDR ブロック 100.64.0.0/10 へのトラフィックを許可する必要があります。詳細については、「クラスターのセキュリティグループを設定する」をご参照ください。
アカウントタイプに応じた必要な権限付与:
Alibaba Cloud アカウント: アカウントが
AliyunCSManagedSecurityRoleロールを偽装できるよう権限付与されている必要があります。権限付与されていない場合、有効化時に ACK コンソールから自動的に権限付与のプロンプトが表示されます。あるいは、「RAM クイック権限付与」ページに移動し、権限付与を完了してください。RAM ユーザーまたは RAM ロール: クラスターに対する管理者または O&M エンジニアのロールベースアクセス制御 (RBAC) 権限が必要です (「RAM ユーザーまたは RAM ロールに RBAC 権限を付与する」をご参照ください)。また、
AliyunKMSCryptoAdminAccess権限が付与されている必要があります (「RAM ユーザーまたは RAM ロールに権限を付与する」をご参照ください)。
制限事項
暗号化キーを削除または無効化しないでください。 シークレット暗号化を有効化した後は、KMS API または KMS コンソールを使用してキーを無効化または削除しないでください。キーが削除された場合、API サーバーはシークレットおよびサービスアカウントオブジェクトを復号できなくなり、サービス中断を引き起こします。
リージョン制約。 KMS キーは、ACK Edge Pro クラスターと同じリージョンに属している必要があります。
仕組み
Kubernetes シークレットは、アプリケーションのパスワード、トランスポート層セキュリティ (TLS) 証明書、Docker イメージのダウンロード認証情報などの機密データを格納・管理するために使用されます。ACK Edge Pro クラスターでは、Kubernetes の KMS プロバイダー機構を活用しており、etcd に格納されたシークレットに対してエンベロープ暗号化を実装しています。
暗号化フロー:
シークレットが格納される際、API サーバーがランダムなデータ暗号化キー (DEK) を生成し、これを用いてシークレットを暗号化します。
API サーバーが DEK を KMS に送信します。KMS は指定された KMS キーを使用して DEK を暗号化し、暗号化済みの DEK を返します。
API サーバーは、暗号化済みのシークレットと暗号化済みの DEK の両方を etcd に格納します。
復号フロー:
シークレットが読み取られる際、API サーバーが暗号化済みの DEK を KMS に送信し、KMS キーを用いて復号します。
API サーバーは、プレーンテキストの DEK を使用してシークレットを復号し、プレーンテキストのシークレットを返します。
基盤となるメカニズムに関する背景情報については、「KMS プロバイダー」および「エンベロープ暗号化の使用」をご参照ください。
新規クラスターでのシークレット暗号化の有効化
ACK コンソールにログインします。左側ナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページの右上隅で、[Kubernetes クラスターの作成] をクリックします。
[クラスターの作成] ページで、[ACK Edge] タブをクリックします。タブの下部までスクロールし、[高度なオプション (任意)] をクリックします。[シークレット暗号化] パラメーターを見つけ、[キーの選択] をクリックして、ドロップダウンリストからキー ID を選択します。まだ KMS キーを作成していない場合は、[キーの作成] をクリックして KMS コンソール を開き、キーを作成します。詳細については、「CMK の作成」をご参照ください。その他のクラスター構成オプションについては、「ACK Edge クラスターの作成」をご参照ください。

ActionTrail を使用して、シークレット暗号化が有効になっていることを確認します。まず、ActionTrail コンソール にログインします。左側ナビゲーションウィンドウで、[イベント] > [イベントクエリ] を選択します。[イベントクエリ] ページで、暗号化および復号イベントログに
aliyuncsmanagedsecurityroleシステムロールが表示されることを確認します。
既存クラスターでのシークレット暗号化の有効化
シークレット暗号化を有効化した後は、KMS API または KMS コンソールを使用して、シークレットの暗号化および復号に使用されるキーを無効化または削除しないでください。そうしないと、API サーバーが利用不可となり、シークレットおよびサービスアカウントオブジェクトを取得できなくなり、サービス中断を引き起こします。
ACK コンソール にログインします。左側ナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、ご利用の ACK Edge Pro クラスターの名前をクリックします。クラスター詳細ページで、[基本情報] タブをクリックします。[基本情報] セクションで、[シークレット暗号化] を有効化します。初めてシークレット暗号化を有効化する場合は、画面上の指示に従い、[RAM コンソールへ移動] をクリックして、クラウドリソースへのアクセス権限付与ページを開きます。[承認ポリシーの確認] をクリックします。
シークレット暗号化を有効化するには、使用する RAM ユーザーまたは RAM ロールがクラスターに対して管理者または運用・保守エンジニアの RBAC ロールを持っている必要があります。
AliyunCSManagedSecurityRoleロールを割り当てるには、Alibaba Cloud アカウント、または RAM 管理権限を持つ RAM ユーザーまたは RAM ロールでログインしてください。[シークレット暗号化] ダイアログボックスで、既存のキーを選択し、[OK] をクリックします。利用可能なキーがない場合は、[キーの作成] をクリックして、KMS コンソール でキーを作成します。詳細については、「CMK の作成」をご参照ください。
クラスターのステータスが [更新中] から [実行中] に変更されるまで待ちます。これでシークレット暗号化が有効化されます。
シークレット暗号化を無効化するには、[シークレット暗号化] を [基本情報] セクションで無効化します。
暗号化キーのローテーション
KMS では、自動キーのローテーションがサポートされています。ローテーション中は、既存のシークレットは元のキーで引き続き暗号化されたままです。新しいシークレットのみが新しいキーで暗号化されます。
ローテーション後に、すべての既存のシークレットを新しいキーで再暗号化するには、以下のコマンドを実行します。
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 は、Secret をクエリする際に常にプレーンテキストを返します。Secret の暗号化は etcd レイヤーで実行されます。つまり、Secret は etcd 内に暗号文として保存されますが、API サーバーが kubectl に結果を返す前にそれらを復号します。
キーのローテーション後に、既存のシークレットは自動的に再暗号化されますか?
いいえ。キーのローテーション中は、既存のシークレットは元のキーのバージョンで引き続き暗号化されたままです。新しいシークレットのみが新しいキーで暗号化されます。すべての既存のシークレットを新しいキーで再暗号化するには、「暗号化キーのローテーション」で示したコマンドを実行します。
RAM ユーザーまたは RAM ロールによるシークレット暗号化の有効化および無効化を禁止するにはどうすればよいですか?
以下の拒否ポリシーを RAM ユーザーまたは RAM ロールにアタッチしてください。詳細については、「RAM を使用したクラスターおよびクラウドリソースへのアクセスの付与」をご参照ください。
{
"Action": [
"cs:UpdateKMSEncryption"
],
"Effect": "Deny",
"Resource": [
"*"
]
}