見出し画像

Kubernetesでetcdのデータを暗号化する方法

Kubernetesのetcdは、クラスターのすべての状態データ(SecretsやConfigMapsなど)を保存する重要なデータストアです。しかし、これらのデータが暗号化されていないと、etcdのストレージを直接操作された際に内容が簡単に読まれてしまう可能性があります。

そこで登場するのが「データ暗号化」です。今回は、Kubernetesでetcdのデータを暗号化する方法を、例え話を交えながらまとめていきます。


暗号化の仕組みを例え話で理解する

etcdのデータ暗号化を設定することは、「貴重品を保管する金庫に鍵をかける」ようなものです。

  • 金庫(etcd): データを保管する場所。

  • 鍵(暗号化キー): データを暗号化するための道具。

  • 警備員(kube-apiserver): データを金庫に入れたり取り出したりするときに鍵を使う人。

鍵を適切に管理し、暗号化ルールをしっかり設定すれば、重要なデータを安全に守ることができます。


暗号化の流れ

1. kube-apiserverで暗号化プロバイダーを設定

警備員(kube-apiserver)に「この金庫の中のデータは必ず鍵を使って保管してね」というルールを教えます。これを暗号化プロバイダー設定で行います。


2. 新しいデータは暗号化されて金庫に保管

暗号化プロバイダーの設定が適用されると、金庫(etcd)に新しく追加されるデータは、鍵を使って暗号化されます。


3. 既存のデータは再暗号化が必要

金庫にすでに保管されている古いデータは、そのままだと暗号化されていません。必要に応じて警備員に「古いデータも鍵をかけて」と再暗号化を依頼します。


暗号化設定の手順

それでは、実際の設定方法を見ていきましょう!


1. 暗号化プロバイダー設定ファイルを作成

kube-apiserverに暗号化方式や鍵を教えるための設定ファイルを作成します。このファイルは、「金庫に入れるルールブック」のようなものです。

設定ファイルの例 (encryption-config.yaml)

apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
  - resources:
      - secrets  # 暗号化するリソース
    providers:
      - aescbc:  # 暗号化方式
          keys:
            - name: key1
              secret: bXktc2VjcmV0LWtleS1leGFtcGxl  # Base64エンコードされた鍵
      - identity: {}  # 暗号化されていないデータを読み取るフォールバック

設定のポイント

  • resources: 暗号化するリソースを指定します。例:secrets, configmaps。

  • providers:

    • aescbc: AES-CBC方式でデータを暗号化します。

    • identity: 暗号化されていないデータを読み取るためのフォールバック方式。

  • keys: Base64エンコードされた暗号化キーを指定します。

例え話

これは、「どんなデータを金庫に入れるのか」「どんな鍵を使うのか」を細かく決める作業です。


2. kube-apiserverに設定ファイルを適用

作成した設定ファイルをkube-apiserverに渡します。

起動フラグで設定ファイルを指定

kube-apiserver \
  --encryption-provider-config=/etc/kubernetes/encryption-config.yaml \
  ...

再起動

設定を適用するには、kube-apiserverを再起動します:

sudo systemctl restart kube-apiserver

3. 既存データの再暗号化

新しい設定を適用しても、古いデータは暗号化されません。再暗号化が必要な場合は、以下のように対応します。

  1. 再暗号化ツールを使用: 再暗号化用のツールやスクリプトを実行します。

  2. データを手動で更新: 必要に応じてリソースを再作成して暗号化。

例え話

これは、「金庫の中に入っているすべてのアイテムに新しい鍵をつける」作業です。


設定の確認方法

暗号化設定が正しく適用されたか確認します。

1. Secretを作成

kubectl create secret generic test-secret --from-literal=mykey=mydata

2. etcdに保存されたデータを確認

etcdctlコマンドを使用して、etcdのデータが暗号化されているか確認します。

etcdctl --endpoints=<etcd-endpoint> get /registry/secrets/default/test-secret
  • 期待される結果: 暗号化されたデータが表示されます。平文のまま表示されている場合、設定が正しく適用されていません。


暗号化方式の選択肢

Kubernetesでは以下の暗号化方式を利用できます:

暗号化方式 説明 特徴 aescbc AES-CBC (Cipher Block Chaining) シンプルで広く使われている暗号化方式 aesgcm AES-GCM (Galois/Counter Mode) 認証付き暗号化でより安全 secretbox NaCl Secretbox シンプルで効率的 identity 暗号化なし フォールバック用

例え話

  • aescbc: 鍵付きのシンプルな金庫。

  • aesgcm: 鍵付き&開けたらアラームが鳴る金庫(セキュリティが強化)。

  • identity: 鍵のないオープンな金庫(セキュリティなし)。


まとめ

Kubernetesでetcdのデータを暗号化することで、クラスタのセキュリティを大幅に向上できます。設定は少し手間がかかりますが、「重要なデータを金庫に入れる」イメージで進めるとわかりやすいでしょう。

設定のポイント

  1. 暗号化プロバイダー設定ファイルを作成する

  2. kube-apiserverで設定ファイルを適用する

  3. 既存データの再暗号化を必要に応じて実行する

「金庫を守る警備員(kube-apiserver)」に適切なルールを教え、クラスタ全体を安全に運用しましょう!

いいなと思ったら応援しよう!