如何保护 Google Kubernetes Engine (GKE) 中的只读端口 10255?
How to secure the read-only port 10255 in Google Kubernetes Engine (GKE)?
我使用以下命令创建了一个 GKE 私有集群(版本:1.13.6-gke.13):
gcloud container clusters create a-cluster-with-user-pass \
--network vpc-name \
--subnetwork subnet-name \
--enable-master-authorized-networks \
--username random \
--password averylongpassword \
--enable-ip-alias \
--enable-private-nodes \
--enable-private-endpoint \
--master-ipv4-cidr xxx.xx.xx.xx/28 \
--cluster-version 1.13.6-gke.13 \
--num-nodes 2 \
--zone asia-south1-a
我可以看到在上述集群中创建的两个节点(或者我们可以说是 GCP 计算实例)中都打开了端口 (10255)。
如果我创建一个简单的 GCP 计算实例(所以我总共有 3 个 VM 实例)并尝试从此 VM 访问 10255 端口上的 GKE 节点的内部 IP,我无需任何身份验证即可访问它或授权。
以下是用于创建 GCP 计算实例的命令:
gcloud compute instances create vm-name \
--network vpc-name \
--subnetwork subnet-name \
--zone asia-south1-a
如果我发送一个简单的 CURL GET 请求到 (xxx.xx.xx.xx:10255/pods) 我获取有关 pods 和应用程序的大量信息。
正如我在 Kubernetes here 的文档中看到的那样,提到:
--read-only-port int32
The read-only port for the Kubelet to serve on with no authentication/authorization (set to 0 to disable) (default 10255)
我尝试通过执行 ssh
并重新启动 kubelet 来编辑节点中的 kube-config.yaml
文件来禁用端口,我成功了。但这是一个好方法吗?我相信当禁用 xxx.xx.xx.xx:10255/metrics 时可能会出现多个问题。有没有办法保护端口?而不是禁用它?
我看到这个 github issue 并且我确信有办法保护这个端口。我不确定该怎么做。
我看到 Kubernetes 文档大体上为我们提供了多种方式来保护端口。如何在 Google Kubernetes Engine 中做到这一点?
Kubelet 正在使用此端口公开收集的节点指标。未能在那里公开这些指标可能会导致意外行为,因为系统基本上会盲目飞行。
由于 GKE 是一个托管系统,您真的不应该调整 kubelet 标志,因为当重新创建节点时设置将被重置(节点基于 GCE 模板,不包括您自己的配置)。
至于安全性,我认为保留该端口是安全的,因为您使用的是私有集群,这意味着只允许同一 VPC 中的资源到达节点。
正如 Yahir Hernández 在他的回答中所建议的那样,此端口用于公开与确保平稳运行的系统相关的指标。禁用此端口可能不是一个好主意。
我们需要做的是防止VPC外访问这个端口
因为您在 GCP 上使用 GKE。如果您使用的是 VPC,则可以将防火墙规则添加到端口 (10255),以仅允许来自 VPC 资源的传入流量。禁止从互联网访问此端口。
根据 CIS Google Kubernetes Engine (GKE) Benchmark v1.0.0 第 196 和 197 页,“建议”>“Kubelet”:
- 建议(广泛适用,应该适用于几乎所有环境)关闭read-only端口10255
- 您可以通过编辑 kubelet 配置文件将
readOnlyPort
设置为 0
然后重新启动 kubelet
服务来完成此操作
同时,Google mentions(第 4.2.4 点)端口默认未禁用,因为:
Some GKE monitoring components use the kubelet read-only port to obtain metrics.
CIS 基准的建议是 tone-deaf,几乎一文不值。
- GKE 的重点是不必自己管理 kubelet。
- 尚不清楚该建议对 GKE 对您集群的监控有何影响。
- 如何在 auto-scaling 集群中保持设置的永久性并不明显。 (守护进程 运行 作为
privileged
,其唯一目的是覆盖 GKE 的 kubelet 配置?)
在我看来,您可以采取的最佳缓解措施是:
- 确保端口只能从 VPC 内部访问。
- 为您的 pods 设置良好的出口网络策略。 (或者在其他一些
方式管理您的出口流量。)避免允许 pods 允许所有端口上的所有出口。
我使用以下命令创建了一个 GKE 私有集群(版本:1.13.6-gke.13):
gcloud container clusters create a-cluster-with-user-pass \
--network vpc-name \
--subnetwork subnet-name \
--enable-master-authorized-networks \
--username random \
--password averylongpassword \
--enable-ip-alias \
--enable-private-nodes \
--enable-private-endpoint \
--master-ipv4-cidr xxx.xx.xx.xx/28 \
--cluster-version 1.13.6-gke.13 \
--num-nodes 2 \
--zone asia-south1-a
我可以看到在上述集群中创建的两个节点(或者我们可以说是 GCP 计算实例)中都打开了端口 (10255)。
如果我创建一个简单的 GCP 计算实例(所以我总共有 3 个 VM 实例)并尝试从此 VM 访问 10255 端口上的 GKE 节点的内部 IP,我无需任何身份验证即可访问它或授权。 以下是用于创建 GCP 计算实例的命令:
gcloud compute instances create vm-name \
--network vpc-name \
--subnetwork subnet-name \
--zone asia-south1-a
如果我发送一个简单的 CURL GET 请求到 (xxx.xx.xx.xx:10255/pods) 我获取有关 pods 和应用程序的大量信息。 正如我在 Kubernetes here 的文档中看到的那样,提到:
--read-only-port int32
The read-only port for the Kubelet to serve on with no authentication/authorization (set to 0 to disable) (default 10255)
我尝试通过执行 ssh
并重新启动 kubelet 来编辑节点中的 kube-config.yaml
文件来禁用端口,我成功了。但这是一个好方法吗?我相信当禁用 xxx.xx.xx.xx:10255/metrics 时可能会出现多个问题。有没有办法保护端口?而不是禁用它?
我看到这个 github issue 并且我确信有办法保护这个端口。我不确定该怎么做。
我看到 Kubernetes 文档大体上为我们提供了多种方式来保护端口。如何在 Google Kubernetes Engine 中做到这一点?
Kubelet 正在使用此端口公开收集的节点指标。未能在那里公开这些指标可能会导致意外行为,因为系统基本上会盲目飞行。
由于 GKE 是一个托管系统,您真的不应该调整 kubelet 标志,因为当重新创建节点时设置将被重置(节点基于 GCE 模板,不包括您自己的配置)。
至于安全性,我认为保留该端口是安全的,因为您使用的是私有集群,这意味着只允许同一 VPC 中的资源到达节点。
正如 Yahir Hernández 在他的回答中所建议的那样,此端口用于公开与确保平稳运行的系统相关的指标。禁用此端口可能不是一个好主意。
我们需要做的是防止VPC外访问这个端口
因为您在 GCP 上使用 GKE。如果您使用的是 VPC,则可以将防火墙规则添加到端口 (10255),以仅允许来自 VPC 资源的传入流量。禁止从互联网访问此端口。
根据 CIS Google Kubernetes Engine (GKE) Benchmark v1.0.0 第 196 和 197 页,“建议”>“Kubelet”:
- 建议(广泛适用,应该适用于几乎所有环境)关闭read-only端口10255
- 您可以通过编辑 kubelet 配置文件将
readOnlyPort
设置为0
然后重新启动kubelet
服务来完成此操作
同时,Google mentions(第 4.2.4 点)端口默认未禁用,因为:
Some GKE monitoring components use the kubelet read-only port to obtain metrics.
CIS 基准的建议是 tone-deaf,几乎一文不值。
- GKE 的重点是不必自己管理 kubelet。
- 尚不清楚该建议对 GKE 对您集群的监控有何影响。
- 如何在 auto-scaling 集群中保持设置的永久性并不明显。 (守护进程 运行 作为
privileged
,其唯一目的是覆盖 GKE 的 kubelet 配置?)
在我看来,您可以采取的最佳缓解措施是:
- 确保端口只能从 VPC 内部访问。
- 为您的 pods 设置良好的出口网络策略。 (或者在其他一些 方式管理您的出口流量。)避免允许 pods 允许所有端口上的所有出口。