Kubernetes名称空间默认服务帐户

Ija*_*han 6 rbac kubernetes

如果没有另外指定,则pod在命名空间中使用默认服务帐户运行,如何检查默认服务帐户的授权,我们是否需要将其安装在每个pod中,如果没有,我们怎么办?在命名空间级别或群集级别上禁用此行为.

仍在搜索文档.

环境:Kubernetes 1.12,RBAC

默认服务帐户应该处理哪些其他用例?可以/我们应该将它用作服务帐户来创建和管理namsepace中的k8s部署吗?例如,我们不会使用真实的用户帐户来创建集群中的东西,因为用户来到团队/组织中.

Sha*_*Pai 19

  1. 为每个命名空间自动创建默认的Serviceaccount,每个namesapce都有一个默认的sa

kubectl得到sa

NAME SECRETS AGE

默认1 1d

  1. 可以在需要时添加serviceccounts.每个pod只与一个serviceAccount关联,但多个pod可以使用相同的serviceaccount.

  2. pod只能使用同一名称空间中的serviceaccount.

  3. 您可以通过在容器清单中指定帐户名称来将服务帐户分配给容器.如果您没有明确指定它,则pod将使用命名空间中的默认serviceaccount

  4. ServiceAccount的默认权限不允许它列出或修改任何资源.默认的Service-Account不允许查看群集状态,更不用说以任何方式修改它

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

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

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

},"status":"失败","消息":"服务被禁止:用户\"系统:serviceaccount:foo:default \"无法在命名空间中的API组\"\"列出资源\"services \" "foo",""reason":"禁止","详情":{"kind":"services"},"code":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
Run Code Online (Sandbox Code Playgroud)

现在我能够列出resurce服务

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": []
Run Code Online (Sandbox Code Playgroud)
  1. 提供所有serviceAccounts clusteradmin clusterrole是一个坏主意,它最好只为每个人提供他们完成工作所需的权限而不是单一权限更多

  2. 为每个pod创建一个特定的serviceAccount,然后通过一个角色绑定将其与一个度身定制的角色或一个clusterrole相关联是个好主意.

  3. 如果其中一个pod只需要读取pod而另一个需要修改它们,则创建两个不同的serviceaccounts并通过在pod规范中指定serviceaccountName属性使这些pod使用它们

您可以参考以下链接进行深入解释

带角色的服务帐户示例

你可以检查一下

kubectl解释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
Run Code Online (Sandbox Code Playgroud)

一旦完成此更改,您生成的任何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
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,问题仍然存在,我如何列出允许在命名空间中默认服务帐户使用哪些动词,以及我们如何在名称空间或集群级别上禁止通过默认方式将默认服务帐户令牌安装到 pod 中,这是强制性的吗?使用默认服务帐户运行 pod (2认同)
  • > *“默认情况下,命名空间中的默认服务帐户除了未经身份验证的用户之外没有任何权限。”* ------ 谢谢!!!我真的希望 Kubernetes 官方文档中有这样的声明。我花了一整天的时间阅读 Kubernetes、Istio 的产品文档、人们的博客等,试图找出这个事实。他们中没有人会简单地说出你刚才所说的内容,或者给出教程式的命令序列(像你的那样),以便我学习如何自己进行实验。你的答案很好——它没有留下对默认功能是什么的挥之不去的疑问。 (2认同)