【问题标题】:How prevent user from creating a pod with a specific label?如何防止用户创建带有特定标签的 pod?
【发布时间】:2021-07-10 00:50:43
【问题描述】:

我知道如何使用带有 X.509 证书的 RBAC 来识别 kubectl 的用户并限制他们(使用 RoleRoleBinding)在命名空间中创建任何类型的 pod。但是,我不知道如何阻止他们将特定标签放在他们尝试创建的 pod(或任何资源)上。

我想做的是这样的:

  1. 创建一个NetworkPolicy,只允许其他命名空间中带有group: cross-ns标签的资源访问special-namespace中的资源
  2. 有一个用户无法创建标签为group: cross-ns 的 Pod 或其他资源
  3. 让另一个用户可以创建标签为group: cross-ns 的资源

这可能吗?

【问题讨论】:

  • 考虑使用 OPA Gatekeeper,我认为这样可以。

标签: kubernetes yaml kubectl kubernetes-networkpolicy kubernetes-security


【解决方案1】:

您可以使用名为 Kyverno 的 Kubernetes 原生策略引擎:

Kyverno 在 Kubernetes 集群中作为动态准入控制器运行。 Kyverno 从 kube-apiserver 接收验证和修改准入 webhook HTTP 回调,并应用匹配策略返回执行准入策略或拒绝请求的结果。

Kyverno 策略是可应用于整个集群 (ClusterPolicy) 或特定命名空间 (Policy) 的规则集合。


我将创建一个示例来说明它是如何工作的。

首先我们需要安装 Kyverno,您可以选择直接从最新版本清单安装 Kyverno,或者使用 Helm(参见:Quick Start guide):

$ kubectl create -f https://raw.githubusercontent.com/kyverno/kyverno/main/definitions/release/install.yaml

安装成功后,我们创建一个简单的ClusterPolicy

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: labeling-policy
spec:
  validationFailureAction: enforce
  background: false
  rules:
  - name: deny-rule
    match:
      resources:
        kinds:
        - Pod
    exclude:
      clusterRoles:
      - cluster-admin
    preconditions:
      - key: "{{request.object.metadata.labels.purpose}}"
        operator: Equals
        value: "*"
    validate:
      message: "Using purpose label is not allowed for you"
      deny: {}

在上面的例子中,只有使用cluster-adminClusterRole你可以修改带有标签purpose的Pod。

假设我有两个用户(johndave),但只有john 通过ClusterRoleBinding 链接到cluster-admin ClusterRole

$ kubectl describe clusterrolebinding john-binding
Name:         john-binding
Labels:       <none>
Annotations:  <none>
Role:
  Kind:  ClusterRole
  Name:  cluster-admin
Subjects:
  Kind  Name  Namespace
  ----  ----  ---------
  User  john

最后,我们可以测试它是否按预期工作:

$ kubectl run test-john --image=nginx --labels purpose=test --as john
pod/test-john created

$ kubectl run test-dave --image=nginx --labels purpose=test --as dave
Error from server: admission webhook "validate.kyverno.svc" denied the request:

resource Pod/default/test-dave was blocked due to the following policies

labeling-policy:
  deny-rule: Using purpose label is not allowed for you

$ kubectl get pods --show-labels
NAME        READY   STATUS    RESTARTS   AGE   LABELS
test-john   1/1     Running   0          32s   purpose=test

更多示例和详细解释可以在Kyverno Writing Policies documentation找到。

【讨论】:

  • 如果我理解正确的话,它本质上是在使用准入控制?
  • Kyverno 的功能之一是使用准入控制阻止不合格的资源(请参阅:About Kyverno
猜你喜欢
  • 2013-04-15
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
相关资源
最近更新 更多