本文为译文,原文网址为 https://www.cncf.io/blog/2022/09/06/the-2-minute-test-for-kubernetes-pod-security/
了解如何审核你的集群是否符合最新的Kubernetes Pod安全标准,而无需在集群中安装任何东西
在这篇文章中,将向你展示如何审计你的集群是否符合最新的Kubernetes Pod安全标准,而无需在集群中安装任何东西。
Pod是Kubernetes的基本执行单位,Pod的安全性对所有集群都是必要的。如果没有启用pod安全检查,任何有权限运行pod的用户都可以提升权限。攻击者可以利用pod安全性的缺乏来执行容器逃逸。所有集群,包括Dev/Test和staging集群,这些都是攻击者的常见入口,都应该实施pod安全。
Kubernetes项目发布了Pod安全标准,其中包含的安全控制分为三个配置文件级别,应该被强制执行。
Kubernetes v1.25为pod安全标准提供了in-tree addmiision controller,它提供命名空间级别的验证和执行,需要在API服务器上进行配置。 在大多数情况下,需要更细化的控制。Examining Pod Security Admission提供了一个很好的分析。
为了检查是否符合Kubernetes Pod安全标准,我们将从集群外部运行Kyverno CLI,并执行pod安全标准中定义的每个控制策略。为了执行审计,你将需要通过kubectl
访问集群,但不需要在集群中安装任何东西。
Step 1: 安装 Krew、Kustomize
Krew是Kubectl(Kubernetes CLI)的一个软件包管理器。
Kustomize是kubectl的一个子命令,可以简化配置管理。由于与kubectl一起分发的版本往往是旧的,请查看这个链接来安装最新版本。
Step 2: 安装kubectl Kynerno插件
安装命令如下:
kubectl krew install kyverno
命令输出如下所示:
Updated the local copy of plugin index.
Installing plugin: kyverno
Installed plugin: kyverno
\
| Use this plugin:
| kubectl kyverno
| Documentation:
| https://github.com/kyverno/kyverno
| Caveats:
| \
| | The plugin requires access to create Policy and CustomResources
| /
/
WARNING: You installed plugin "kyverno" from the krew-index plugin repository.
These plugins are not audited for security by the Krew maintainers.
Run them at your own risk.
Step 3: 扫描k8s集群
执行如下命令:
kustomize build https://github.com/kyverno/policies/pod-security | kubectl kyverno apply --cluster -
上述命令针对整个集群运行。你可以选择使用--namespace
选项来扫描单个namespace
以下是利用kyverno扫描处于default
namespace的 busybox
pod示例:
首先启动创建busybox pod:
❯ kubectl run busybox --image busybox
pod/busybox created
然后利用kyverno进行扫描:
❯ kustomize build https://github.com/kyverno/policies/pod-security | kubectl kyverno apply --cluster --namespace default -
输出结果如下:
Applying 17 policies to 1 resource...
policy disallow-capabilities-strict -> resource default/Pod/busybox failed:
1. require-drop-all: validation failure: Containers must drop `ALL` capabilities.
policy disallow-privilege-escalation -> resource default/Pod/busybox failed:
1. privilege-escalation: validation error: Privilege escalation is disallowed. The fields spec.containers[*].securityContext.allowPrivilegeEscalation, spec.initContainers[*].securityContext.allowPrivilegeEscalation, and spec.ephemeralContainers[*].securityContext.allowPrivilegeEscalation must be set to `false`. Rule privilege-escalation failed at path /spec/containers/0/securityContext/
policy require-run-as-nonroot -> resource default/Pod/busybox failed:
1. run-as-non-root: validation error: Running as root is not allowed. Either the field spec.securityContext.runAsNonRoot must be set to `true`, or the fields spec.containers[*].securityContext.runAsNonRoot, spec.initContainers[*].securityContext.runAsNonRoot, and spec.ephemeralContainers[*].securityContext.runAsNonRoot must be set to `true`. Rule run-as-non-root[0] failed at path /spec/securityContext/runAsNonRoot/. Rule run-as-non-root[1] failed at path /spec/containers/0/securityContext/.
policy restrict-seccomp-strict -> resource default/Pod/busybox failed:
1. check-seccomp-strict: validation error: Use of custom Seccomp profiles is disallowed. The fields spec.securityContext.seccompProfile.type, spec.containers[*].securityContext.seccompProfile.type, spec.initContainers[*].securityContext.seccompProfile.type, and spec.ephemeralContainers[*].securityContext.seccompProfile.type must be set to `RuntimeDefault` or `Localhost`. Rule check-seccomp-strict[0] failed at path /spec/securityContext/seccompProfile/. Rule check-seccomp-strict[1] failed at path /spec/containers/0/securityContext/.
pass: 15, fail: 4, warn: 0, error: 0, skip: 38
上面的输出显示,busybox pod违反了pod安全标准中的四个控制措施,并给出了具体原因
结论
Kyverno是一个用于Kubernetes安全和自动化的强大而简单的工具。它通常作为admission controller在Kubernetes控制平面上运行。
Kyverno CLI可以针对一组包含Kubernetes资源YAML声明的文件执行Kyverno策略,也可以针对一个集群执行策略。在这里,我们使用Kyverno CLI来执行策略,以实现针对集群的Pod安全标准。
作为下一步,你可以在你的集群中安装Kyverno或尝试Nirmata Kubernetes策略管理器的免费试用。