简介
原生 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. 发起删除集群请求。
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/v1beta1kind: K8sPSPPrivilegedContainermetadata:name: psp-privileged-containerspec:match:kinds:- apiGroups: [""]kinds: ["Pod"]namespaces: []excludedNamespaces: ["kube-system"]parameters:exemptInitContainers: true
测试策略是否生效的 Pod YAML 如下,直接 apply YAML,会被策略拦截,则表明策略已生效。
apiVersion: v1kind: Podmetadata:name: privileged-podspec:containers:- name: privileged-containerimage: nginxsecurityContext:privileged: trueinitContainers:- name: privileged-init-containerimage: busyboxcommand: ['sh', '-c', 'echo Hello, Kubernetes!']securityContext:privileged: true