シークレット暗号化

シークレット暗号化設定

RKE2は シークレットを保存時に暗号化することをサポートしており、以下のことを自動的に行います:

  • AES-CBCキーを生成します。

  • 生成されたキーを使用して暗号化設定ファイルを生成します。

  • 設定をKubernetes APIServerに暗号化プロバイダ設定として渡します。

暗号化プロバイダの選択

バージョンゲート

2025年4月のリリースから利用可能:v1.30.12+rke2r1、v1.31.8+rke2r1、v1.32.4+rke2r1、v1.33.0+rke2r1。

FIPSのコンプライアンス

FIPS 140-3準拠は`aescbc`プロバイダでのみ利用可能です。

`--secrets-encryption-provider`フラグを使用することで、使用する暗号化プロバイダを選択できます。デフォルトは`aescbc`です。

RKE2は以下の 暗号化プロバイダをサポートしています:

  • aescbc:PKCS#7パディングを使用したAES-CBC

  • secretbox:XSalsa20およびPoly1305

プロバイダの移行

`aescbc`プロバイダから`secretbox`プロバイダに移行するには、次の手順に従ってください:

  1. `secretbox`プロバイダがあなたのRKE2バージョンでサポートされていることを確認してください。

  2. RKE2設定ファイルに`secrets-encryption-provider`フラグを`secretbox`に更新/追加します。

  3. 以下の[Encryption Key Rotation]セクションに従って暗号化キーをローテーションします。

生成された暗号化設定ファイル

以下は、デフォルトの`aescbc`プロバイダを使用してRKE2が生成する暗号化設定ファイルの例です:

#/var/lib/rancher/rke2/server/cred/encryption-config.json
{
  "kind": "EncryptionConfiguration",
  "apiVersion": "apiserver.config.k8s.io/v1",
  "resources": [
    {
      "resources": [
        "secrets"
      ],
      "providers": [
        {
          "aescbc": {
            "keys": [
              {
                "name": "aescbckey",
                "secret": "xxxxxxxxxxxxxxxxxxx"
              }
            ]
          }
        },
        {
          "identity": {}
        }
      ]
    }
  ]
}

シークレット暗号化ツール

RKE2には`secrets-encrypt`というサブコマンドがあり、管理者が以下のタスクを実行できるようにします:

  • 新しい暗号化キーの追加

  • 暗号化キーのローテーションと削除

  • シークレットの再暗号化

シークレットの暗号化キーをローテーションする際に適切な手順に従わないと、永久的なデータ損失を引き起こす可能性があります。ローテーションの前にスナップショットを作成することをお勧めします。注意して進めてください。

暗号化キーのローテーション

バージョンゲート

2024年9月のリリースから利用可能:v1.29.9+rke2r1、v1.30.5+rke2r1、v1.31.1+rke2r1。

古いリリースについては、[Encryption Key Rotation Classic]を参照してください。

  • 1つのサーバ

  • 高可用性

単一サーバークラスターでシークレット暗号化キーをローテーションするには:

  1. シークレット暗号化キーをローテーションします。

    rke2 secrets-encrypt rotate-keys
  2. 再暗号化が完了するまで待機してください。サーバーログを監視するか、次を待ってください:

    $ rke2 secrets-encrypt status
    Encryption Status: Enabled
    Current Rotation Stage: reencrypt_finished

HAセットアップでの秘密の暗号化キーを回転させるには:

この例では、HAクラスターに3つのサーバー(S1、S2、S3)が使用されます。secrets-encrypt コマンドを実行するために 1 つのサーバーノードを選択することをお勧めします。

  1. S1でシークレット暗号化キーをローテーションします。

    rke2 secrets-encrypt rotate-keys
  2. 再暗号化が完了するまで待機してください。サーバーログを監視するか、次を待ってください:

    $ rke2 secrets-encrypt status
    Encryption Status: Enabled
    Current Rotation Stage: reencrypt_finished
  3. S1、S2、S3でRKE2を順次再起動します。

    systemctl restart rke2-server.service

    次のサーバーを再起動する前に、systemctlコマンドが戻るのを待ちます。

暗号化キーのローテーション(クラシック)

新しい手順

RKE2のバージョンがv1.30.1+rke2r1より新しい場合は、代わりに[Encryption Key Rotation]を使用することをお勧めします。

  • 1つのサーバ

  • 高可用性

単一ノードクラスターでシークレット暗号化キーをローテーションするには:

  1. 準備:

    rke2 secrets-encrypt prepare
  2. `kube-apiserver`ポッドを再起動します:

    # Get the kube-apiserver container ID export CONTAINER_RUNTIME_ENDPOINT="unix:///var/run/k3s/containerd/containerd.sock" crictl ps --name kube-apiserver # Stop the pod crictl stop <CONTAINER_ID>
  3. ローテーション:

    rke2 secrets-encrypt rotate
  4. 再度`kube-apiserver`ポッドを再起動します。

  5. 再暗号化:

    rke2 secrets-encrypt reencrypt

HAセットアップでの秘密の暗号化キーを回転させるには:

この例では、HAクラスターに3つのサーバー(S1、S2、S3)が使用されます。必須ではありませんが、secrets-encrypt コマンドを実行するために 1 つのサーバーノードを選択することをお勧めします。

  1. S1を準備します。

    rke2 secrets-encrypt prepare
  2. S1、S2、S3を順次再起動します。

    systemctl restart rke2-server.service

    次のサーバーを再起動する前に、systemctlコマンドが戻るのを待ちます。

  3. S1でローテーションします。

    rke2 secrets-encrypt rotate
  4. S1、S2、S3を順次再起動します。

  5. S1で再暗号化します。

    rke2 secrets-encrypt reencrypt

    再暗号化が完了するまで待ちます。サーバーログ`journalctl -u rke2-server`または`rke2 secrets-encrypt status`を介して確認できます。完了すると、ステータスは`reencrypt_finished`を返します。

  6. S1、S2、S3を順次再起動します。

シークレット暗号化の状態

`secrets-encrypt status`サブコマンドは、ノード上のシークレット暗号化の現在の状態に関する情報を表示します。

単一サーバーノードでのコマンドの例:

$ rke2 secrets-encrypt status
Encryption Status: Enabled
Current Rotation Stage: start
Server Encryption Hashes: All hashes match

Active  Key Type  Name
------  --------  ----
 *      AES-CBC   aescbckey

HAクラスタでの別の例、キーをローテーションさせた後、サーバーを再起動する前:

$ rke2 secrets-encrypt status
Encryption Status: Enabled
Current Rotation Stage: rotate
Server Encryption Hashes: hash does not match between node-1 and node-2

Active  Key Type  Name
------  --------  ----
 *      AES-CBC   aescbckey-2021-12-10T22:54:38Z
        AES-CBC   aescbckey

各セクションの詳細は以下の通りです:

  • 暗号化状態:ノード上で秘密の暗号化が無効または有効であるかどうかが表示されます。

  • 現在のローテーション段階:ノード上の現在の回転段階を示します。段階は次の通りです:startpreparerotatereencrypt_requestreencrypt_activereencrypt_finished

  • サーバー暗号化ハッシュ:HAクラスタに役立ち、すべてのサーバーがローカルファイルで同じ段階にあるかどうかを示します。これを使用して、次の段階に進む前にサーバーの再起動が必要かどうかを特定できます。上記のHAの例では、ノード-1とノード-2は異なるハッシュを持ち、現在同じ暗号化構成を持っていないことを示しています。サーバーを再起動すると、設定が同期されます。

キーテーブル 説明

アクティブ

`*`は、現在シークレット暗号化に使用されているキーがある場合、それを示します。アクティブなキーは、Kubernetesによって新しいシークレットを暗号化するために使用されます。

[鍵の種類]

RKE2は、`AES-CBC`キータイプのみをサポートしています。詳細情報は こちらをご覧ください。

名前

暗号化キーの名前。デフォルトは`aescbckey-<DATE_AND_TIME>`です。