如何更改 K8S 默认服务帐户权限?

时间:2021-06-29 13:07:40

标签: kubernetes rbac

我的团队最近发现,由 K8S 管理并默认关联到 Pod 的 default 服务帐户在集群中拥有完整的读写权限。我们可以列出正在运行的 Pod 的秘密,创建新的 Pod......

我们发现这很奇怪,因为我们认为 default 服务帐户没有任何权限,甚至只有读取权限。因此,我们决定在集群中搜索与该服务帐户关联的角色绑定或集群角色绑定,但一无所获。

在 K8S 集群中,default 服务帐户没有与之关联的基本角色绑定吗?为什么我们没有?如果我们没有,为什么服务帐户对集群拥有完全权限,而不是根本没有?最后,我们如何修改它使其在集群中没有权限?

澄清一下:我们的集群中有多个命名空间,每个命名空间都有自己的 default 服务帐户。但是,它们都没有任何与之关联的角色绑定,并且都拥有完整的集群权限。

2 个答案:

答案 0 :(得分:1)

显然,默认情况下,kops 设置集群的 K8S API 服务器授权模式设置为 AlwaysAllow,这意味着任何请求,只要成功通过身份验证,都具有全局管理员权限。

为了解决这个问题,我们不得不将授权模式更改为 RBAC 并手动调整权限。

感谢 @ArthurBusser 指出!

答案 1 :(得分:0)

您只需查看您的 RoleBindings/ClusterRoleBindings。可能某处有一个默认的 SA。

不幸的是,没有内置的解决方案来搜索用户的 ClusterRoles,但您可以使用以下脚本

function getRoles() {
    local kind="${1}"
    local name="${2}"
    local namespace="${3:-}"

    kubectl get clusterrolebinding -o json | jq -r "
      .items[]
      |
      select(
        .subjects[]?
        |
        select(
            .kind == \"${kind}\"
            and
            .name == \"${name}\"
            and
            (if .namespace then .namespace else \"\" end) == \"${namespace}\"
        )
      )
      |
      (.roleRef.kind + \"/\" + .roleRef.name)
    "
}
$ getRoles Group system:authenticated
ClusterRole/system:basic-user
ClusterRole/system:discovery

$ getRoles ServiceAccount attachdetach-controller kube-system
ClusterRole/system:controller:attachdetach-controller
相关问题