【问题标题】:Kubernetes service account default permissionsKubernetes 服务帐号默认权限
【发布时间】:2020-11-03 15:49:25
【问题描述】:

我正在试验服务帐户。我相信以下应该会产生访问错误(但不会):

apiVersion: v1
kind: ServiceAccount
metadata:
  name: test-sa

---

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  serviceAccountName: test-sa
  containers:
  - image: alpine
    name: test-container
    command: [sh]
    args:
    - -ec
    - |
      apk add curl;
      KUBE_NAMESPACE="$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)";
      curl \
        --cacert "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt" \
        -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" \
        "https://kubernetes.default.svc/api/v1/namespaces/$KUBE_NAMESPACE/services";
      while true; do sleep 1; done;
kubectl apply -f test.yml
kubectl logs test-pod

我看到的是成功的服务列表,但我预计会出现权限错误,因为我从未为 test-sa 创建任何 RoleBindings 或 ClusterRoleBindings。

我正在努力寻找列出特定 SA 可用权限的方法,但根据 Kubernetes check serviceaccount permissions,应该可以:

kubectl auth can-i list services --as=system:serviceaccount:default:test-sa
> yes

虽然我怀疑该命令是否真的有效,因为我可以用任何乱码替换test-sa,它仍然说“是”。


根据文档,服务帐户默认具有"discovery permissions given to all authenticated users"。它并没有说明这实际上意味着什么,但从更多阅读中我发现这个资源可能就是它所指的:

kubectl get clusterroles system:discovery -o yaml
> [...]
> rules:
> - nonResourceURLs:
>   - /api
>   - /api/*
> [...]
>   verbs:
>   - get

这意味着所有服务帐户在所有 API 端点上都具有 get 权限,尽管“nonResourceURLs”位意味着这不适用于服务等资源的 API,即使这些 API 位于该路径下……(? ??)


如果我完全删除 Authorization 标头,我会看到预期的访问错误。但我不明白为什么它能够使用这个空的服务帐户获取数据。我的误解是什么?如何正确限制权限?

【问题讨论】:

  • 你能分享kubectl get role,rolebinding -n defaultkubectl get clusterrole,clusterrolebinding的输出吗
  • @ArghyaSadhu 第一个命令返回“在默认命名空间中找不到资源”。第二个返回一个大列表,包括 clusterrole.rbac.authorization.k8s.io/adminclusterrole.rbac.authorization.k8s.io/system:controller:service-controllerclusterrolebinding.rbac.authorization.k8s.io/system:controller:service-controller 等等。有什么特别想知道的输出吗?
  • 您是否有机会创建了一个 clusterrolebinding 来将此服务帐户绑定到 cluster-admin clusterrole?
  • 如果有帮助:这是使用 Docker 内置的“启用 Kubernetes”选项对 Kubernetes 进行本地测试部署。我相信没有自定义配置。值得一提的是,运行kubectl cluster-info dump | grep authorization-mode 表明访问控制模式为Node,RBAC
  • @ArghyaSadhu 一位同事帮我找到了clusterrolebinding docker-for-desktop-binding,它将cluster-admin 添加到system:serviceaccounts(?!)。所以看起来它确实是一个 docker 桌面的东西。

标签: kubernetes permissions docker-desktop kubernetes-security


【解决方案1】:

这是因为默认情况下,在 Docker Desktop 中,clusterrolebinding docker-for-desktop-bindingcluster-admin 角色赋予所有创建的服务帐户。

更多详情请查看问题here

【讨论】:

    【解决方案2】:

    事实证明这是 Docker Desktop for Mac 的 Kubernetes 支持中的一个错误。

    它会自动添加一个ClusterRoleBindingcluster-admin所有服务帐户 (!)。它只是打算将此提供给kube-system 命名空间内的服务帐户。

    它最初是在docker/for-mac#3694 中提出的,但修复不正确。我提出了一个新问题docker/for-mac#4774(原问题因年龄问题被锁定)。

    等待解决错误时的快速修复是运行:

    kubectl apply -f - <<EOF
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: docker-for-desktop-binding
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: cluster-admin
    subjects:
    - apiGroup: rbac.authorization.k8s.io
      kind: Group
      name: system:serviceaccounts:kube-system
    EOF
    

    我不知道这是否会导致未来 Docker Desktop 升级出现问题,但它现在可以完成这项工作。

    修复该问题后,上面的代码正确地给出了 403 错误,并且需要以下内容来显式授予对服务资源的访问权限:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: service-reader
    rules:
    - apiGroups: [""]
      resources: [services]
      verbs: [get, list]
    
    ---
    
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: test-sa-service-reader-binding
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: service-reader
    subjects:
    - kind: ServiceAccount
      name: test-sa
    

    一个有用的调查命令是kubectl auth can-i --list --as system:serviceaccount,它显示恶意权限正在应用于所有服务帐户:

    Resources                       Non-Resource URLs   Resource Names   Verbs
    *.*                             []                  []               [*]
                                    [*]                 []               [*]
    [...]
    

    【讨论】:

      【解决方案3】:

      Docker-Desktop for Windows 中也存在同样的错误。

      它会自动添加一个 ClusterRoleBinding,为所有服务帐户提供 cluster-admin (!)。它只打算将其提供给 kube-system 命名空间内的服务帐户。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-07
        • 2018-06-17
        • 2019-03-30
        • 2019-03-15
        • 1970-01-01
        • 1970-01-01
        • 2019-06-09
        • 2018-06-19
        相关资源
        最近更新 更多