【问题标题】:Kubernetes namespace default service accountKubernetes 命名空间默认服务帐户
【发布时间】:2019-03-30 11:03:34
【问题描述】:

如果未指定,Pod 将在默认服务帐户下运行。

  • 如何查看默认服务帐号的权限?
  • 我们是否需要将它与每个 pod 一起安装在那里?
  • 如果没有,我们如何在命名空间级别或集群级别禁用此行为。
  • 默认服务帐户还应处理哪些其他用例?
  • 我们可以将其用作服务帐户来创建和管理命名空间中的 Kubernetes 部署吗?例如,我们不会使用真实的用户帐户在集群中创建东西,因为用户来来去去。

环境:Kubernetes 1.12,带 RBAC

【问题讨论】:

    标签: kubernetes rbac


    【解决方案1】:
    1. 会自动为每个命名空间创建一个默认服务帐户。

    kubectl 获取服务帐号

    姓名秘密年龄

    默认 1 1d

    1. 可以在需要时添加服务帐号。每个 pod 只与一个服务帐号相关联,但多个 pod 可以使用同一个服务帐号。

    2. 一个 pod 只能使用同一命名空间中的一个服务帐户。

    3. 通过在 pod 清单中指定帐户的名称,将服务帐户分配给 pod。如果您没有明确分配它,则 pod 将使用默认服务帐户。

    4. 服务帐户的默认权限不允许它 列出或修改任何资源。默认服务帐户不允许查看集群状态,更不用说以任何方式对其进行修改。

    5. 默认情况下,命名空间中的默认服务帐户除了未经身份验证的用户之外没有其他权限。

    6. 因此,默认情况下,pod 甚至无法查看集群状态。您可以授予他们适当的权限来执行此操作。

    kubectl exec -it test -n foo sh / # curl localhost:8001/api/v1/namespaces/foo/services { "kind": "Status",
    “apiVersion”:“v1”,“元数据”:{

    },“状态”:“失败”,“消息”:“服务被禁止:用户 “system:serviceaccount:foo:default”无法列出资源 命名空间“foo”中的 API 组“”中的“服务”,“原因”: “禁止”,“详情”:{ “种类”:“服务”},“代码”:403

    如上图所示,默认服务帐号无法列出服务

    但是当给定适当的角色和角色绑定时,如下所示

    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      creationTimestamp: null
      name: foo-role
      namespace: foo
    rules:
    - apiGroups:
      - ""
      resources:
      - services
      verbs:
      - get
      - list
    
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      creationTimestamp: null
      name: test-foo
      namespace: foo
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: foo-role
    subjects:
    - kind: ServiceAccount
      name: default
      namespace: foo
    

    现在我可以列出资源服务了

    kubectl exec -it test -n foo sh
    / # curl localhost:8001/api/v1/namespaces/foo/services
    {
      "kind": "ServiceList",
      "apiVersion": "v1",
      "metadata": {
        "selfLink": "/api/v1/namespaces/bar/services",
        "resourceVersion": "457324"
      },
      "items": []
    
    1. 为您的所有服务帐户提供clusteradmin ClusterRole 是 馊主意。最好只给每个人他们完成工作所需的权限,而不是一个单一的权限。

    2. 为每个 pod 创建一个特定的服务帐户是个好主意 然后通过 角色绑定。

    3. 如果您的一个 pod 只需要读取 pod,而另一个也需要修改它们,则创建两个不同的服务帐户,并通过在 吊舱规格。

    您可以参考下面的链接以获得深入的解释。

    Service account example with roles

    您可以查看kubectl explain serviceaccount.automountServiceAccountToken并编辑服务帐号

    kubectl edit serviceaccount default -o yaml

    apiVersion: v1
    automountServiceAccountToken: false
    kind: ServiceAccount
    metadata:
      creationTimestamp: 2018-10-14T08:26:37Z
      name: default
      namespace: default
      resourceVersion: "459688"
      selfLink: /api/v1/namespaces/default/serviceaccounts/default
      uid: de71e624-cf8a-11e8-abce-0642c77524e8
    secrets:
    - name: default-token-q66j4
    

    完成此更改后,您生成的任何 pod 都没有 serviceaccount 令牌,如下所示。

    kubectl exec tp -it bash
    root@tp:/# cd /var/run/secrets/kubernetes.io/serviceaccount
    bash: cd: /var/run/secrets/kubernetes.io/serviceaccount: No such file or directory
    

    【讨论】:

    • 谢谢,问题仍然存在,我如何列出命名空间中允许默认服务帐户的动词,以及如何在命名空间上禁用默认服务帐户令牌挂载到 pod 中或集群级别,是否必须使用默认服务帐户运行 pod
    • 默认服务帐户不允许使用动词,正如我在上面的示例中所解释的那样。您需要将服务帐户与角色或集群角色相关联,如第 9 点所述。您可以检查“kubectl explain serviceaccount.automountServiceAccountToken”,这允许您提供布尔值。将其设置为 false 不会挂载服务帐户令牌。每个 pod 都有一个服务帐户,出于安全考虑,该帐户无法访问
    • kubectl edit serviceaccount default -o yaml apiVersion: v1 automountServiceAccountToken: false kind: ServiceAccount metadata: creationTimestamp: 2018-10-14T08:26:37Z name: default namespace: default resourceVersion: "459688" selfLink: /api/v1/namespaces/default/serviceaccounts/default uid:de71e624-cf8a-11e8-abce-0642c77524e8 秘密:-名称:default-token-q66j4
    • > "默认情况下,命名空间中的默认服务帐户除了未经身份验证的用户之外没有其他权限。" ------ 谢谢!我真的希望该声明出现在 Kubernetes 官方文档中。我花了一整天的时间阅读 Kubernetes、Istio、人们的博客等的产品文档,试图找出这个事实。他们都不会简单地说出你刚才所说的话,或者给出一个教程式的命令序列(比如你的),这样我就可以学习如何自己做实验。您的回答很好——它没有留下任何关于默认功能是什么的疑虑。
    • 我真的很喜欢这个答案,只是它没有提供任何参考。我还没有找到任何官方文档来证实这篇文章所说的内容。例如,另一篇文章说“......默认服务帐户权限在命名空间内有效地读写,并且对于大多数资源类型是全局读取。”目前尚不清楚作者是如何得出这个结论的,以及它是否仍然适用。我使用kubectl auth can-i 进行了实验,请在此页面上查看我的答案。
    【解决方案2】:

    应用程序/部署可以通过在部署配置的serviceAccountName 字段中指定default 以外的服务帐户运行。

    我的服务帐户或任何其他用户可以做什么取决于它被赋予(绑定到)的角色 - 请参阅 roleBindings 或 clusterRoleBindings;动词是每个角色的apiGroupsresourcesrules 定义下。

    默认情况下,default 服务帐户似乎没有被赋予任何角色。可以将角色授予default 服务帐户,如#2 here 中所述。

    根据this,“...在 1.6+ 版本中,您可以通过在服务帐户上设置 automountServiceAccountToken: false 来选择不为服务帐户自动挂载 API 凭据”。

    HTH

    【讨论】:

    • 默认服务帐户的用例是什么,我们可以并且应该将其用作服务帐户来创建和管理 namsepace 中的 k8s 部署吗? ,例如我们不会使用真实的用户帐户在集群中创建东西,因为用户在团队中来来去去
    【解决方案3】:
    • 如何检查默认服务帐户的权限?

    没有简单的方法,但auth can-i 可能会有所帮助。例如

    $ kubectl auth can-i get pods --as=system:serviceaccount:default:default
    no
    

    对于用户来说,有auth can-i --list,但这似乎不适用于--as,我怀疑这是一个错误。无论如何,您可以对几个动词运行上述命令,但在所有情况下答案都是否定的,但我只尝试了几个。结论:似乎默认服务帐户默认没有权限(因为在我检查的集群中,我们没有配置它,AFAICT)。

    • 我们是否需要将它与每个 pod 一起安装在那里?

    不知道这个问题是什么意思。

    • 如果没有,我们如何在命名空间级别或集群级别禁用此行为。

    您可以在服务或单个 pod 上设置 automountServiceAccountToken: false。服务帐户是每个命名空间的,因此在服务帐户上完成后,该命名空间中使用该帐户的任何 pod 都将受到该设置的影响。

    • 默认服务帐户还应处理哪些其他用例?

    默认服务帐户是备用帐户,如果 pod 未指定,则使用 SA。因此,默认服务帐户应该没有任何权限。为什么 Pod 需要默认与 kube API 通信?

    • 我们可以将其用作服务帐户来创建和管理命名空间中的 Kubernetes 部署吗?

    我不建议这样做,请参阅上一个答案。相反,您应该为每个需要访问 API 的 pod 类型创建一个服务帐户(绑定到适当的角色/集群角色),遵循最低权限原则。所有其他 pod 类型都可以使用默认服务帐户,该帐户不应自动挂载 SA 令牌,不应绑定任何角色。

    【讨论】:

    • > kubectl auth can-i --list --as=system:serviceaccount:: -n 即 kubectl auth can-i --list --as= system:serviceaccount:testns:default -n testns
    【解决方案4】:
    kubectl auth can-i --list --as=system:serviceaccount:<namespace>:<serviceaccount> -n <namespace>
    

    作为一个简单的例子。检查 testns 命名空间中的默认服务帐户

    kubectl auth can-i --list --as=system:serviceaccount:testns:default -n testns 
    
    Resources                                       Non-Resource URLs                     Resource Names     Verbs
    selfsubjectaccessreviews.authorization.k8s.io   []                                    []                 [create]
    selfsubjectrulesreviews.authorization.k8s.io    []                                    []                 [create]
                                                    [/.well-known/openid-configuration]   []                 [get]
                                                    [/api/*]                              []                 [get]
                                                    [/api]                                []                 [get]
                                                    
                                                    [ ... ]
                                                    
                                                    [/readyz]                             []                 [get]
                                                    [/version/]                           []                 [get]
                                                    [/version/]                           []                 [get]
                                                    [/version]                            []                 [get]
                                                    [/version]                            []                 [get]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-21
      • 2019-07-09
      • 1970-01-01
      • 2020-11-03
      • 2021-10-13
      • 2019-08-30
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多