プロファイル適用性: レベル1 - ワーカーノード
クライアントCAファイルが証明書を使用したKubelet認証のために設定されていることを確認し、セキュリティを強化してください。この設定は重要です。なぜなら、apiserverからkubeletへの接続は、ポッドのログ取得、kubectlを介した実行中のポッドへのアタッチ、kubeletのポートフォワーディング機能の有効化などの活動に使用され、kubeletのHTTPSエンドポイントで終了するからです。デフォルトでは、apiserverはkubeletのサービング証明書を検証しないため、これらの接続は中間者攻撃に対して脆弱であり、信頼できないまたは公共のネットワーク上では安全ではありません。Kubelet証明書認証を設定することで、apiserverはリクエストを処理する前にKubeletを認証でき、これらのやり取りを保護します。このセットアップには、apiserverとkubeletの両方でTLSを設定し、安全な通信を確保する必要があります。
影響
apiserverおよびkubeletにTLSを設定する必要があります。
監査
監査方法1:
注意Kubeletは設定ファイルまたはコマンドライン引数で構成できます。コマンドライン引数が優先されます。Kubeletの設定を監査する際には、コマンドライン引数と設定ファイルのエントリの両方を確認してください。
|
-
各ノードにSSHで接続し、次のコマンドを実行してアクティブなKubeletプロセスの詳細を表示します。
ps -ef | grep kubelet
-
--config引数の出力から設定ファイルの場所を特定します。次のコマンドを使用してファイルを表示します:
sudo less /path/to/kubelet-config.json
-
クライアント認証局ファイルが設定されていることを確認してください。
-
Kubeletサービスへのコマンドライン引数:
--client-ca-file=/path/to/client-ca-file
-
In the Kubelet configuration file:
{ "authentication": { "x509": { "clientCAFile": "/path/to/client-ca-file" } } }
-
監査方法2:
kubectlを使用してKubernetes APIの"/configz"エンドポイントを介してKubeletの実行中の構成を確認します。
-
クラスター内のすべてのノードを発見する:
kubectl get nodes
-
kubectlでローカルポート (例: 8080) にプロキシを開始します。
kubectl proxy --port=8080
-
別のターミナルで、各ノードに対して次のコマンドを実行してください。
export NODE_NAME=my-node-name curl http://localhost:8080/api/v1/nodes/${NODE_NAME}/proxy/configz -
API対応を確認してクライアント認証局ファイルが設定されていることを検証してください。
{ "authentication": { "x509": { "clientCAFile": "/path/to/client-ca-file" } } }
修復
方法 1:
-
各ノードにSSHで接続します。
-
Kubeletの設定ファイルを見つける:
ps -ef | grep kubelet
-
次のコマンドで設定ファイルを表示します:
sudo less /path/to/kubelet-config.json
-
次のパラメータを設定してクライアント認証局ファイルを構成します。
{ "authentication": { "x509": { "clientCAFile": "/path/to/client-ca-file" } } } -
kubeletサービスを再起動し、そのステータスを確認します (systemdを使用しているシステムの例):
systemctl daemon-reload systemctl restart kubelet.service systemctl status kubelet -l
方法2:
-
コマンドライン引数を使用する場合、kubeletサービスファイルを編集して次のパラメータを含めてください:
--client-ca-file=/path/to/client-ca-file
-
systemdを使用しているシステムの場合、/etc/systemd/system/kubelet.service.d/10-kubelet-args.confにあるファイルを編集してください。
-
kubeletサービスを再起動し、そのステータスを確認します (systemdを使用しているシステムの例):
systemctl daemon-reload systemctl restart kubelet.service systemctl status kubelet -l
