防止Kubernetes用户创建特权容器

3

我目前正在研究是否能够通过RBAC防止Kubernetes用户创建特权容器。 我知道从Kubernetes 1.1开始,默认启用特权容器以支持底层Docker需求。 这很好,我不想阻止每个人运行特权容器。

然而,我希望遵循最小特权原则。例如,我想通过RBAC防止用户能够使用类似kubectl node-shell的东西来获取对工作节点的root访问权限。

这可行吗?

3个回答

6
有几种方法可以实现这个目标,我想首先介绍官方的方法:Pod Security Policy
您想要实施的策略是:Privileged

决定了 Pod 中任何容器是否可以启用特权模式。默认情况下,容器不允许访问主机上的任何设备,但是“特权”容器被赋予访问主机上所有设备的权限。这使得容器几乎具有与在主机上运行的进程相同的访问权限。这对于希望使用 Linux 能力如操作网络堆栈和访问设备的容器非常有用。

Kubernetes 文档提供了一些关于如何与 PSP 交互的示例,尽管必须声明一个重要的警告:必须在 API 服务器上激活 PodSecurityPolicy 准入控制器。
除了官方的准入控制器外,还有其他项目可以执行拒绝匹配特定条件的容器以及运行为特权容器的任务:GatekeeperKyverno
还有其他的项目可以解决您的使用情况,但是我想分享这最后两个,因为它们似乎是最有前途的。

示例


非常好的回答。谢谢! - Adam Thomason

1

一旦在您的集群上启用了 PodSecurityPolicies标准 建议创建3个级别的策略:

  • privileged
  • baseline
  • restricted 然后您必须使用RBAC将这些策略映射到您的用户。这是一个针对所有这些内容的极简示例:https://github.com/k8s-school/kind-travis-ci/tree/master/psp。它至少允许在启用PodSecurityPolicies之后引导控制平面,确实需要 kube-proxy 和 CNI daemonset ,还有 coredns 部署服务帐户在 PodSecurityPolicies 上拥有一些权限才能够创建相关的 pod。

0

截至1.23版本,正确的做法是使用由Pod安全性准则执行的Pod安全性准入控制器。自1.23版本以来,默认情况下已包含该控制器。K8s在1.25中删除了Pod安全策略(PSP),而PSP在1.23中已被弃用。

K8s带有3个预定义的Pod安全标准:特权、基线和受限。强制执行基线和受限标准都可以防止特权pod。但是,受限可能对您的pod过于严格,因此建议从基线标准开始。

强制执行基线Pod安全标准

将Pod安全标准强制应用于命名空间存在阻止新Pod部署到该命名空间的风险。因此,我们首先进行干运行,而不是直接强制执行基线。

运行干运行并检查是否会抛出任何警告:

kubectl label --dry-run=server --overwrite ns default \
    pod-security.kubernetes.io/enforce=baseline

如果您看到没有任何警告标记的命名空间/默认值,则意味着如果强制执行基线,则命名空间默认中所有当前运行的 Pod 都将被允许。

假设您没有收到任何警告。让我们从在默认命名空间上强制执行基线标准开始:

kubectl label --overwrite ns default \
    pod-security.kubernetes.io/enforce=baseline

请注意,这次没有添加 --dry-run=server 参数。
让我们验证一下特权容器确实被阻止了。
创建一个名为 nginx-priv.yaml 的文件,并将以下内容写入其中:
apiVersion: v1
kind: Pod
metadata:
  name: nginx-priv
spec:
  containers:
  - name: nginx-priv
    image: nginx:1.14.2
    ports:
    - containerPort: 80
    securityContext:
      privileged: true

尝试创建特权 pod:
kubectl apply -f nginx-priv.yaml

你应该看到以下输出:
Error from server (Forbidden): error when creating "nginx-priv.yaml": pods "nginx-priv" is forbidden: violates PodSecurity "baseline:latest": privileged (container "nginx-priv" must not set securityContext.privileged=true)

请注意,您也可以像这样在所有命名空间中强制实施基线(在部署新的 Pod 时可能会导致问题):

kubectl label --overwrite ns --all \
  pod-security.kubernetes.io/enforce=baseline

免责声明:本文作者为以下原始内容的作者
原始内容:https://samos-it.com/posts/Preventing-Privileged-pods-using-Pod-Security-Admission-Standards.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接