跳转至

修复 ingress-nginx 1.20.0 漏洞

近期看到 ingress 发布公告 1.20.0 版本有漏洞,公司正好使用的是这个版本的 ingress-class。按照 kubesphere 官方文档升级修复。

参考: https://www.kubesphere.io/zh/docs/v4.1/21-security/02-vulnerability-advisory/#_2_%E5%8D%87%E7%BA%A7%E4%BF%AE%E5%A4%8Dkubesphere_%E4%BA%A7%E5%93%81%E4%B8%AD%E7%9A%84%E7%BD%91%E5%85%B3

KubeSphere 网关组件(ingress-nginx)安全漏洞修复

验证是否受影响

请执行以下步骤检查您的系统是否受影响。

要检查您的集群是否正在运行 Kubernetes 的 ingress-nginx,请在具有集群范围读取权限的帐户下运行以下命令:

kubectl get pods --selector app.kubernetes.io/name=ingress-nginx --all-namespaces

如果 Kubernetes 的 ingress-nginx 正在运行,则集群中应该也存在存在漏洞的 admission webhook。您可以通过运行以下命令来确认:

kubectl get ValidatingWebhookConfiguration ingress-nginx-admission -o yaml

在这种情况下,首先要了解该ingress-nginx-controller-admission服务是否公开。在下面的示例中,我们可以看到该服务通过私有 ClusterIP 公开,而不是直接暴露在互联网上:

root@k8s-worker01:~# kubectl get service ingress-nginx-controller-admission -n ingress-nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx-controller-admission ClusterIP 10.233.28.158 443/TCP 175d

即使易受攻击的准入控制器未暴露在互联网上,您也需要修复该漏洞。请检查正在运行的 ingress-nginx 版本:

kubectl get pods --selector app.kubernetes.io/name=ingress-nginx --selector app.kubernetes.io/component=controller -A -o yaml | grep image:

示例结果:

      image: quay.io/jetstack/cert-manager-controller:v1.16.1
      image: quay.io/jetstack/cert-manager-controller:v1.16.1
      image: registry.k8s.io/ingress-nginx/controller:v1.12.0-beta.0@sha256:9724476b928967173d501040631b23ba07f47073999e80e34b120e8db5f234d5
      image: sha256:11b916a025f028a5868d51d66773e876910636a1c261e919d72864dbb9bfc860
      image: registry.k8s.io/ingress-nginx/controller:v1.12.0-beta.0@sha256:9724476b928967173d501040631b23ba07f47073999e80e34b120e8db5f234d5
      image: sha256:11b916a025f028a5868d51d66773e876910636a1c261e919d72864dbb9bfc860
      image: registry.k8s.io/ingress-nginx/controller:v1.12.0-beta.0@sha256:9724476b928967173d501040631b23ba07f47073999e80e34b120e8db5f234d5
      image: sha256:11b916a025f028a5868d51d66773e876910636a1c261e919d72864dbb9bfc860
      image: docker.io/kubesphere/ingress-nginx-controller:v1.4.0
      image: docker.io/istio/proxyv2:1.16.5
      image: docker.io/istio/proxyv2:1.16.5
      image: docker.io/kubesphere/ingress-nginx-controller:v1.4.0
      image: docker.io/istio/proxyv2:1.16.5
      image: docker.io/istio/proxyv2:1.16.5
      image: docker.io/kubesphere/ingress-nginx-controller:v1.4.0
      image: docker.io/istio/proxyv2:1.16.5
      image: docker.io/istio/proxyv2:1.16.5
      image: docker.io/kubesphere/ingress-nginx-controller:v1.4.0
      image: docker.io/istio/proxyv2:1.16.5
      image: docker.io/istio/proxyv2:1.16.5

受影响版本:

  • < v1.11.0
  • v1.11.0 - v1.11.4
  • v1.12.0

如果您使用的是受影响版本,请立即解决方案或缓解措施。

解决方案

1. 升级(nginx 社区推荐方案)

升级至以下安全版本之一:

  • v1.11.5
  • v1.12.1
  • 或更高版本

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.1/deploy/static/provider/cloud/deploy.yaml

2. 升级修复(KubeSphere 产品中的网关)

对于 KubeSphere 和 KubeSphere 企业版 v4.1.3,将 Kubesphere 网关升级到 v1.0.4 版本(Ingress-Nginx controller 版本 v1.12.1)。

对于 v4.1.3 之前的 KubeSphere 和 KubeSphere 企业版,请先升级至 v4.1.3。

1. 升级 KubeSphere v4.1.x 到 v4.1.3

https://kubesphere.io/zh/docs/v4.1/03-installation-and-upgrade/03-upgrade-kubesphere/02-upgrade-kubesphere-from-v4.1.x/

升级 host 集群,确认当前集群为待升级集群。

kubectl get node -o wide

导出当前集群 ks-core 的配置。

helm get values -n kubesphere-system ks-core -o yaml > host-cluster-custom-values.yaml

修改配置文件

# 需要注意以下配置项,其他的配置字段请保留
global:
  imageRegistry: docker.io
extension:
  imageRegistry: docker.io

# 注意集群角色参数由 role 变更为 multicluster.role
multicluster:
  role: host

执行以下命令开始升级。

helm -n kubesphere-system upgrade ks-core https://charts.kubesphere.io/main/ks-core-1.1.4.tgz -f host-cluster-custom-values.yaml --wait --debug

检查 host 集群是否升级成功

helm -n kubesphere-system get metadata ks-core
NAME: ks-core
CHART: ks-core
VERSION: 1.1.4
APP_VERSION: v4.1.3
NAMESPACE: kubesphere-system

2. 升级扩展组件

TAG=$(curl -s https://api.github.com/repos/kubesphere-extensions/ks-extensions/releases/latest | jq -r '.tag_name')
helm -n kubesphere-system upgrade ks-core https://charts.kubesphere.io/main/ks-core-1.1.4.tgz --set ksExtensionRepository.image.tag=$TAG
点击扩展中心 → 选择更新
image-20250414112401171 image-20250414113218516

最后效果

root@k8s-worker01:~# kubectl get pods --selector app.kubernetes.io/name=ingress-nginx --selector app.kubernetes.io/component=controller -A -o yaml | grep image:
      image: quay.io/jetstack/cert-manager-controller:v1.16.1
      image: quay.io/jetstack/cert-manager-controller:v1.16.1
      image: registry.k8s.io/ingress-nginx/controller:v1.12.1@sha256:d2fbc4ec70d8aa2050dd91a91506e998765e86c96f32cffb56c503c9c34eed5b
      image: docker.io/kubesphere/ingress-nginx-controller:v1.12.1
      image: registry.k8s.io/ingress-nginx/controller:v1.12.1@sha256:d2fbc4ec70d8aa2050dd91a91506e998765e86c96f32cffb56c503c9c34eed5b
    - image: registry.k8s.io/ingress-nginx/controller:v1.12.1@sha256:d2fbc4ec70d8aa2050dd91a91506e998765e86c96f32cffb56c503c9c34eed5b
      image: registry.k8s.io/ingress-nginx/controller:v1.12.1@sha256:d2fbc4ec70d8aa2050dd91a91506e998765e86c96f32cffb56c503c9c34eed5b
      image: docker.io/kubesphere/ingress-nginx-controller:v1.12.1
      image: docker.io/kubesphere/ingress-nginx-controller:v1.12.1
      image: docker.io/istio/proxyv2:1.16.5
      image: docker.io/istio/proxyv2:1.16.5
      image: docker.io/kubesphere/ingress-nginx-controller:v1.12.1
      image: docker.io/istio/proxyv2:1.16.5
      image: docker.io/istio/proxyv2:1.16.5
      image: docker.io/kubesphere/ingress-nginx-controller:v1.12.1
      image: docker.io/istio/proxyv2:1.16.5
      image: docker.io/istio/proxyv2:1.16.5
      image: docker.io/kubesphere/ingress-nginx-controller:v1.12.1
      image: docker.io/istio/proxyv2:1.16.5
      image: docker.io/istio/proxyv2:1.16.5