首页 > 解决方案 > 使用 terraform 在 k8s 集群中授予 RBAC 角色

问题描述

我想将RBAC规则分配给一个用户,该用户提供对使用 Terraform资源中除动词'create''delete'动词之外的所有资源的访问权限。'namespace'

目前我们有如下规则:

rule {
    api_groups = ["*"]
    resources  = ["*"]
    verbs      = ["*"]
  }

标签: kubernetesterraformrbac

解决方案


正如我们在Role 和 ClusterRole 文档中发现的那样,权限(规则)纯粹是附加的——没有“拒绝”规则:

角色和集群角色 RBAC 角色或集群角色包含代表一组权限的规则。权限纯粹是附加的(没有“拒绝”规则)。

可以在这里找到可能的动词列表: 在此处输入图像描述


您需要提供应该应用于规则中包含的资源的所有动词。
代替:

verbs      = ["*"]

提供所需的动词,例如:

verbs      = ["get", "list", "patch", "update", "watch"]


例如,我创建了一个example-role Role和一个example_role_binding RoleBinding. 授予用户中定义的
权限。注意:有关使用以下资源的详细信息,请参阅kubernetes_rolekubernetes_role_binding资源文档。example_role_binding RoleBindingexample-role Rolejohn

resource "kubernetes_role" "example_role" {
  metadata {
    name      = "example-role"
    namespace = "default"
  }

  rule {
    api_groups = ["*"]
    resources  = ["*"]
    verbs      = ["get", "list", "patch", "update", "watch"]
  }
}

resource "kubernetes_role_binding" "example_role_binding" {
  metadata {
    name      = "example_role_binding"
    namespace = "default"
  }
  role_ref {
    api_group = "rbac.authorization.k8s.io"
    kind      = "Role"
    name      = "example-role"
  }

  subject {
    kind      = "User"
    name      = "john"
    api_group = "rbac.authorization.k8s.io"
  }
}

此外,我创建了test_user.shBash 脚本来快速检查它是否按预期工作:
注意:您可能需要修改变量namespaceresourcesuser以满足您的需要。

$ cat test_user.sh
#!/bin/bash

namespace=default
resources="pods deployments"
user=john

echo "=== NAMESPACE: ${namespace} ==="
for verb in create delete get list patch update watch; do
    echo "-- ${verb} --"
    for resource in ${resources}; do
        echo -n "${resource}: "
        kubectl auth can-i ${verb} ${resource} -n ${namespace} --as=${user}
    done
done

$ ./test_user.sh
=== NAMESPACE: default ===
-- create --
pods: no
deployments: no
-- delete --
pods: no
deployments: no
-- get --
pods: yes
deployments: yes
-- list --
pods: yes
deployments: yes
...

推荐阅读