如何保护 Google Kubernetes Engine (GKE) 中的只读端口 10255?

     2023-03-17     298

关键词:

【中文标题】如何保护 Google Kubernetes Engine (GKE) 中的只读端口 10255?【英文标题】:How to secure the read-only port 10255 in Google Kubernetes Engine (GKE)? 【发布时间】:2019-11-15 05:19:47 【问题描述】:

我使用以下命令创建了一个 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

我可以看到端口 (10255) 在上述集群中创建的两个节点(或者我们可以说是 GCP 计算实例)中都是打开的。

如果我创建一个简单的 GCP 计算实例(因此我总共有 3 个 VM 实例)并尝试从该 VM 访问 10255 端口上的 GKE 节点的内部 IP,我无需任何身份验证或授权即可访问它。 以下是用于创建 GCP 计算实例的命令:

gcloud compute instances create vm-name \
 --network vpc-name \
 --subnetwork subnet-name    \
 --zone asia-south1-a

如果我向 (xxx.xx.xx.xx:10255/pods) 发送一个简单的 CURL GET 请求,我会得到大量关于 pod 和应用程序的信息。 正如我在 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)

我尝试通过编辑节点中的kube-config.yaml 文件来禁用端口,方法是执行ssh 并重新启动kubelet,我成功了。但这是一个好方法吗?我相信当 xxx.xx.xx.xx:10255/metrics 被禁用时可能会出现多个问题。有没有办法保护港口?而不是禁用它?

我看到了这个github issue,我确信有办法保护这个端口。我不知道该怎么做。

我看到 Kubernetes 文档通常为我们提供了多种保护端口的方法。如何在 Google Kubernetes Engine 中做到这一点?

【问题讨论】:

【参考方案1】:

Kubelet 正在使用此端口公开收集的节点指标。未能在此处公开这些指标可能会导致意外行为,因为系统基本上会失明。

由于 GKE 是一个托管系统,因此您实际上不应该调整 kubelet 标志,因为重新创建节点时设置将被重置(节点基于 GCE 模板,不包含您自己的配置)。

至于安全性,我认为保留该端口是安全的,因为您使用的是私有集群,这意味着仅允许同一 VPC 中的资源到达节点。

【讨论】:

但是有没有办法至少向端点添加身份验证或授权,以便不是所有的虚拟机而是只有允许的虚拟机访问端点? 正如其他回复中所建议的,您可以添加 VPC 级别的防火墙规则来禁用访问。请记住,GKE 集群中的所有节点都有network tags,这可能会让您更轻松地操作防火墙。【参考方案2】:

正如 Yahir Hernández 在他的回答中所建议的那样,此端口用于公开与确保平稳运行的系统相关的指标。禁用此端口可能不是一个好主意。

我们需要做的是防止从VPC外部访问该端口。

由于您在 GCP 上使用 GKE。如果您使用 VPC,您可以将防火墙规则添加到端口 (10255),以仅允许来自 VPC 资源的传入流量。禁止从 Internet 访问此端口。

【讨论】:

如果仔细观察,我创建的集群只有内部 IP 地址,默认情况下无法从 VPC 外部访问。事实上,同一 VPC 中另一个子网中的虚拟机甚至无法访问私有集群。所以我不关心来自 VPC 或子网外部的流量。我担心来自同一子网中虚拟机的流量。这些没有任何作用域或身份验证的 VM 只需发送 GET 请求即可访问此端口。我想在其中添加身份验证。 好的。您要解决的问题是什么?鉴于只有您的 pod 会在其中运行,为什么您会有来自 VM 内部的流量? 我要解决的问题与安全性有关。假设在同一子网中有一个虚拟机是为了其他目的而不是访问集群而创建的。即使没有任何授权和身份验证,GKE 也允许虚拟机访问此端口并获取大量信息。 那么它不应该在不同的子网中吗?如果不尝试阻止从 VM 到端口 10255 的传出流量。 我想到了那个解决方案,但只为集群创建一个子网对我来说似乎有点矫枉过正。而blocking outgoing traffic to port 10255 from the VM 看起来并不是一个好的解决方案。如果重新创建集群并且 IP 更改了怎么办?如果同一子网中有另一个集群访问其他集群 IP:10255 怎么办?因此,与其限制调用者,我更愿意保护目标。【参考方案3】:

根据CIS Google Kubernetes Engine (GKE) Benchmark v1.0.0第196和197页,“建议”>“Kubelet”:

建议(广泛适用,应该适用于几乎所有环境)禁用只读端口10255 您可以通过编辑 kubelet 配置文件将 readOnlyPort 设置为 0 然后重新启动 kubelet 服务来做到这一点

同时Google mentions(第4.2.4点)表示默认不禁用端口,因为:

部分 GKE 监控组件使用 kubelet 只读端口获取指标。


?

来自 CIS 基准的建议是聋哑人,几乎一文不值。

GKE 的重点是不必自己管理 kubelet。 目前尚不清楚该建议会对 GKE 对您的集群的监控产生什么影响。 如何将设置永久保存在自动缩放集群中并不明显。 (以privileged 运行的守护程序集,其唯一目的是覆盖 GKE 的 kubelet 配置?)

在我看来,您能做的最好的缓解措施是:

    确保端口只能从 VPC 内部访问。 为您的 pod 设置良好的出口网络策略。 (或者在其他一些 管理出口流量的方式。)避免让 pod 允许所有端口上的所有出口。

【讨论】:

如何在 Google Cloud Platform 中编辑 Kubernetes 集群的描述字段?

】如何在GoogleCloudPlatform中编辑Kubernetes集群的描述字段?【英文标题】:HowcanIeditthedescriptionfieldofaKubernetesclusterinGoogleCloudPlatform?【发布时间】:2016-07-0911:30:53【问题描述】:我想编辑部署在Google容器引擎中的Kubernetes集群的描述字... 查看详情

如何优雅保护kubernetes中的secrets

来源|进击云原生现如今开发的大多数应用程序,或多或少都会用到一些敏感信息,用于执行某些业务逻辑。比如使用用户名密码去连接数据库,或者使用秘钥连接第三方服务。在代码中直接使用这些密码或者秘钥是... 查看详情

如何使用 Terraform 正确更改 Google Kubernetes Engine 节点池?

】如何使用Terraform正确更改GoogleKubernetesEngine节点池?【英文标题】:HowtoProperlyChangeaGoogleKubernetesEngineNodePoolUsingTerraform?【发布时间】:2021-10-2910:56:23【问题描述】:我已在GoogleCloudPlatform(GCP)项目($GCP_PROJECT_NAME)中成功创建了GoogleKu... 查看详情

如何在 Google Cloud 上的 Kubernetes 中备份 Postgres 数据库?

】如何在GoogleCloud上的Kubernetes中备份Postgres数据库?【英文标题】:HowtobackupaPostgresdatabaseinKubernetesonGoogleCloud?【发布时间】:2017-07-1016:39:18【问题描述】:备份在GoogleCloudContainerEngine上运行的Postgres数据库的最佳做法是什么?我的... 查看详情

如何使用工作负载身份通过 Google Cloud .NET SDK 访问 Google Kubernetes Engine 中的 ESP?

】如何使用工作负载身份通过GoogleCloud.NETSDK访问GoogleKubernetesEngine中的ESP?【英文标题】:HowtouseWorkloadidentitytoaccessESPintheGoogleKubernetesEnginewiththeGoogleCloud.NETSDK?【发布时间】:2021-10-0717:28:54【问题描述】:背景在GoogleKubernetesEngine上... 查看详情

网站如何识别 Google 搜索中使用的搜索字词

】网站如何识别Google搜索中使用的搜索字词【英文标题】:HowawebsitemayidentifysearchtermsusedinGoogleSearch【发布时间】:2015-04-1616:52:54【问题描述】:Google搜索文档说(https://support.google.com/websearch/answer/173733?hl=en):SSL并不总是保护:您... 查看详情

如何从我在 Google Cloud Platform 上的部署中删除 Kubernetes 仪表板资源?

】如何从我在GoogleCloudPlatform上的部署中删除Kubernetes仪表板资源?【英文标题】:HowdoIremovetheKubernetesdashboardresourcesfrommydeploymentonGoogleCloudPlatform?【发布时间】:2018-02-2017:37:54【问题描述】:我创建了一个Kubernetes部署。但是,似乎... 查看详情

如何使用 python 脚本修改 Google 表格中现有的受保护范围

】如何使用python脚本修改Google表格中现有的受保护范围【英文标题】:HowdoyoumodifyanexistingprotectedrangeinGooglesheetswithapythonscript【发布时间】:2020-01-2606:10:28【问题描述】:我目前正在使用gspread访问谷歌表格,我想使用python保护一... 查看详情

如何保护 Google 电子表格中的 Apps 脚本代码?

】如何保护Google电子表格中的Apps脚本代码?【英文标题】:HowtoprotecttheAppsScriptcodeinaGooglespreadsheet?【发布时间】:2013-04-1102:59:42【问题描述】:我已经使用脚本编辑器为我的Google电子表格编写了一些代码。我想与我的客户共享此... 查看详情

如何使用 Spring Boot 将来自 Google Secret Manager 的秘密作为环境变量注入 Kubernetes Pod?

...用SpringBoot将来自GoogleSecretManager的秘密作为环境变量注入KubernetesPod?【英文标题】:HowtoinjectsecretfromGoogleSecretManagerintoKubernetesPodasenvironmentvariablewithSpringBoot?【发布时间】:2021-01-0311:34:01【问题描述】:为了布莱恩的一生,我该怎... 查看详情

kubernetes安全策略:保护您的数据仓库并阻止黑客(代码片段)

文章目录一、概述1.1什么是Kubernetes1.2Kubernetes为什么需要安全1.2.1权限问题1.2.2网络问题1.2.3控制面1.2.4镜像安全问题1.3Kubernetes安全秘籍简介1.3.1配置Kubernetes对象的RBAC1.3.2使用安全的容器基础映像1.3.3配置Kubernetes的网络和策略1.3.4... 查看详情

如何在 kubernetes GCE 上启用 https tls

】如何在kubernetesGCE上启用httpstls【英文标题】:howtoenablehttpstlsonkubernetesGCE【发布时间】:2018-08-0817:23:43【问题描述】:我成功地将我的网络应用部署在Google云中的kubernetes上。它通过http服务。我遵循了有关如何添加ssl证书的所有... 查看详情

使用 TLS 保护 Kubernetes 服务

】使用TLS保护Kubernetes服务【英文标题】:SecuringKubernetesServicewithTLS【发布时间】:2018-11-2608:37:16【问题描述】:我有一个内部应用程序,仅通过具有集群IP的服务向集群上的其他应用程序公开。其他服务正在通过它的DNS(serviceName-... 查看详情

找到kubernetes原生的数据保护方法

...如测试、可用性、故障切换和数据保护。让我们深入了解Kubernetes的数据保护,以确 查看详情

使用 google auth 保护 Prometheus

...用grafana.ini文件中的google.auth来保护对grafana的访问。无论如何我也可以安全地访问普罗米修斯吗?谢谢【问题讨论】:【参考方案1】:虽 查看详情

如何使用 JWT 和 Kubernetes 设置 Spring 后端

】如何使用JWT和Kubernetes设置Spring后端【英文标题】:HowtosetupSpringbackendwithJWTandKubernetes【发布时间】:2019-08-2400:03:53【问题描述】:我实现了一个Spring后端,它负责存储不同的数据(用户、讲座等)。该后端由JWT保护,一切正常... 查看详情

如何将本地 Kubernetes 日志发送到 Stackdriver

】如何将本地Kubernetes日志发送到Stackdriver【英文标题】:HowtoSendOnPremisesKubernetesLogstoStackdriver【发布时间】:2019-04-1310:33:31【问题描述】:目标:在Google上进行一些日志记录/监控来自KuberntesHA集群的Stackdriver即在本地,版本1.11.2。... 查看详情

Google Cloud SQL Postgres - 来自 Google Compute / Kubernetes 的随机慢查询

】GoogleCloudSQLPostgres-来自GoogleCompute/Kubernetes的随机慢查询【英文标题】:GoogleCloudSQLPostgres-randomlyslowqueriesfromGoogleCompute/Kubernetes【发布时间】:2018-08-1423:33:33【问题描述】:我一直在使用Postgresql测试GoogleCloudSQL,但随机查询需要大... 查看详情