
# CCE集群安全配置建议
从安全的角度，建议您对集群做如下配置。
#### 使用最新版本的CCE集群
Kubernetes社区一般4个月左右发布一个大版本，CCE的版本发布频率跟随社区版本发布节奏，在社区发布Kubernetes版本后3个月左右同步发布新的CCE版本，例如Kubernetes v1.19于2020年9月发布后，CCE于2021年3月左右发布CCE v1.19版本。
最新版本的集群修复了已知的漏洞或者拥有更完善的安全防护机制，新建集群时推荐选择使用最新版本的集群。在集群版本停止提供服务前，请及时升级到新版本。
#### 及时跟踪处理官网发布的漏洞
CCE服务会不定期发布涉及的漏洞，用户需及时关注和处理，参见[漏洞公告](https://support.huaweicloud.com/bulletin-cce/cce_bulletin_0011.html)。
#### 关闭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用户，应合理配置子用户和命名空间的权限。
- 配置集群权限请参考[集群权限（IAM授权）](https://support.huaweicloud.com/usermanual-cce/cce_10_0188.html)。
- 设置命名空间权限请参考[命名空间权限（Kubernetes RBAC授权）](https://support.huaweicloud.com/usermanual-cce/cce_10_0189.html)。
 
#### 配置集群命名空间资源配额限制
应限制每个命名空间能够分配的资源总量，控制的资源包括：CPU、内存、存储、pods、services、deployments、statefulsets等。合理配置命名空间的可分配资源总量，能够防止某个命名空间创建过多的资源影响整个集群的稳定性。
详情请参见：[设置资源配额及限制](https://support.huaweicloud.com/usermanual-cce/cce_10_0287.html)。
#### 配置命名空间下容器的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来达到隔离的效果。具体使用请参考[网络策略(NetworkPolicy)](https://support.huaweicloud.com/usermanual-cce/cce_10_0059.html)。
  
- 云原生网络2.0 云原生网络2.0模型下，可以通过配置安全组达到Pod间网络隔离。具体使用请参见[SecurityGroup](https://support.huaweicloud.com/usermanual-cce/cce_10_0288.html)。
  
- VPC网络 暂不支持网络隔离。
  
 
#### kubelet开启Webhook鉴权模式
![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/notice_3.0-zh-cn.png)
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**
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002679890605.png "点击放大")
   
   
 
#### 使用完成后及时卸载webterminal插件
web-terminal插件能够对CCE集群进行管理，请用户妥善保管好登录密码，避免密码泄漏造成损失。使用完成后及时卸载插件。
#### 使用物理多租
为每个租户创建一个独立的CCE集群，这样可以确保租户之间的资源相互隔离，降低攻击面。但是此方案有几个缺点：
- 成本高：为每个租户提供独立的集群可能会增加成本，因为需要购买更多的硬件或虚拟机资源，以及更多的人力和时间来管理和维护这些集群。
- 资源利用效率低：每个租户都需要独立的硬件或虚拟机资源来运行他们的集群，这可能导致资源的浪费，因为这些资源可能并未被充分利用。
- 管理复杂性增加：为每个租户管理和维护独立的集群来增加了管理的复杂性，可能需要更多的人力和时间。
 
#### 使用安全容器
相比于普通运行时，安全运行时可以让您的每个容器（准确地说是Pod）都运行在一个单独的微型虚拟机中，拥有独立的操作系统内核，以及虚拟化层的安全隔离。通过使用安全运行时，不同容器之间的内核、计算资源、网络都是隔离开的，保护了Pod的资源和数据不被其他Pod抢占和窃取。CCE Turbo集群支持使用安全运行时创建工作负载，可在CCE Turbo集群中购买物理机并选择containerd容器运行时使用安全容器。
