策略管理

最近更新时间:2024-07-10 14:25:21

我的收藏

简介

原生 Kubernetes 存在级联删除机制,删除一个资源时会自动删除与之相关的其他资源,例如删除 Namespace 时会自动删除 Namespace 下所有的 Pod、Service、Configmap 等关联资源,可能导致业务故障。
容器服务(Tencent Kubernetes Engine,TKE)新增了“策略管理”模块,通过系统预置策略的方式,防止误删除引起业务故障。

策略说明

策略分类

集群删除防护:在删除集群时,如果集群中仍然存在节点,则不允许删除。
集群内资源删除防护:在删除 TKE 集群内的各类资源时,如果仍然存在依赖资源,则不允许删除。

支持边界

集群删除防护策略:支持所有版本的 TKE 标准集群和 TKE Serverless 集群,暂不支持注册集群和边缘集群。
集群内资源删除防护策略:目前支持 1.16~1.26 版本的 TKE 标准集群和 TKE Serverless 集群,暂不支持注册集群和边缘集群。

策略类型

基线策略:默认开启,不允许关闭。
优选策略:TKE团队提供的安全加固策略,用户可根据实际情况,设置策略运行模式,具体参考策略库中的运行模式。
可选策略:用户可以根据实际情况,自行创建策略实例,具体创建流程请参见 新建策略实例

策略库

基线策略

策略名称
策略分类
策略描述
拦截对象
运行模式
存在节点的集群不允许删除。
集群策略
集群中存在任意节点(普通节点、原生节点、注册节点),需先下线节点后方可删除。
集群
默认 deny

优选策略

策略名称
策略分类
策略描述
拦截对象
运行模式
命名空间下存在工作负载则不允许删除。
命名空间策略
命名空间内如果存在 Pod,需要先清空该命名空间下的所有 Pod,再删除 Namespace。
namespace
默认 deny
CRD 存在关联的 CR 资源则不允许删除。
配置相关策略
CRD 定义了 CR 资源,需要先删除 CR 资源,再删除 CRD。
CRD
默认 deny

可选策略

策略名称
策略分类
策略描述
拦截对象
tkeblockvolumemountpath
计算资源策略
禁止容器挂载指定的目录。
pods
k8sallowedrepos
计算资源策略
容器镜像必须以指定字符串列表中的字符串开头。
pods
k8spspautomountserviceaccounttokenpod
计算资源策略
约束容器不能设置 automountServiceAccountToken 为 true。
pods
k8sblockendpointeditdefaultrole
配置相关策略
默认情况下,许多 Kubernetes 都预定义了一个名为 system:aggregate-to-edit 的 ClusterRole,k8sblockendpointeditdefaultrole 策略定义禁止该 ClusterRole 对 Endpoints 进行 create、patch 和 update 操作。
clusterroles
k8sblockloadbalancer
网络资源策略
不允许 Service 为 LoadBalancer 类型。
services
k8sblocknodeport
网络资源策略
不允许 Service 为 NodePort 类型。
services
k8sblockwildcardingress
网络资源策略
禁止 ingress 配置空白或通配符类型的 hostname。
ingresses
k8scontainerlimits
计算资源策略
限制容器必须设置 CPU 和内存 Limit,并且小于设定的最大值。
pods
k8scontainerrequests
计算资源策略
限制 CPU 和内存的 Request 必须设置且小于配置的最大值。
pods
k8scontainerratios
计算资源策略
限制 CPU 和内存的 Request 与 Limit 的最大比率。
pods
k8srequiredresources
计算资源策略
必须配置内存的 Limit,CPU 和内存的 Request。
pods
k8sdisallowanonymous
配置相关策略
不允许将白名单以外的 ClusterRole 和 Role 关联到 system:anonymous User 和 system:unauthenticated Group。
rolebindings clusterrolebindings
k8sdisallowedtags
计算资源策略
约束容器镜像 tag。
pods
k8sexternalips
网络资源策略
限制服务 externalIP 仅为允许的 IP 地址列表。
services
k8simagedigests
计算资源策略
容器镜像必须包含 digest。
pods
noupdateserviceaccount
计算资源策略
拒绝白名单外的资源更新 ServiceAccount。
replicationcontrollers replicasets deployments statefulsets daemonsets cronjobs
k8sreplicalimits
计算资源策略
要求具有 “spec.replicas” 字段的对象(Deployments、ReplicaSets等)在定义的范围内。
deployments
k8srequiredannotations
网络资源策略
要求资源包含指定的 annotations,其值与提供的正则表达式匹配。
services
k8srequiredlabels
命名空间策略
要求资源包含指定的标签,其值与提供的正则表达式匹配。
namespaces
k8srequiredprobes
计算资源策略
要求 Pod 具有 Readiness 或 Liveness Probe。
pods
k8spspallowprivilegeescalationcontainer
计算资源策略
约束 PodSecurityPolicy 中的 “allowPrivilegeEscalation” 字段为 false。
pods
k8spspapparmor
计算资源策略
约束 AppArmor 字段列表。
pods
k8spspcapabilities
计算资源策略
限制 PodSecurityPolicy 中的 “allowedCapabilities” 和 “requiredDropCapabilities” 字段。
pods
k8spspflexvolumes
计算资源策略
约束 PodSecurityPolicy 中的 allowedFlexVolumes 字段类型。
pods
k8spspforbiddensysctls
计算资源策略
约束 PodSecurityPolicy 中的 “sysctls” 字段不能使用的 name。
pods
k8spspfsgroup
计算资源策略
控制 PodSecurityPolicy 中的 “fsGroup” 字段在限制范围内。
pods
k8spsphostfilesystem
计算资源策略
约束 PodSecurityPolicy 中的 “hostPath” 字段的参数。
pods
k8spsphostnamespace
计算资源策略
限制 PodSecurityPolicy 中的 “hostPID” 和 “hostIPC” 字段。
pods
k8spsphostnetworkingports
计算资源策略
约束 PodSecurityPolicy 中的 “hostNetwork” 和 “hostPorts” 字段。
pods
k8spspprivilegedcontainer
计算资源策略
禁止 PodSecurityPolicy 中的 “privileged” 字段为 true。
pods
k8spspprocmount
计算资源策略
约束 PodSecurityPolicy 中的 “allowedProcMountTypes” 字段。
pods
k8spspreadonlyrootfilesystem
计算资源策略
约束 PodSecurityPolicy 中的 “readOnlyRootFilesystem” 字段。
pods
k8spspseccomp
计算资源策略
约束 PodSecurityPolicy 上的 “seccomp.security.alpha.kubernetes.io/allowedProfileNames” 注解。
pods
k8spspselinuxv2
计算资源策略
约束 Pod 定义 SELinux 配置的允许列表。
pods
k8spspallowedusers
计算资源策略
约束 PodSecurityPolicy 中的runAsUser、runAsGroup、supplementalGroups 和 fsGroup 字段。
pods
k8spspvolumetypes
计算资源策略
约束 PodSecurityPolicy 中的 “volumes” 字段类型。
pods

操作说明

开启/关闭策略

1. 登录 容器服务控制台,选择左侧导航栏中的集群
2. 在集群管理页面,选择目标集群 ID,进入集群的基本信息页面。
3. 在左侧导航中选择策略管理,进入策略管理页面选择策略,单击开启/关闭。关闭策略需要二次确认,开启则不需要。如下图所示:




验证策略效果

以集群删除策略为例,创建 TKE 标准集群,验证集群在存在节点情况下删除请求是否会被拦截。
1. 创建有节点的 TKE 标准集群,详细步骤请参见 创建集群
2. 发起删除集群请求。
通过控制台删除
调用云 API 删除
1. 删除集群,详细步骤请参见 删除集群
2. 窗口提示需要先清空节点后,方可继续删除集群。如下图所示:



1. 调用云 API 删除,调用方式请参见 API 文档 删除集群
2. 删除集群接口调用失败,错误信息返回中包含集群中存在的节点清单。如下图所示:



3. 策略管理页面,单击关联事件的数字,查看拦截事件信息。如下图所示:




新建策略实例

以禁止创建特权容器为例,演示如何新建策略实例。
策略名称:k8spspprivilegedcontainer
策略类型:K8sPSPPrivilegedContainer
策略描述:禁止 Pod securityContext 中的 privileged 字段为 true。
生效资源类型:Pod
需要修改的参数如下:
namespaces 可选参数:表示策略作用生效的命名空间。
不填该字段或者字段取值为空时,表示所有命名空间都生效。
支持前缀匹配,例如 namespaces: ["kube-*"] 匹配 "kube-system" 和 "kube-public"。
excludedNamespaces 可选参数:表示策略豁免生效的命名空间,在该列表中的命名空间不会生效此条策略。
不填该字段或者字段取值为空时,表示没有豁免的命名空间。
支持前缀匹配,例如 excludedNamespaces: ["kube-*"] 匹配 "kube-system" 和 "kube-public"。
exemptInitContainers 自定义参数:布尔值。含义:是否允许 initContainer 使用特权容器。
部分业务的 initContainer 以特权容器的方式运行,执行类似 iptables 规则下发等操作。
创建策略实例时,默认会允许 initContainer 使用特权容器。
策略实例 YAML:
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPPrivilegedContainer
metadata:
name: psp-privileged-container
spec:
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
namespaces: []
excludedNamespaces: ["kube-system"]
parameters:
exemptInitContainers: true
测试策略是否生效的 Pod YAML 如下,直接 apply YAML,会被策略拦截,则表明策略已生效。
apiVersion: v1
kind: Pod
metadata:
name: privileged-pod
spec:
containers:
- name: privileged-container
image: nginx
securityContext:
privileged: true
initContainers:
- name: privileged-init-container
image: busybox
command: ['sh', '-c', 'echo Hello, Kubernetes!']
securityContext:
privileged: true