Kubernetes命名空间默认服务帐户

时间:2018-10-25 18:34:04

标签: kubernetes rbac

如果没有另外指定,则该Pod使用命名空间中的默认服务帐户运行,我如何检查默认服务帐户被授权执行的操作,是否需要将每个Pod都安装在该服务中?我们如何在命名空间级别或集群级别禁用此行为。

虽然仍在搜索文档。

环境:Kubernetes 1.12,带有RBAC

默认服务帐户应处理哪些其他用例?我们可以/应该将其用作服务帐户来创建和管理k8s部署吗? ,例如,我们不会使用真实的用户帐户在集群中创建事物,因为用户在team / org中进出。

2 个答案:

答案 0 :(得分:12)

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

kubectl得到sa

     

姓名秘密年龄

     

默认1 1d

    可以在需要时添加
  1. serviceccounts。每个Pod都与 一个serviceAccount,但是多个Pod可以使用相同的serviceaccount。

  2. 吊舱只能使用来自相同名称空间的服务帐户。

  3. 您可以通过在窗格中指定帐户名称来将服务帐户分配给窗格 表现。如果您未明确分配,则广告连播会使用默认的服务帐户 在命名空间中

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

  5. 默认情况下,名称空间中的默认serviceAccount除具有权限外没有其他权限 那些未经身份验证的用户。

  6. 因此默认情况下,广告连播无法 甚至查看群集状态。您可以自行授予他们适当的权限。

  

kubectl exec -it测试-n foo sh /#curl   本地主机:8001 / api / v1 /名称空间/ foo / services {“ kind”:“状态”,
  “ apiVersion”:“ v1”,“元数据”:{

     

},“状态”:“失败”,“消息”:“禁止服务:用户   \“ system:serviceaccount:foo:default \”无法列出资源   API组\“ \”在命名空间\“ foo \”“,”原因“中的\” services \“:   “禁止”,“详细信息”:{       “ 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

现在我可以列出中转服务了

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. 为每个吊舱创建一个特定的服务帐户是一个好主意 然后将其与定制角色或集群角色相关联, 角色绑定

  3. 如果您的一个Pod只需要读取Pod 而另一个也需要修改它们,然后创建两个不同的服务帐户 并通过在其中指定serviceaccountName属性来使这些Pod使用它们 广告连播规范

您可以参考以下链接进行详细说明

Service account example with roles

您可以检查

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

一旦完成此更改,无论您生成的哪个pod没有服务帐户令牌,如下所示。

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

答案 1 :(得分:2)

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

我的服务帐户或任何其他用户可以做什么,取决于它所赋予(绑定)的角色-请参阅roleBindings或clusterRoleBindings;动词是根据apiGroups定义下的角色的resourcesrules

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

根据this,“ ...在1.6及更高版本中,您可以通过在服务帐户上设置automountServiceAccountToken: false来选择退出自动安装服务帐户的API凭据”。

HTH