CCE集群安全配置建议
从安全的角度,建议您对集群做如下配置。
使用最新版本的CCE集群
Kubernetes社区一般4个月左右发布一个大版本,CCE的版本发布频率跟随社区版本发布节奏,在社区发布Kubernetes版本后3个月左右同步发布新的CCE版本,例如Kubernetes v1.19于2020年9月发布后,CCE于2021年3月左右发布CCE v1.19版本。
最新版本的集群修复了已知的漏洞或者拥有更完善的安全防护机制,新建集群时推荐选择使用最新版本的集群。在集群版本停止提供服务前,请及时升级到新版本。
关闭default的serviceaccount的token自动挂载功能
kubernetes默认会给每个工作负载实例关联default服务账号,即在容器内挂载一个token,该token能够通过kube-apiserver和kubelet组件的认证。在没有开启RBAC的集群,得到该token相当于是得到了整个CCE集群的控制权。在开启RBAC的集群,该token所拥有的权限,取决于环境管理员给这个服务账号关联了什么角色。该服务账号的token一般是给需要访问kube-apiserver的容器使用,如CoreDNS、autoscaler、prometheus等。对于不需要访问kube-apiserver的工作负载,建议关闭服务账号的自动关联功能。
禁用方法:
- 方法一:将服务账号的automountServiceAccountToken字段设置为false。完成设置后,创建的工作负载将不会默认关联default服务账号。注意:每个命名空间都要按需设置。
apiVersion: v1 kind: ServiceAccount metadata: name: default automountServiceAccountToken: false ...
当工作负载需要关联服务账号时,在工作负载的yaml描述文件中显式地指定。
... spec: template: spec: serviceAccountName: default automountServiceAccountToken: true ...
- 方法二:显式地关闭工作负载自动关联服务账号的功能。
... spec: template: spec: automountServiceAccountToken: false ...
合理配置用户的集群访问权限
CCE支持账号创建多个IAM用户。通过创建不同的用户组,并授予不同用户组不同的访问权限,然后在创建用户时将用户加入对应权限的用户组中,即可完成控制不同用户具备不同的区域(region)、是否只读的权限。同时也支持为用户或者用户组配置命名空间级别的权限。考虑到安全,建议最小化用户的访问权限。
如果主账号下需要配置多个IAM用户,应合理配置子用户和命名空间的权限。
配置集群命名空间资源配额限制
应限制每个命名空间能够分配的资源总量,控制的资源包括:CPU、内存、存储、pods、services、deployments、statefulsets等。合理配置命名空间的可分配资源总量,能够防止某个命名空间创建过多的资源影响整个集群的稳定性。
配置命名空间下容器的Limit ranges
通过资源配额,集群管理员可以以命名空间为单位,限制其资源的使用与创建。 在命名空间中,一个 Pod 或 Container 最多能够使用命名空间的资源配额所定义的 CPU 和内存用量,这样一个 Pod 或 Container 可能会垄断该命名空间下所有可用的资源。建议配置LimitRange 在命名空间内限制资源分配。limitrange可以做到如下限制:
- 在一个命名空间中实施对每个 Pod 或 Container 最小和最大的资源使用量的限制。
cpu-constraints.yaml
apiVersion: v1 kind: LimitRange metadata: name: cpu-min-max-demo-lr spec: limits: - max: cpu: "800m" min: cpu: "200m" type: Container
然后使用kubectl -n <namespace> create -f cpu-constraints.yaml完成创建。注意,如果没有指定容器使用cpu的默认值,平台会自动配置CPU使用的默认值,即创建完成后自动添加default配置:
... spec: limits: - default: cpu: 800m defaultRequest: cpu: 800m max: cpu: 800m min: cpu: 200m type: Container
- 在一个命名空间中实施对每个 PersistentVolumeClaim 能申请的最小和最大的存储空间大小的限制。
apiVersion: v1 kind: LimitRange metadata: name: storagelimit spec: limits: - type: PersistentVolumeClaim max: storage: 2Gi min: storage: 1Gi
然后使用kubectl -n <namespace> create -f storagelimit.yaml完成创建。
kubelet开启Webhook鉴权模式
v1.15.6-r1及之前版本的CCE集群涉及。v1.15.6-r1之后的版本不涉及。
将CCE集群版本升级至1.13或1.15版本,并开启集群RBAC能力,如果版本已经是1.13或以上版本,则无需升级。
创建节点时可通过postInstall文件注入的方式开启kubelet的鉴权模式(设置kubelet的启动参数:--authorization-node=Webhook),步骤如下:
- 创建clusterrolebinding,执行命令:
kubectl create clusterrolebinding kube-apiserver-kubelet-admin --clusterrole=system:kubelet-api-admin --user=system:kube-apiserver
- 已创建的节点,需要登录到节点更改kubelet的鉴权模式,更改节点上/var/paas/kubernetes/kubelet/kubelet_config.yaml里的authorization mode为Webhook,然后重启kubelet,执行如下命令:
sed -i s/AlwaysAllow/Webhook/g /var/paas/kubernetes/kubelet/kubelet_config.yaml; systemctl restart kubelet
- 新创建的节点,在创建节点的安装后执行脚本里加入以下命令去后置修改kubelet的权限模式:
sed -i s/AlwaysAllow/Webhook/g /var/paas/kubernetes/kubelet/kubelet_config.yaml; systemctl restart kubelet
使用完成后及时卸载webterminal插件
web-terminal插件能够对CCE集群进行管理,请用户妥善保管好登录密码,避免密码泄漏造成损失。使用完成后及时卸载插件。