跳至内容

CVE-2017-14491

kube-dns 使用的 dnsmasq 中存在一个漏洞,需要升级 kube-dns 组件。该组件是 Kubernetes 中安装的默认 DNS 组件。该漏洞可能被外部利用。以下链接提供了有关 CVE 的完整详细信息。此漏洞并非 Kubernetes 特定的漏洞,而是存在于 dnsmasq 中。

当前 kOps 状态

kops 版本 1.7.1 解决了此 CVE。此版本的 kops 将升级和创建集群。kops 1.8.0.alpha.1 版本不包含所需的更改,但 1.8.0.apha.2 版本发布时将包含所需的补丁。

升级集群

执行 kops update cluster 时,kube-dns 部署将自动升级。将 my-cluster.example.com 替换为您的集群名称。如果您正在升级 Kubernetes 1.4.x 或 1.5.x 集群,您可能需要按照以下说明为 kube-dns 创建所需的配置映射。

升级命令

kops update cluster --yes --name my-cluster.example.com

验证更改是否已应用到部署

kubectl get deployment -n kube-system kube-dns \
-o jsonpath='{.spec.template.spec.containers[?(@.name == "dnsmasq")].image}'

升级将在渠道实用程序在几分钟内拾取更改后发生。

已测试的 Kubernetes 版本

Kubernetes 版本 1.5.8、1.6.11、1.7.7 和 1.8.0 已使用新版本的 kube-dns 部署进行了全面测试。其他版本应该可以正常运行,但建议升级到已测试的版本。我们已经成功地帮助 1.4.x 用户进行了升级,但我们无法验证其在生产环境中的完整稳定性。始终建议在非生产环境中进行本地测试。我们无法量化使用未经测试版本的风险。

已修复的 kOps 版本

我们计划在 1.8.x kOps 版本中发布。1.7.1 版本已发布,其中包含所需的更改。如果您使用的是 1.8.x alpha 版本,我们建议应用热修复。

已修复的 kOps 版本矩阵

kOps 版本 已修复 已发布 将修复 URL
1.7.1 Y Y 不适用 这里
Y N 不适用 这里
1.8.0 N N Y 不适用
1.8.0.alpha.1 N Y N 不适用
1.7.0 N Y N 不适用

kOps PR 修复

  • 由 @mikesplain 在 #3511 中修复
  • 由 @mikesplain 在 #3538 中修复

kOps 跟踪问题

  • 由 @chrislovecnm 在 #3512 中提交

热修复说明

最小的修复只是更新使用 dnsmasq 的 pod 的容器。您可以应用此修复程序而不会出现停机时间。不同 Kubernetes 版本的热修复说明有所不同。较新版本的 kube-dns 包含 k8s-dns-dnsmasq-nanny-amd64 容器。

Kubernetes 版本 1.6.x 及更高版本

热修复的安装

将更新应用到容器

kubectl set image deployment/kube-dns -n kube-system \
 dnsmasq=k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64:1.14.5

验证更改是否已应用到部署

kubectl get deployment -n kube-system kube-dns \
 -o jsonpath='{.spec.template.spec.containers[?(@.name == "dnsmasq")].image}'

验证

要验证 pod 是否已部署

kubectl get pods -n kube-system -o \
 custom-columns=NAME:.metadata.name,IMAGE:.spec.containers[*].image \
 -l k8s-app=kube-dns

您应该看到 k8s-dns-dnsmasq-nanny-amd64 容器的版本 1.14.5

NAME                        IMAGE
kube-dns-1100866048-3lqm0   k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64:1.14.5,k8s.gcr.io/k8s-dns-kube-dns-amd64:1.14.5,k8s.gcr.io/k8s-dns-sidecar-amd64:1.14.5
kube-dns-1100866048-tjlv2   k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64:1.14.5,k8s.gcr.io/k8s-dns-kube-dns-amd64:1.14.5,k8s.gcr.io/k8s-dns-sidecar-amd64:1.14.5

Kubernetes 版本 1.4.x - 1.5.x

检查您是否拥有 kube-dns 的新配置映射。1.14.5 容器需要配置映射,没有配置映射,kube-dns 不会 启动。

依赖项的安装

kubectl -n kube-system get configmap kube-dns

如果配置映射不存在,则创建一个空的配置映射。

热修复的安装

kubectl create configmap -n kube-system kube-dns

将 kube-dns 容器升级到新版本。

kubectl set image deployment/kube-dns -n kube-system \
 dnsmasq=k8s.gcr.io/k8s-dns-dnsmasq-amd64:1.14.5

验证更改是否已应用到部署

kubectl get deployment -n kube-system kube-dns \
 -o jsonpath='{.spec.template.spec.containers[?(@.name == "dnsmasq")].image}'
要验证 pod 是否已部署

kubectl get pods -n kube-system -o \
 custom-columns=NAME:.metadata.name,IMAGE:.spec.containers[*].image \
  -l k8s-app=kube-dns

您应该看到 dnsmasq pod 的版本 1.14.5

NAME                        IMAGE
kube-dns-4146767324-djthf   k8s.gcr.io/kubedns-amd64:1.9,k8s.gcr.io/k8s-dns-dnsmasq-amd64:1.14.5,k8s.gcr.io/dnsmasq-metrics-amd64:1.0,k8s.gcr.io/exechealthz-amd64:1.2
kube-dns-4146767324-kloxi   k8s.gcr.io/kubedns-amd64:1.9,k8s.gcr.io/k8s-dns-dnsmasq-amd64:1.14.5,k8s.gcr.io/dnsmasq-metrics-amd64:1.0,k8s.gcr.io/exechealthz-amd64:1.2

更多信息

感谢

感谢所有提供帮助的人,包括 @mikesplain、@chrislovecnm、@snoby、@justinsb、@3h4x、@aaronlevy