更新kubelet匿名访问漏洞文档说明

pull/199/merge
gjmzj 2018-05-19 23:56:54 +08:00
parent 58ccd3bc88
commit dfff890926
3 changed files with 35 additions and 2 deletions

View File

@ -94,6 +94,8 @@ ExecStart={{ bin_dir }}/kube-apiserver \
--authorization-mode=Node,RBAC \
--runtime-config=rbac.authorization.k8s.io/v1 \
--kubelet-https=true \
--kubelet-client-certificate={{ ca_dir }}/kubernetes.pem \
--kubelet-client-key={{ ca_dir }}/kubernetes-key.pem \
--anonymous-auth=false \
--basic-auth-file={{ ca_dir }}/basic-auth.csv \
--enable-bootstrap-token-auth \
@ -129,6 +131,7 @@ WantedBy=multi-user.target
+ 关于authorization-mode=Node,RBAC v1.7+支持Node授权配合NodeRestriction准入控制来限制kubelet仅可访问node、endpoint、pod、service以及secret、configmap、PV和PVC等相关的资源需要注意的是v1.7中Node 授权是默认开启的v1.8中需要显式配置开启,否则 Node无法正常工作
+ 缺省情况下 kubernetes 对象保存在 etcd /registry 路径下,可以通过 --etcd-prefix 参数进行调整
+ 详细参数配置请参考`kube-apiserver --help`,关于认证、授权和准入控制请[阅读](https://github.com/feiskyer/kubernetes-handbook/blob/master/components/apiserver.md)
+ 增加了访问kubelet使用的证书配置防止匿名访问kubelet的安全漏洞详见[漏洞说明](mixes/01.fix_kubelet_annoymous_access.md)
### 创建controller-manager 的服务文件

View File

@ -51,10 +51,11 @@ WorkingDirectory=/var/lib/kubelet
ExecStart={{ bin_dir }}/kubelet \
--address={{ NODE_IP }} \
--hostname-override={{ NODE_IP }} \
--pod-infra-container-image=mirrorgooglecontainers/pause-amd64:3.0 \
--pod-infra-container-image=mirrorgooglecontainers/pause-amd64:3.1 \
--experimental-bootstrap-kubeconfig=/etc/kubernetes/bootstrap.kubeconfig \
--kubeconfig=/etc/kubernetes/kubelet.kubeconfig \
--cert-dir={{ ca_dir }} \
--client-ca-file={{ ca_dir }}/ca.pem \
--network-plugin=cni \
--cni-conf-dir=/etc/cni/net.d \
--cni-bin-dir={{ bin_dir }} \
@ -63,6 +64,7 @@ ExecStart={{ bin_dir }}/kubelet \
--hairpin-mode hairpin-veth \
--allow-privileged=true \
--fail-swap-on=false \
--anonymous-auth=false \
--logtostderr=true \
--v=2
#kubelet cAdvisor 默认在所有接口监听 4194 端口的请求, 以下iptables限制内网访问
@ -80,7 +82,8 @@ WantedBy=multi-user.target
+ --experimental-bootstrap-kubeconfig 指向 bootstrap kubeconfig 文件kubelet 使用该文件中的用户名和 token 向 kube-apiserver 发送 TLS Bootstrapping 请求
+ --cluster-dns 指定 kubedns 的 Service IP(可以先分配,后续创建 kubedns 服务时指定该 IP)--cluster-domain 指定域名后缀,这两个参数同时指定后才会生效;
+ --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir={{ bin_dir }} 为使用cni 网络并调用calico管理网络所需的配置
+ --fail-swap-on=false K8S 1.8需显示禁用这个,否则服务不能启动
+ --fail-swap-on=false K8S 1.8+需显示禁用这个,否则服务不能启动
+ --client-ca-file={{ ca_dir }}/ca.pem 和 --anonymous-auth=false 关闭kubelet的匿名访问详见[匿名访问漏洞说明](mixes/01.fix_kubelet_annoymous_access.md)
### 创建 kube-proxy kubeconfig 文件

View File

@ -0,0 +1,27 @@
# 修复kubelet默认允许匿名访问
kubelet默认启动参数`--anonymous-auth=true`风险非常大黑客可以在集群中植入挖坑程序甚至通过这个漏洞获取宿主系统root权限。
感谢 `cqspirit` [PR #192](https://github.com/gjmzj/kubeasz/pull/192) 提醒
## 关于漏洞的危害
据我所知k8s v1.5+ 所有版本的kubelet组件的默认启动参数是允许匿名访问kubelet的默认的大坑你可以使用如下命令检查你的集群
`curl -sk https://$NODE_IP:10250/runningpods/`
- 如果返回了运行的pod信息说明是允许匿名访问的
- 如果返回`Unauthorized`,说明是安全的
部分关于该漏洞的讨论参考如下:
- [Kubernetes-From-Container-To-Cluster](https://raesene.github.io/blog/2016/10/08/Kubernetes-From-Container-To-Cluster/)
- [Analysis of a Kubernetes hack -- Backdooring through kubelet](https://www.reddit.com/r/netsec/comments/847994/analysis_of_a_kubernetes_hack_backdooring_through/)
- [kubelet-exploit](https://github.com/kayrus/kubelet-exploit)
## 漏洞的修复
最新代码已经修复,参考[官方文档说明](https://kubernetes.io/docs/admin/kubelet-authentication-authorization/),已有集群可以登陆`deploy`节点操作如下:
``` bash
$ cd /etc/ansible
$ git pull origin master
$ ansible-playbook -t upgrade_k8s 04.kube-master.yml
$ ansible-playbook -t upgrade_k8s 05.kube-node.yml
```