K8s进阶6——pod安全上下文,腾讯T2亲自教你

本文介绍了Kubernetes中的Pod安全上下文,包括PodSecurityPolicy的使用及其在1.21版本后被弃用的情况。文章提到了替代方案OPA Gatekeeper,详细解释了其工作原理、安装过程以及编写策略的方法。此外,还探讨了gVisor作为容器安全隔离技术的集成和验证,以及与Docker和Containerd的配合使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念:

  • PodSecurityPolicy,简称PSP,是K8s中Pod部署时重要的安全校验手段,能够有效地约束应用运行时行为安全。
  • 使用PSP对象定义一组Pod在运行时必须遵循的条件及相关字段的默认值,只有Pod满足这些条件才会被K8s接受。
  • Pod安全策略实现为一个准入控制器,默认没有启用,当启用后会强制实施Pod安全策略,没有满足的Pod将无法创建。因此,建议在启用PSP之前先添加策略并对其授权。

启用Pod安全策略:

  1. kube-apiserver.yaml配置文件添加准入控制器。
  2. 重启kubelet,systemctl restart kubelet
    在这里插入图片描述

玩法思路:

  1. 创建SA服务账号。
  2. 将SA绑定到系统内置Role edit。
  3. 创建使用PSP权限的Role qingjun。
  4. 将SA绑定到角色qingjun上。
  5. 定义PodSecurityPolicy策略。

注意事项:

  1. 使用复杂,权限模型存在缺陷,控制不明确,一旦出现问题不好定位,所以将再1.21版本弃用PSP,在1.25版本删除PSP。 弃用官方文献
  2. 替代方案KEP 2579
  3. 替代外部控制器方案:K-Rail、 Kyverno、 OPA/Gatekeeper 。
2.1.1 安全策略限制维度
配置项 描述
privileged 启动特权容器。
hostPID,hostIPC 使用主机namespaces。
hostNetwork,hostPorts 使用主机网络和端口。
volumes 允许使用的挂载卷类型。
allowedHostPaths 允许hostPath类型挂载卷在主机上挂载的路径,通过pathPrefix字段声明允许挂载的主机路径前缀组。
allowedFlexVolumes 允许使用的指定FlexVolume驱动。
fsGroup 配置Pod中挂载卷使用的辅组ID。
readOnlyRootFilesystem 约束启动Pod使用只读的root文件系统。
runAsUser,runAsGroup,supplementalGroups 指定Pod中容器启动的用户ID以及主组和辅组ID。
allowPrivilegeEscalation,defaultAllowPrivilegeEscalation 约束Pod中是否允许配置allowPrivilegeEscalation=true,该配置会控制setuid的使用,同时控制程序是否可以使用额外的特权系统调用。
defaultAddCapabilities,requiredDropCapabilities,allowedCapabilities 控制Pod中使用的Linux Capabilities。
seLinux 控制Pod使用seLinux配置。
allowedProcMountTypes 控制Pod允许使用的ProcMountTypes。
annotations 配置Pod中容器使用的AppArmor或seccomp。
forbiddenSysctls,allowedUnsafeSysctls 控制Pod中容器使用的sysctl配置。

2.2 OPA Gatekeeper方案

前提了解:

  • OPA(Open Policy Agent):是一个开源的、通用策略引擎,可以将策略编写为代码。提供一个种高级声明性语言-Rego来编写策略,并把决策这一步骤从复杂的业务逻辑中解耦出来。
  • 是PSP的替代方案,属于外部准入控制器。
  • OPA官网
  • Gatekeeper项目地址
  • Gatekeeper文档

OPA可以用来做什么?

  1. 拒绝不符合条件的YAML部署。
  2. 允许使用哪些仓库中的镜像。
  3. 允许在哪个时间段访问系统。
  4. 等等。

OPA Gatekeeper的概念:

  • Gatekeeper 是基于 OPA的一个 Kubernetes 策略解决方案,可替代PSP或者部分RBAC功能。因为OPA与K8s对接偏向于底层,不好使用,所以社区就基于OPA引擎开发了OPA Gatekeeper的解决方案,方便使用。
  • 当在集群中部署了Gatekeeper组件,APIServer所有的创建、更新或者删除操作都会触发Gatekeeper来处理,如果不满足策略则拒绝。

工作流程图:
在这里插入图片描述

2.2.1 安装Gatekeeper

1.下载准备安装yaml文件,下载地址
在这里插入图片描述
2.导入文件一键部署,并查看。

[root@k8s-master1 opa]# kubectl apply -f gatekeeper.yaml

在这里插入图片描述

2.2.2 编写策略

Gatekeeper的策略由两个资源对象组成:

  1. Template模板:在后面我们需要自定义限制策略,策略是怎么实现的就需要我们先写一个实现逻辑,这里就把这个实现逻辑称之为模板,使用rego语言。
  2. Contsraint约束:自定义限制策略,当我们创建任何一个资源时可以先通过这个约束来进行过滤处理,违反约束就代表能限制你创建自动动作,不让你创建这个资源。所以约束就是负责K8s资源对象的过滤或者为Template模板提供输入参数。

实现思路:

  1. 先使用rego语言编写Template模板,在这个模板里自定义实现逻辑,就相当于写一个脚本逻辑。
  2. 自定义Constraint约束,约束格式类似rbac授权那种,要限制什么资源,这个资源在什么组。
  3. 当我们创建一个资源时,比如创建deployment时,若是触发了约束,则就会带入到模板里,看是否能违反约束,若是违反约束就相当于出发了开关,不让你创建deployment。

模板核心字段释义:

  • 字段containers = input.review.object.spec.template.spec.containers
    • input.review.object :抓取约束模板里自定义的限制资源。比如我在约束模板里限制deployment资源,这里就是是抓取的deployment资源。
    • .spec.template.spec.containers:代表获取资源对象的yaml文件里.spec.template.spec.containers内容,可以用kubectl explan获取。比如我在约束模板里限制的是deployment资源,那么当我创建deployment资源时就会抓取deployment.yaml文件里的spec.template.spec.containers下的内容,如下图,就是获取下图中的红框内容。此时拿到这块内容,再根据模板里的逻辑进行判断,看最后是否输出的true,若是则代表违反约束,你就不能创建deployment资源。
      在这里插入图片描述
2.2.3 案例1

需求

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值