如何修改K8S默认服务账号权限?

How to change K8S default service account permissions?

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

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

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

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

你只需要浏览一下你的RoleBindings/ClusterRoleBindings。可能某处有默认 SA。

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

function getRoles() {
    local kind=""
    local name=""
    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

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

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

感谢@ArthurBusser指出!