具体来说,恶意用户可以使用 KubernetesAPI 服务器连接到后端服务器以发送任意请求,并通过 API 服务器的 TLS 凭证进行身份验证。这一安全漏洞的严重性更在于它可以远程执行,攻击并不复杂,不需要用户交互或特殊权限。
更糟糕的是,在 Kubernetes 的默认配置中,允许所有用户(经过身份验证和未经身份验证的用户)执行允许此升级的发现 API 调用。也就是说,任何了解这个漏洞的人都可以掌控你的 Kubernetes 集群。
最后的痛苦之处在于,对于用户而言,没有简单的方法来检测此漏洞是否已被使用。由于未经授权的请求是通过已建立的连接进行的,因此它们不会出现在 Kubernetes API 服务器审核日志或服务器日志中。请求确实会出现在 kubelet 或聚合的API服务器日志中,但是却无法与正确通过 Kubernetes API 服务器授权和代理的请求区分开来。
现在,Kubernetes 已经发布了修补版本 v1.10.11、v1.11.5、v1.12.3 和 v1.13.0-rc.1。如果仍在使用 Kubernetes v1.0.x 至 Kubernetes v1.9.x 版本,请即刻停止使用并升级到修补版本。
如果由于某种原因无法进行升级,也必须暂停使用聚合的 API 服务器,并从不应具有对 kubelet API 的完全访问权限的用户中删除 pod exec/attach/portforward 权限。
Kubernetes作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。API Server是集群内部各个组件通信的中介,也是外部控制的入口。所以Kubernetes的安全机制基本就是围绕保护API Server来设计的。
Kubernetes使用了认证(Authentication)、鉴权(Authorization)、准入控制(Admission Control)三步来保证API Server的安全。
Kubelet 认证
默认情况下,所有未被配置的其他身份验证⽅法拒绝的,对kubelet的HTTPS端点的请求将
被视为匿名请求,并被授予system:anonymous⽤户名和system:unauthenticated组。
如果要禁⽤匿名访问并发送 401 Unauthorized 的未经身份验证的请求的响应:
启动kubelet时指定 --anonymous-auth=false
对kubelet HTTPS端点启⽤X509客户端证书身份验证:
--client-ca-file 提供 CA bundle 以验证客户端证书
启动apiserver时指定--kubelet-client-certificate和--kubelet-client-key标志
Secret
Kubernetes设计了⼀种资源对象叫做Secret,分为两类,⼀种是⽤于ServiceAccount的
service-account-token
另⼀种是⽤于保存⽤户⾃定义保密信息的Opaque。我们在ServiceAccount中⽤到包含三个
部分:Token、ca.crt、namespace。
token 是使⽤API Server私钥签名的JWT。⽤于访问API Server时,Server端认证。
ca.crt ,根证书。⽤于Client端验证API Server发送的证书。
namespace , 标识这个service-account-token的作⽤域名空间。
更详细参考:https://k8smeetup.github.io/docs/admin/kubelet-authenticationauthorization/
通过kubelet攻击Kubernetes
通过kubelet默认配置对Kubernetes集群上的API Server发起特权访,特权访问有可能会获取集群中的敏感信息,也可能导致节点上机器命令执⾏。
API Server提供了对集群各种资源访问和控制的REST API。
在缺少对TLS身份验证,⽽在⼀些默认配置中启⽤了,--anonymous-auth 默认为true
允许匿名身份访问API,端⼝为10250
/pods # 列出正在运⾏中的pod
/exec # 在容器中运⾏命令并反回信息
这⾥我从shodan上随意找的IP进⾏测试
https://192.168.4.110:10250/pods
获取信息执⾏容器中的命令:
CURL请求:
不过有点可惜,较⽼版本现在已经⾏不通了。
除了通过curl请求,提供了这样的⼀个脚本执⾏Kubelet Anonymous RCE :
https://github.com/serain/kubelet-anon-rce
帮助⽂档例⼦:
如果能执⾏命令可以通过:
/var/run/secrets/kubernetes.io/serviceaccount 获取token
然后访问kube-api server
测试步骤:
1. 访问pods获取信息
2. 获取namespace、pods、container
3. 执⾏exec获取token
4. /var/run/secrets/kubernetes.io/serviceaccount
5. 利⽤Token访问API Server进⾏对pods操作
Kube-Hunter寻找漏洞
使⽤Kube-hunter寻找Kubernetes集群中的安全漏洞。
会对apiserver、dashboard、etcd、hosts、kubelet、ports、proxy进⾏测试。
https://github.com/aquasecurity/kube-hunter
通过⼀些信息判断,发现匿名身份验证,可以访问pods 查看信息。
对外⽹IP扫描:
Kubelet API | 91.xxx.xxx.x2:10255
Kubelet API | 91.xxx.xxx.x2:10250
API Server | 91.xxx.xxx.x2:6443
-
服务器
+关注
关注
12文章
9046浏览量
85238 -
API
+关注
关注
2文章
1489浏览量
61854 -
安全漏洞
+关注
关注
0文章
150浏览量
16708
原文标题:干货 | k8s安全漏洞如何解决 (上)
文章出处:【微信号:aming_linux,微信公众号:阿铭linux】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论