更新时间:2024-07-27 GMT+08:00

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 最小和最大的资源使用量的限制。

    例如为一个命名空间的pod创建最大最小CPU使用限制:

    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 能申请的最小和最大的存储空间大小的限制。

    storagelimit.yaml

    apiVersion: v1
    kind: LimitRange
    metadata:
      name: storagelimit
    spec:
      limits:
      - type: PersistentVolumeClaim
        max:
          storage: 2Gi
        min:
          storage: 1Gi

    然后使用kubectl -n <namespace> create -f storagelimit.yaml完成创建。

配置集群内的网络隔离

  • 容器隧道网络

    针对集群内命名空间之间以及同一命名空间下工作负载之间需要网络隔离的场景,可以通过配置NetworkPolicy来达到隔离的效果。

  • VPC网络

    暂不支持网络隔离。

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),步骤如下:

  1. 创建clusterrolebinding,执行命令:

    kubectl create clusterrolebinding kube-apiserver-kubelet-admin --clusterrole=system:kubelet-api-admin --user=system:kube-apiserver

  2. 已创建的节点,需要登录到节点更改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

  3. 新创建的节点,在创建节点的安装后执行脚本里加入以下命令去后置修改kubelet的权限模式:

    sed -i s/AlwaysAllow/Webhook/g /var/paas/kubernetes/kubelet/kubelet_config.yaml; systemctl restart kubelet

使用完成后及时卸载webterminal插件

web-terminal插件能够对CCE集群进行管理,请用户妥善保管好登录密码,避免密码泄漏造成损失。使用完成后及时卸载插件。