kubelet の clientCAFile とは? 設定の意味と認証の仕組み
Kubernetes クラスターを運用するうえで、セキュリティを強化するために kubelet の認証設定を適切に行うことはとても重要です。特に clientCAFile は、クライアント証明書を使った認証を設定する際に欠かせない項目のひとつです。
「証明書認証って難しそう…」と思うかもしれませんが、実は「会員制のイベントに入るための招待状」みたいなものだと考えると分かりやすいです。イベント会場に入るには、主催者が発行した招待状を持っている必要がありますよね? そして、受付スタッフは「この招待状は本物か?」を確認するために、公式のリストと照らし合わせます。
同じように、clientCAFile を使うと kubelet は「このクライアントは信頼できる CA(認証局)から証明書を発行されているか?」をチェックし、正当なクライアントのみ API にアクセスできるようになります。
kubelet の認証設定サンプル
まず、以下の kubelet の設定ファイルを見てみましょう。
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
anonymous:
enabled: false
webhook:
cacheTTL: 0s
enabled: true
x509:
clientCAFile: /etc/kubernetes/pki/ca.crt
この設定の中で clientCAFile とは何を意味するのでしょうか?
clientCAFile の役割
この clientCAFile の項目は、kubelet がクライアント証明書を使った認証を行う際に、どの認証局(CA)の証明書を信頼するかを指定するためのものです。
この設定が有効になると、kubelet の API にアクセスするクライアントは、指定された clientCAFile(ここでは /etc/kubernetes/pki/ca.crt)に登録された認証局によって発行された証明書を提示する必要があります。
つまり、kubelet は「この証明書は信頼できる認証局から発行されたものか?」をチェックし、正当なクライアントのみ API にアクセスできるようにするのです。
clientCAFile が必要になる場面
この設定が重要になるのは、主に次のようなケースです。
(1) 匿名アクセスを防ぐ
設定を見てみると、anonymous.enabled: false となっています。これは、匿名のリクエストをすべて拒否するという意味です。つまり、何らかの認証手段(証明書、Webhook認証など)を使わないと kubelet の API にアクセスできません。
カフェの例で考えると、「会員カードを持っている人だけが注文できる」というルールを設けているようなものです。anonymous.enabled: false にすることで、誰でも kubelet API にアクセスできる状態を防ぐことができます。
(2) kube-apiserver からの認証
kube-apiserver は、kubelet の API(例えば /metrics や /logs など)にアクセスすることがあります。このとき、API サーバーはクライアント証明書を使って kubelet にリクエストを送ります。
kubelet 側では、clientCAFile に登録された CA 証明書を使い、そのクライアント証明書が信頼できるものであるかを検証します。これにより、kube-apiserver 以外の不正なリクエストを防ぐことができます。
(3) 監視ツールやカスタムコンポーネントのアクセス管理
Prometheus などの監視ツールや、独自に開発したカスタムコントローラーが kubelet の API にアクセスすることがあります。これらのツールがクライアント証明書を使って認証を行う場合、clientCAFile を設定しておけば、kubelet はそれが信頼できる CA によって発行された証明書かどうかを確認できます。
これにより、「認証局が発行した正規の証明書を持っているツールだけが kubelet にアクセスできる」というルールを適用できるのです。
clientCAFile の具体的な動作
kubelet に clientCAFile を設定すると、以下のような流れでリクエストを検証します。
クライアントが kubelet の API にアクセスしようとする。
クライアントは証明書 (client.crt) を提示する。
kubelet は clientCAFile に指定された CA 証明書を使い、クライアント証明書の署名を検証する。
証明書が有効であればリクエストを許可する。
無効または不正な証明書であればリクエストを拒否する。
これにより、kubelet へのアクセスをセキュリティ的に強固なものにできます。
実際に kubelet API へ証明書認証でアクセスする
例えば、以下のような curl コマンドを使えば、kubelet の API にクライアント証明書でアクセスできます。
curl --cert /path/to/client.crt \
--key /path/to/client.key \
--cacert /etc/kubernetes/pki/ca.crt \
https://<node-ip>:10250/metrics
このとき、client.crt が clientCAFile に登録された CA によって発行されたものであれば、アクセスが許可されます。
まとめ
clientCAFile は、kubelet の API にアクセスするクライアント証明書を検証するための設定。
anonymous.enabled: false にすることで、認証なしのアクセスを防ぐことができる。
kube-apiserver や監視ツールが kubelet にアクセスする際、証明書認証を利用すればセキュリティを強化できる。
kubelet の API はクラスターの重要な情報にアクセスできるため、適切に保護することが不可欠です。clientCAFile を活用し、より安全な Kubernetes 環境を構築しましょう!