Kubernetes RBAC访问控制

基于角色的访问控制(RBAC)使用rbac.authorization.k8s.ioAPI组来驱动授权决策,允许管理员通过Kubernetes API动态配置策略。

从1.8开始RBAC模式是稳定的,由rbac.authorization.k8s.io/v1API支持。

开启RBAC启动apiserver的时候通过--authorization-mode=RBAC参数来配置。

Role和ClusterRole

在RBAC API里,角色包含一组标示权限的规则集合,权限是纯碎的加法没有否定规则。角色可以是定义给namespace的Role,也可以是集群范围的ClusterRole。一个Role只能用于对单个namespace的资源访问权限。这里是一个定义给default namespace的Role,可以用于读取访问pods:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

ClusterRole可以用于授予和Role相同的权限,不过它是集群范围的,也可以用于授权访问权限:

  • 集群范围资源(例如节点)
  • 非资源端点(例如"/healthz")
  • 所有namespace中的命名空间资源(例如pod)

下面的ClusterRole例子可用于访问特定namespace或者所有namespace的secrets(取决于它如何绑定):

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  # "namespace" omitted since ClusterRoles are not namespaced
  name: secret-reader
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]

RoleBinding和ClusterRoleBinding

角色绑定将Role里面定义的权限授予一个用户或者一组用户集合。它包含(users,groups或者serviceaccount)以及被授予的角色引用。权限可以通过RoleBinding授予一个namespace,或者集群范围的ClusterRoleBinding。

RoleBinding可以在相同的namespace引用一个Role。下面的RoleBinding给用户jane在default空间中授予pod-reader角色。允许用户jane读取default空间中的pod。

# This role binding allows "jane" to read pods in the "default" namespace.
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-pods
  namespace: default
subjects:
- kind: User
  name: jane
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

RoleBinding还可以引用ClusterRole来授予RoleBinding命名空间中ClusterRole中定义的命名空间资源权限。这允许管理员为整个集群定义一组通用角色,然后在多个命名空间中使用它们。

例如,以下RoleBinding引用了一个ClusterRole,“dave”将在development命名空间中可以读取secrets。

# This role binding allows "dave" to read secrets in the "development" namespace.
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-secrets
  namespace: development # This only grants permissions within the "development" namespace.
subjects:
- kind: User
  name: dave
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: secret-reader
  apiGroup: rbac.authorization.k8s.io

ClusterRoleBinding可以用于授予所有namespace集群级别的权限。下面的例子ClusterRoleBinding允许manager里面的所有用户都可以读取所有集群的secrets。

# This cluster role binding allows anyone in the "manager" group to read secrets in any namespace.
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-secrets-global
subjects:
- kind: Group
  name: manager
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: secret-reader
  apiGroup: rbac.authorization.k8s.io

参考资源

大多数资源的名称由字符串表示,例如pods,就像它出现在API的端点URL中。然后一些Kubernetes API涉及一些子资源,例如pod的日志。下面的URL是pod的日志:

GET /api/v1/namespaces/{namespace}/pods/{name}/log

在这个例子中,pods是命名空间资源,log是pod的子资源。在RBAC中表示此角色,使用斜杠划分资源和子资源。允许读取pod和pod日志,可以这样写:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: pod-and-pod-logs-reader
rules:
- apiGroups: [""]
  resources: ["pods", "pods/log"]
  verbs: ["get", "list"]

资源也可以通过resourceName列表中的某些请求的名称引用。当指定时,请求使用"get","delete","update"和"patch"动词可以被限制为资源的各个实例。要限制只能"get"和"update"一个单独的configmap可以这样写:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: configmap-updater
rules:
- apiGroups: [""]
  resources: ["configmaps"]
  resourceNames: ["my-configmap"]
  verbs: ["update", "get"]

值得注意的是,如果resourceNames被指定动词不能是list, watch, create或者deletecollection。因为资源名称不存在于list, watch, create和deletecollection的URL中。这些动词将不被resourceName设置的规则所允许,因为规则的resourceNames部分与请求不匹配。

Role例子

一下例子只显示rules部分:

允许读取pods资源在核心API组:

rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]

允许读取和写deployment在extensions和app API组:

rules:
- apiGroups: ["extensions", "apps"]
  resources: ["deployments"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

允许读取pods和读写jobs:

rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]
- apiGroups: ["batch", "extensions"]
  resources: ["jobs"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

允许读取名字为my-config的ConfigMap(必须绑定RoleBinding限制一个ConfigMap和一个namespace):

rules:
- apiGroups: [""]
  resources: ["configmaps"]
  resourceNames: ["my-config"]
  verbs: ["get"]

允许核心组读取nodes(因为Node是一个集群范围,必须在ClusterRole和一个ClusterRoleBinding才可以生效):

rules:
- apiGroups: [""]
  resources: ["nodes"]
  verbs: ["get", "list", "watch"]

允许“GET”和“POST”请求到非资源端点“/ healthz”和所有子路径(必须在与ClusterRoleBinding绑定的ClusterRole中有效):

rules:
- nonResourceURLs: ["/healthz", "/healthz/*"] # '*' in a nonResourceURL is a suffix glob match
  verbs: ["get", "post"]

参考主题

RoleBinding或ClusterRoleBinding将角色绑定到主题。主题可以是groups,users和serviceaccount。用户由字符串表示。这些可以是简单的用户名,如“alice”,电子邮件样式名称,如“bob@example.com”或以字符串表示的数字ID。由Kubernetes管理员配置认证模块以产生所需格式的用户名。RBAC授权系统不需要任何特定格式。然而,前缀"system:"是为Kubernetes系统使用而保留的,因此管理员应确保用户名不会意外包含此前缀。

Kubernetes的组信息目前由Authenticator模块提供。groups,users是用字符串表示,没有格式要求,除了预留的system:

Service Accounts的名字为system:serviceaccount前缀,并且属于具有system:serviceaccounts前缀的组。

Role绑定的例子

以下例子只显示了RoleBinding部分。

用户名为"alice@example.com":

subjects:
- kind: User
  name: "alice@example.com"
  apiGroup: rbac.authorization.k8s.io

组名为"frontend-admins":

subjects:
- kind: Group
  name: "frontend-admins"
  apiGroup: rbac.authorization.k8s.io

在kube-system命名空间里的default service account:

subjects:
- kind: ServiceAccount
  name: default
  namespace: kube-system

qa命名空间里面的所有的service account:

subjects:
- kind: Group
  name: system:serviceaccounts:qa
  apiGroup: rbac.authorization.k8s.io

所有service account在任何地方:

subjects:
- kind: Group
  name: system:serviceaccounts
  apiGroup: rbac.authorization.k8s.io

所有的验证用户(版本:1.5+):

subjects:
- kind: Group
  name: system:authenticated
  apiGroup: rbac.authorization.k8s.io

所有的不需要验证用户(版本:1.5+):

subjects:
- kind: Group
  name: system:unauthenticated
  apiGroup: rbac.authorization.k8s.io

所有类型用户(版本1.5+):

subjects:
- kind: Group
  name: system:authenticated
  apiGroup: rbac.authorization.k8s.io
- kind: Group
  name: system:unauthenticated
  apiGroup: rbac.authorization.k8s.io
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,442评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,604评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,576评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,652评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,495评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,370评论 1 274
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,792评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,435评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,735评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,777评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,553评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,399评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,806评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,038评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,330评论 1 253
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,766评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,964评论 2 337

推荐阅读更多精彩内容

  • 原创译文 转载请标明出处 [TOC] 简介 基于角色的权限控制,使用 rbac.authorization.k8s...
    陈sir的知识图谱阅读 1,849评论 0 2
  • kubernetes 简介 一个迅速过一遍kubernetes 非常不错的资源:基于Kubernetes构建Doc...
    bradyjoestar阅读 15,272评论 2 7
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,517评论 18 139
  • 写这篇文章主要是为了今后毕业论文素材上的整理,同时对docker进行巩固温习。大纲: docker简介docker...
    胡图仙人阅读 7,382评论 2 96
  • HTML5和之前的版本区别HTML5是HTML的新一代标准。以前版本的HTML标准4.01发布于1999。自199...
    不排版阅读 282评论 0 0