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



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

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

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

明确一点:我们的集群中有多个名称空间,每个名称空间都有自己的default服务帐户。但是,它们都没有任何关联的角色绑定,并且都具有完全的集群权限。

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

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

感谢@ArthurBusser指出这一点!

您只需要查看您的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

最新更新