k3s secrets-encrypt

K3sは、保存時のシークレット暗号化を有効にすることをサポートしています。詳細については、Secrets Encryptionを参照してください。

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

バージョンゲート

v1.21.8+k3s1から利用可能

K3sには、以下の自動制御を可能にするCLIツールsecrets-encryptが含まれています:

  • シークレット暗号化の無効化/有効化

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

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

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

暗号化キーのローテーションの適切な手順に従わないと、クラスターが永久に破損する可能性があります。慎重に進めてください。

新しい暗号化キーのローテーション(実験的)

バージョンゲート

v1.28.1+k3s1から利用可能。この新しいバージョンのツールは、現在ベータ版のK8s 自動設定リロードを利用しています。GAはv1.29.0で予定されています。

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

  • Single-Server

  • High-Availability

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

  1. フラグ--secrets-encryptionを使用してK3sサーバーを起動します。

    暗号化なしでK3sを起動し、後で有効にすることは現在サポートされていません。

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

    k3s secrets-encrypt rotate-keys
  3. 再暗号化が完了するのを待ちます。サーバーログを監視するか、以下を待ちます:

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

HAセットアップでシークレット暗号化キーをローテーションするには:

  1. すべてのK3sサーバーを--secrets-encryptionフラグで起動します。簡略化のため、サーバーをS1、S2、S3と呼びます。

    暗号化なしでK3sを起動し、後で有効にすることは現在サポートされていません。

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

    k3s secrets-encrypt rotate-keys
  3. 再暗号化が完了するのを待ちます。サーバーログを監視するか、以下を待ちます:

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

    K3sは1秒あたり約5つのシークレットを再暗号化します。シークレットの数が多いクラスターでは、再暗号化に数分かかることがあります。サーバーログで進行状況を確認できます。

  4. 同じ引数でS1のK3sを再起動します。K3sをサービスとして実行している場合:

    # systemdを使用している場合
    systemctl restart k3s
    # openrcを使用している場合
    rc-service k3s restart
  5. S1が起動したら、S2とS3のK3sを再起動します。

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

  • Single-Server

  • High-Availability

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

  1. フラグ--secrets-encryptionを使用してK3sサーバーを起動します。

    暗号化なしでK3sを起動し、後で有効にすることは現在サポートされていません。

  2. 準備します。

    k3s secrets-encrypt prepare
  3. 同じ引数でK3sサーバーを再起動します。K3sをサービスとして実行している場合:

    # systemdを使用している場合
    systemctl restart k3s
    # openrcを使用している場合
    rc-service k3s restart
  4. ローテーションします。

    k3s secrets-encrypt rotate
  5. 同じ引数でK3sサーバーを再起動します。

  6. 再暗号化します。

    K3sは1秒あたり約5つのシークレットを再暗号化します。
    シークレットの数が多いクラスターでは、再暗号化に数分かかることがあります。

    k3s secrets-encrypt reencrypt

埋め込みDBと外部DBクラスターの両方で手順は同じです。

HAセットアップでシークレット暗号化キーをローテーションするには:

  1. すべてのK3sサーバーを--secrets-encryptionフラグで起動します。簡略化のため、サーバーをS1、S2、S3と呼びます。

    • 暗号化なしでK3sを起動し、後で有効にすることは現在サポートされていません。

    • 必須ではありませんが、secrets-encryptコマンドを実行するサーバーノードを1つ選ぶことをお勧めします。

  2. S1で準備します。

    k3s secrets-encrypt prepare
  3. 同じ引数でS1を再起動します。K3sをサービスとして実行している場合:

    # systemdを使用している場合
    systemctl restart k3s
    # openrcを使用している場合
    rc-service k3s restart
  4. S1が起動したら、S2とS3を再起動します。

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

    k3s secrets-encrypt rotate
  6. 同じ引数でS1を再起動します。

  7. S1が起動したら、S2とS3を再起動します。

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

    K3sは1秒あたり約5つのシークレットを再暗号化します。
    シークレットの数が多いクラスターでは、再暗号化に数分かかることがあります。

    k3s secrets-encrypt reencrypt
  9. 同じ引数でS1を再起動します。

  10. S1が起動したら、S2とS3を再起動します。

シークレット暗号化の無効化/再有効化

  • Single-Server

  • High-Availability

--secrets-encryptionフラグを使用してサーバーを起動した後、シークレット暗号化を無効にすることができます。

シングルノードクラスターでシークレット暗号化を無効にするには:

  1. 無効化します。

    k3s secrets-encrypt disable
  2. 同じ引数でK3sサーバーを再起動します。K3sをサービスとして実行している場合:

    # systemdを使用している場合
    systemctl restart k3s
    # openrcを使用している場合
    rc-service k3s restart
  3. フラグを使用して再暗号化します。

    k3s secrets-encrypt reencrypt --force --skip

シングルノードクラスターでシークレット暗号化を再有効化するには:

  1. 有効化します。

    k3s secrets-encrypt enable
  2. 同じ引数でK3sサーバーを再起動します。

  3. フラグを使用して再暗号化します。

    k3s secrets-encrypt reencrypt --force --skip

--secrets-encryptionフラグを使用してHAクラスターを起動した後、シークレット暗号化を無効にすることができます。

必須ではありませんが、secrets-encryptコマンドを実行するサーバーノードを1つ選ぶことをお勧めします。

簡略化のため、このガイドで使用する3つのサーバーをS1、S2、S3と呼びます。

HAクラスターでシークレット暗号化を無効にするには:

  1. S1で無効化します。

    k3s secrets-encrypt disable
  2. 同じ引数でS1を再起動します。K3sをサービスとして実行している場合:

    # systemdを使用している場合
    systemctl restart k3s
    # openrcを使用している場合
    rc-service k3s restart
  3. S1が起動したら、S2とS3を再起動します。

  4. S1でフラグを使用して再暗号化します。

    k3s secrets-encrypt reencrypt --force --skip

HAクラスターでシークレット暗号化を再有効化するには:

  1. S1で有効化します。

    k3s secrets-encrypt enable
  2. 同じ引数でS1を再起動します。

  3. S1が起動したら、S2とS3を再起動します。

  4. S1でフラグを使用して再暗号化します。

    k3s secrets-encrypt reencrypt --force --skip

シークレット暗号化のステータス

secrets-encryptツールには、ノード上のシークレット暗号化の現在のステータスに関する情報を表示するstatusコマンドが含まれています。

シングルサーバーノードでのコマンドの例:

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

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

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

$ k3s 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

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

  • Encryption Status: ノード上でシークレット暗号化が無効か有効かを表示します。

  • Current Rotation Stage: ノード上の現在のローテーションステージを示します。
    ステージは:startpreparerotatereencrypt_requestreencrypt_activereencrypt_finishedです。

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

  • Key Table: ノード上で見つかったシークレット暗号化キーに関する情報を要約します。

    • Active: "*"は、現在シークレット暗号化に使用されているキーを示します。アクティブなキーは、Kubernetesが新しいシークレットを暗号化するために使用します。

    • Key Type: このツールを使用するすべてのキーはAES-CBCタイプです。詳細はこちらを参照してください。

    • Name: 暗号化キーの名前。