新的 Kubernetes 服务帐户似乎具有集群管理员权限

2024-04-08

我在新创建的 Kubernetes 服务帐户中遇到了奇怪的行为。看来他们的令牌在我们的集群中提供了无限的访问权限。

如果我创建一个新的命名空间,在该命名空间内创建一个新的服务帐户,然后在新的 kube 配置中使用该服务帐户的令牌,我就能够在集群中执行所有操作。

# SERVER is the only variable you'll need to change to replicate on your own cluster
SERVER=https://k8s-api.example.com
NAMESPACE=test-namespace
SERVICE_ACCOUNT=test-sa

# Create a new namespace and service account
kubectl create namespace "${NAMESPACE}"
kubectl create serviceaccount -n "${NAMESPACE}" "${SERVICE_ACCOUNT}"

SECRET_NAME=$(kubectl get serviceaccount "${SERVICE_ACCOUNT}" --namespace=test-namespace -o jsonpath='{.secrets[*].name}')
CA=$(kubectl get secret -n "${NAMESPACE}" "${SECRET_NAME}" -o jsonpath='{.data.ca\.crt}')
TOKEN=$(kubectl get secret -n "${NAMESPACE}" "${SECRET_NAME}" -o jsonpath='{.data.token}' | base64 --decode)

# Create the config file using the certificate authority and token from the newly created
# service account
echo "
apiVersion: v1
kind: Config
clusters:
- name: test-cluster
  cluster:
    certificate-authority-data: ${CA}
    server: ${SERVER}
contexts:
- name: test-context
  context:
    cluster: test-cluster
    namespace: ${NAMESPACE}
    user: ${SERVICE_ACCOUNT}
current-context: test-context
users:
- name: ${SERVICE_ACCOUNT}
  user:
    token: ${TOKEN}
" > config

将 ^ 作为 shell 脚本运行会产生config在当前目录中。问题是,使用该文件,我可以读取和编辑集群中的所有资源。我希望新创建的服务帐户没有任何权限,除非我通过 RBAC 明确授予它们。

# All pods are shown, including kube-system pods
KUBECONFIG=./config kubectl get pods --all-namespaces

# And I can edit any of them
KUBECONFIG=./config kubectl edit pods -n kube-system some-pod

我没有向新创建的服务帐户添加任何角色绑定,因此我希望它能够收到所有访问被拒绝的响应kubectl使用新生成的配置进行查询。

下面是嵌入在 test-sa 服务帐户的 JWT 的示例config:

{
  "iss": "kubernetes/serviceaccount",
  "kubernetes.io/serviceaccount/namespace": "test-namespace",
  "kubernetes.io/serviceaccount/secret.name": "test-sa-token-fpfb4",
  "kubernetes.io/serviceaccount/service-account.name": "test-sa",
  "kubernetes.io/serviceaccount/service-account.uid": "7d2ecd36-b709-4299-9ec9-b3a0d754c770",
  "sub": "system:serviceaccount:test-namespace:test-sa"

}

需要考虑的事项...

  • 据我所知,集群中似乎启用了 RBACrbac.authorization.k8s.io/v1 and rbac.authorization.k8s.io/v1beta1在输出中kubectl api-versions | grep rbac如建议的这个帖子 https://stackoverflow.com/questions/51238988/how-to-check-whether-rbac-is-enabled-using-kubectl#51239531。值得注意的是kubectl cluster-info dump | grep authorization-mode正如同一问题的另一个答案中所建议的,不显示输出。这是否表明 RBAC 实际上并未启用?
  • 我的用户有cluster-admin角色权限,但我不希望这些权限继承到用它创建的服务帐户。
  • 我们在 GKE 上运行集群。
  • 据我所知,集群中没有任何非正统的 RBAC 角色或绑定会导致这种情况。我可能会遗漏某些内容,或者通常不知道会导致此问题的 K8s RBAC 配置。

我的假设是否正确,即新创建的服务帐户应该具有极其有限的集群访问权限,并且如果没有将许可的角色绑定附加到新服务帐户,则上述场景应该不可能实现?对这里发生的事情有什么想法,或者我可以限制 test-sa 的访问的方法吗?


您可以通过运行命令检查服务帐户的权限

kubectl auth can-i --list --as=system:serviceaccount:test-namespace:test-sa

如果您看到以下输出,则默认情况下服务帐户获得的权限非常有限。

Resources                                       Non-Resource URLs   Resource Names   Verbs
selfsubjectaccessreviews.authorization.k8s.io   []                  []               [create]
selfsubjectrulesreviews.authorization.k8s.io    []                  []               [create]
                                                [/api/*]            []               [get]
                                                [/api]              []               [get]
                                                [/apis/*]           []               [get]
                                                [/apis]             []               [get]
                                                [/healthz]          []               [get]
                                                [/healthz]          []               [get]
                                                [/livez]            []               [get]
                                                [/livez]            []               [get]
                                                [/openapi/*]        []               [get]
                                                [/openapi]          []               [get]
                                                [/readyz]           []               [get]
                                                [/readyz]           []               [get]
                                                [/version/]         []               [get]
                                                [/version/]         []               [get]
                                                [/version]          []               [get]
                                                [/version]          []               [get]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

新的 Kubernetes 服务帐户似乎具有集群管理员权限 的相关文章

  • GKE 集群无法从同一项目(GitLab Kubernetes 集成)中的 GCR 注册表中提取 (ErrImagePull):为什么?

    因此 在谷歌搜索了一下之后 被那些在 Pull Secrets 方面遇到麻烦的人污染了 我将其发布在这里 以及 GCP 支持 据我所知将更新 我通过 GitLab Kubernetes 集成创建了一个集群 文档 https about gi
  • Kubernetes 应用服务但端点没有

    当我尝试将服务应用于 pod 时 端点始终为 none 有人可以知道任何根本原因吗 我还检查选择器是否与deployment yaml 中定义的内容匹配 下面是我使用的部署 服务文件 我还附上了服务描述 部署 yaml apiVersion
  • Prometheus - 监控容器中的命令输出

    我需要监控 eks 集群中具有 nfs 挂载路径的许多旧容器 使用 nfs client helm 图表映射容器 i 中的 nfs 目录 我需要监视我的安装路径何时由于某种原因丢失 而我发现做到这一点的唯一方法是在容器中执行命令 bin b
  • 如何使用 kubectl 列出 kubernetes 中应用的自定义资源定义

    我最近应用了这个 CRD 文件 https raw githubusercontent com jetstack cert manager release 0 11 deploy manifests 00 crds yaml With ku
  • Pod 副本如何相互同步 - Kubernetes?

    我有一个带有 3 个副本的 MySQL 数据库 Pod 现在我正在一个 Pod 中进行一些更改 Pod 数据 而不是 Pod 配置 假设我要添加一张表 该更改将如何影响 Pod 的其他副本 我正在使用带有 3 个工作节点的 kubernet
  • Kubernetes:用 Calico 替代 Flannel

    我是 Kubernetes 新手 我想尝试不同的 CNI 在我当前的集群中 我正在使用 Flannel 现在 我想使用 Calico 但我找不到清理 Flannel 和安装 Calico 的正确指南 您能指出正确的程序吗 Thanks Ca
  • 如何找出 Kubernetes 中可用的端口?

    我想在 kubernetes 集群中的不同端口上运行多个服务 并且想知道如何检查哪些端口可用并且不会与我的服务产生任何冲突 我还想知道每个端口上的服务名称 以便我可以更好地理解我的配置 有类似的问题涉及验证哪个NodePorts已经在使用中
  • 使用 zeppelin 在 kubernetes 上 Spark

    我按照本指南在使用 minikube 设置的本地 kubernetes 集群中运行 zeppelin 容器 https zeppelin apache org docs 0 9 0 SNAPSHOT quickstart kubernete
  • 在 Kubernetes API 中启用 CORS

    有没有办法在 Kubernetes API 上启用 CORS 以便我可以使用不同的域向 Kubernetes API 发送 ajax 请求 通过将 cors allowed origins http 参数添加到 etc default ku
  • gofabric8> 无法解压缩 /Users/apple/.fabric8/bin/oc.zip zip:不是有效的 zip

    我正在尝试为微服务设置环境 我正在使用 Fabric8 来做到这一点 我在用着mvn fabric8 cluster start Dfabric8 cluster kind openshift命令 执行时出现以下错误 INFO gofabr
  • Kubernetes nginx 入口控制器返回 502,但仅适用于 AJAX/XmlHttpRequest 请求

    我有一个在 nginx 入口控制器后面运行 Kubernetes 的 Web 应用程序 它对于请求浏览工作正常 但来自浏览器的任何 AJAX XMLHTTPRequest 都会从 nginx 收到 502 错误 我捕获了常规请求和 AJAX
  • 新的 GKE 集群记录了数千个错误

    在 Google Kubernetes Engine 中创建全新的 Kubernetes 集群后 我在 Google Cloud 日志记录中看到许多与指标代理相关的错误 我在版本上的现有集群上遇到了这个问题1 18 x 然后我升级到1 19
  • Ubuntu 16.04 中 kubeadm join 命令每次都会超时

    我正在使用 Ubuntu 16 04 Xenial 但我遇到了一个问题kubeadm加入时nodes to my master 在加入一个node to my master 我不断遇到超时问题 discovery Failed to req
  • Kubernetes Pod 中现在几点了?

    假设我有一些 NET Core 代码在 k8s pod 中运行 我要求 DateTime Now 我假设我将从运行 pod 的主机获取日期时间 有没有办法获得在 k8s 集群中一致的日期时间值 容器中的时钟与主机相同 因为它由内核控制 时区
  • 从 App Engine 连接到 Kubernetes 引擎

    我们希望使用应用程序引擎灵活的流程来更新位于 Google Kubernetes Engine 上的 ElasticSearch 索引 我们需要通过 http s 地址连接到 ElasticSearch 推荐的方法是什么 我们不想将集群暴露
  • Istio 允许所有出口流量

    如何允许 Istio 的所有出站流量 我尝试了以下方法 禁用出口网关并 使用 set global proxy includeIPRanges 0 0 0 0 0 0 0 0 0 0 绕过 sidecar 所有选项都不起作用 值得一提的是我
  • 在容器中运行多个相似的进程有意义吗?

    提供有关该问题的背景的简要背景 目前 我和我的团队正在将微服务迁移到 k8s 以减少维护多个部署工具和管道的工作量 我们计划迁移的微服务之一是 ETL Worker 它监听 SQS 上的消息并执行多阶段处理 它是使用 PHP Laravel
  • 各种 Istio 端口是如何使用的?

    Question 我正在尝试学习 Istio 并且正在设置我的 Istio Ingress Gateway 当我设置它时 有以下端口选项 如此处所示 https istio io latest docs reference config i
  • Podman:如何解析使用 Kubernetes YAML 部署的 pod 的主机名

    我正在使用 podman 4 5 dev 我使用以下方式部署了两个 Pod podman kube 播放 foo yaml podman kube play bar yaml 我在文件中指定了 pod 的主机名 但它们不会在容器内得到解析
  • Spark 执行器 STDOUT 到 Kubernetes STDOUT

    我在 Spark Worker 中运行的 Spark 应用程序将执行程序日志输出到特定文件路径 worker home directory app xxxxxxxx 0 stdout I used log4j properties将日志从

随机推荐