etcd の自動 TLS が有効

etcd の自動 TLS による暗号化と、証明書の信頼性・接続相手の検証を区別してください。

説明

--auto-tls=true は、etcd が自己署名証明書を自動生成してクライアント接続に使用する設定です。通信は暗号化できますが、この自動設定だけでは接続相手の身元は認証されません。

etcd は Kubernetes の重要なデータを保存します。本番環境では、管理する CA と証明書で信頼関係を構成し、証明書の検証を維持する必要があります。

想定される影響

接続相手を検証しないと、通信経路を掌握した攻撃者のなりすましを十分に防げないおそれがあります。証明書の発行・更新や信頼範囲が組織の基準を満たせない場合もあります。

対処方法

  • 管理する証明書・キーと HTTPS 接続を先に準備し、--auto-tls=true を削除するか false に設定してください。
  • クライアントが信頼する CA でサーバー証明書を検証するよう設定し、必要なクライアント認証も構成してください。
  • 証明書の期限と更新を管理し、正規の接続が成功して信頼しない証明書が拒否されることを確認してください。

例

過去の etcd バージョンの実行引数を比較する抜粋です。実際のデプロイには、サポート対象バージョン、HTTPS アドレス、証明書ファイルのマウントなど、残りの設定も必要です。

変更前

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-etcd-deployment
spec:
  template:
    spec:
      containers:
        - name: database
          image: gcr.io/google_containers/etcd:v3.2.18
          command: ["etcd"]
          args: ["--auto-tls=true"]

自動生成した自己署名証明書を使用する設定です。通信の暗号化と接続相手の認証は区別する必要があります。

変更後

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-etcd-deployment
spec:
  template:
    spec:
      containers:
        - name: database
          image: gcr.io/google_containers/etcd:v3.2.18
          command: ["etcd"]
          args: []

自動 TLS の引数を削除しただけです。この例だけで TLS が構成されるわけではないため、管理する証明書・キーと HTTPS 設定も適用してください。

参考資料