4.2.3 Kubelet未授权访问

在一个Kubernetes集群中,Kubelet是主要的“节点代理”,运行在集群的每个节点上。它负责向API Server注册所在节点。

与Kubernetes API Server类似,Kubelet同样运行着API服务(默认在10250端口),集群中其他组件可以通过调用API来改变集群状态,比如启动和停止Pod。既然同样有API服务,那么也就会存在未授权访问的问题。如果未授权用户能够访问甚至向某个节点上的Kubelet下发命令,那么他就很可能控制整个集群。

Kubelet的配置文件是/var/lib/kubelet/config.yaml。一般来说,我们在安装Kubernetes时会将--anonymous-auth设置为false,并在authorization中选择mode为Webhook。前一选项禁止匿名用户访问,后一选项则使Kubelet通过API Server进行授权(即使匿名用户能够访问,也几乎不具备任何权限)。

然而,假如--anonymous-auth被设置为true,且authorization.mode被设置为AlwaysAllow,这就十分危险了。

在这种情况下,攻击者能够做非常多的事情,例如可列出正在运行的Pod,如图4-5所示。

图4-5 列出正在运行的Pod

攻击者还可以对任意Pod执行命令,从而提升权限。一种思路是:对Kubernetes API Server的Pod执行读取敏感凭证的命令,进而读取凭证并获得高权限身份,然后利用该身份与Kubernetes API Server交互并创建新的Pod,从而逃逸出容器。具体过程见4.3节。