【k8s】--as=system:serviceaccount:demo-rbac:demo-user模拟某组件的某sa

--as=system:serviceaccount:demo-rbac:demo-user模拟某组件的某sa

在 Kubernetes 中,kubectl 命令提供了一个 --as 参数,用于临时模拟以指定的用户身份执行命令。这个功能可以帮助你测试和验证某个用户或服务账户的权限。

1. --as 参数

  • 功能:--as 参数允许你指定一个 Kubernetes 用户或服务账户的身份,使用该身份来执行 kubectl 命令。
  • 场景:这对于权限管理和调试非常有用,尤其是当你想要检查某个用户或服务账户是否拥有足够的权限来执行某个操作时。

解释:

kubectl get role -n demo-rbac --as=system:serviceaccount:demo-rbac:demo-user

  • kubectl get role -n demo-rbac:

    • 这个命令用于列出 demo-rbac 命名空间中的所有 Role 资源。Role 是在命名空间级别管理权限的资源。
    • -n demo-rbac 指定了要在 demo-rbac 命名空间中执行这个命令。
  • --as=system:serviceaccount:demo-rbac:demo-user:

    • 这个部分是关键,它告诉 kubectl 命令临时以 demo-user这个服务账户的身份执行命令,而不是以当前用户的身份执行。
    • system:serviceaccount: 是 Kubernetes 内部使用的一种标识符,表示这是一个服务账户。
    • demo-rbac 是服务账户所属的命名空间。
    • demo-user 是服务账户的名称。

什么是当前用户的身份? 我们知道一个命名空间A内可以有若干个sa,但是A内的pod只能指定一个sa,当我们kubectl exec 命令进入pod后,执行

curl -k -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" https://kubernetes.default.svc/api/v1/namespaces/demo-rbac/pods

虽然没有指定sa,但是错误信息 "message": "forbidden: User "system:serviceaccount:demo-rbac:demo-user" 中却提示我们 使用了 sa=demo-user,也就是说整个pod内的任意进程访问kube api,自动携带的身份就是pod的sa属性

含有错误信息的示例,前提是这个sa确实没有权限,或者替换成其他的没有权限的url资源:

 curl -k -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" https://kubernetes.default.svc
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {

},
"status": "Failure",
"message": "forbidden: User \"system:serviceaccount:demo-rbac:demo-user\" cannot get path \"/\": user does not have read access to the namespace",
"reason": "Forbidden",
"details": {

},
"code": 403
}

2. 使用 --as 的典型场景

一般来说 --as 使用用于在主机上执行kube命令,进行验证某个权限功能,此时不必进入到pod中,否则,就需要像前面章节中提到的kubectl exec 进入到pod后,再执行命名

  • 权限验证:你可以用 --as 参数模拟某个用户或服务账户,来验证他们是否有执行某些操作的权限。
  • 调试:如果某个用户报告无法访问某些资源,你可以使用 --as 参数来模拟该用户并重现问题。

示例场景

假设你有一个服务账户 demo-user,你想验证这个服务账户是否有权限在 demo-rbac 命名空间中列出所有 Role 资源。使用以下命令:

kubectl get role -n demo-rbac --as=system:serviceaccount:demo-rbac:demo-user

如果这个服务账户有权限,你会看到 demo-rbac 命名空间中的 Role 列表。

如果没有权限,命令会失败,并提示相关的权限错误信息。

相关推荐
让生命变得有价值2 小时前
k8s 启用 ValidatingAdmissionPolicy 特性
java·容器·kubernetes·kubelet
Allocator3 小时前
docker 容器访问宿主机器服务的最简单方法
运维·docker·容器
AlenTech3 小时前
如何设置docker的定时关闭和启动
docker·容器·eureka
我从不骗人4 小时前
Docker使用相关记录
运维·docker·容器
valkyrja1106 小时前
小白docker入门简介
docker·容器·小白·初学
君败红颜13 小时前
Docker 常用命令详解(详细版)
运维·docker·容器
想学习java初学者14 小时前
Docker Compose部署Rabbitmq(Dockerfile安装延迟队列)
docker·容器·rabbitmq
梦游钓鱼17 小时前
windows安装docker
运维·docker·容器
roman_日积跬步-终至千里17 小时前
【Docker】自定义网络:实现容器之间通过域名相互通讯
网络·docker·容器
AlenTech17 小时前
如何设置定时关闭或启动整个docker而不是某个容器
运维·docker·容器