Kubernetes访问控制之鉴权

鉴权是确定请求方有哪些资源的权限,API Server目前支持RBAC鉴权Node鉴权ABAC鉴权 和 Webhook模式

一、RBAC鉴权

基于角色(Role)的访问控制(RBAC)是一种基于组织中用户的角色来调节控制对计算机或网络资源的访问的方法。

要启用 RBAC,在启动 API 服务器时将 --authorization-mode 参数设置为一个逗号分隔的列表并确保其中包含 RBAC

API对象

RBAC API 声明了四种 Kubernetes 对象:RoleClusterRoleRoleBindingClusterRoleBinding

RBAC.png
  • Role 或 ClusterRole 中包含一组代表相关权限的规则。 这些权限是纯粹累加的(不存在拒绝某操作的规则)

  • Role 定义命名空间内权限,ClusterRole是定义跨命名空间的权限

    Role定义例子如下:

    kind: Role
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      namespace: default      ##如果kind是ClusterRole,无须指定,代表集群级别
      name: pod-reader
    rules:
    - apiGroups: [""]             #"" indicates the core API group 具体参考kubectl api-resources
      resources: ["pods"]         # 资源names, 子资源例子:["pods/log"]
      verbs: ["get", "watch", "list"]  #允许动作
    

    如果是Role,代表能访问default空间下的所有Pod,如果是ClusterRolo代表能访问所有空间下的Pod

    -指定固定某个资源名称

    rules:
    - apiGroups: [""]
      # 在 HTTP 层面,用来访问 ConfigMap 资源的名称为 "configmaps"
      resources: ["configmaps"]
      resourceNames: ["my-configmap"]
      verbs: ["update", "get"]
    

    -指定非资源端点

    rules:
    - nonResourceURLs: ["/healthz", "/healthz/*"] # nonResourceURL 中的 '*' 是一个全局通配符
      verbs: ["get", "post"]
    
  • RoleBinding 将Role定义的权限授予用户/用户组/服务账号 (统称主体subject)

  • ClusterRoleBinding 只能将ClusterRole定义的权限授予用户/用户组/服务账号(统称主体subject)
    将pod-reader角色授予普通用户myuser

    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: read-pods
      namespace: default
    subjects:
    - kind: User       #支持User,Group,ServiceAccount 三种类型
      name: myuser
      apiGroup: rbac.authorization.k8s.io
    roleRef:
       kind: Role
       name: pod-reader
       apiGroup: rbac.authorization.k8s.io
    

一个 RoleBinding 也可以引用某 ClusterRole 并将该 ClusterRole 绑定到 RoleBinding 所在的名字空间

聚合的ClusterRole

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: monitoring
aggregationRule:
  clusterRoleSelectors:
  - matchLabels:
      rbac.example.com/aggregate-to-monitoring: "true"
rules: [] # 控制面自动填充这里的规则
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: monitoring-endpoints
  labels:
    rbac.example.com/aggregate-to-monitoring: "true"
# 当你创建 "monitoring-endpoints" ClusterRole 时,
# 下面的规则会被添加到 "monitoring" ClusterRole 中
rules:
- apiGroups: [""]
  resources: ["services", "endpointslices", "pods"]
  verbs: ["get", "list", "watch"]

相关核心内置对象

所有system:前缀都是系统自带命名规则

1.主体Subject

名称 类型 说明
default ServiceAccount 每个命名空间自带
system:anonymous User 匿名用户
system:serviceaccounts Group 任务名字空间的服务账号都属于这个组
system:serviceaccounts:空间名字 Group 该名字空间下的服务账号都属于这个组
system:authenticated Group 所有通过身份认证的用户都属于这个组
system:unauthenticated Group 所有未通过身份认证的用户都属于这个组
system:masters Group 超级管理员cluster-admin所属的组

system:serviceaccount: (单数)是用于服务账户用户名的前缀;
system:serviceaccounts: (复数)是用于服务账户组名的前缀。

2.默认ClusterRole/ClusterRoleBinding

  • 默认 ClusterRole 和 ClusterRoleBinding 都有kubernetes.io/bootstrapping=rbac-defaults 标签
  • 自动协商:在每次启动时,API 服务器都会更新默认 ClusterRole 以添加缺失的各种权限, 并更新默认的 ClusterRoleBinding 以增加缺失的各类主体。禁止可设置注解rbac.authorization.kubernetes.io/autoupdate=false
默认ClusterRole 对应默认ClusterRoleBinding 说明
cluster-admin cluster-admin, 绑定system:master组 超级管理员角色
admin 大多数对象进行读/写操作包括角色和角色绑定
edit 大多数对象进行读/写操作角色
view 只有访问权限角色
system:discovery system:discovery,绑定组 system:authenticated 允许以只读方式访问 API 发现端点

如果要禁用匿名的未经过身份验证的用户访问,请在 API 服务器配置中中添加 --anonymous-auth=false 的配置选项

  • 创建一个dev空间的管理员dev-admin
kubectl create rolebinding dev-admin --clusterrole=cluster-admin --user=dev-admin -n dev

二、Node鉴权

节点鉴权是一种特殊用途的鉴权模式,专门对 kubelet 发出的 API 请求进行授权,通过--authorization-mode=Node 启动API服务器开启
为了获得节点鉴权器的授权,kubelet 必须使用一个凭证以表示它在 system:nodes 组中,用户名为 system:node:<nodeName>

三、ABAC鉴权

基于属性的访问控制(Attribute-based access control - ABAC)定义了访问控制范例, 其中通过使用将属性组合在一起的策略来向用户授予访问权限

  • 指定策略文件 --authorization-policy-file=SOME_FILENAME

文件内容格式JSON lines,例如:

  • Alice 可以对所有资源做任何事情
{"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "alice", "namespace": "*", "resource": "*", "apiGroup": "*"}}
  • kubelet 可以读取任何 pod
{"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "kubelet", "namespace": "*", "resource": "pods", "readonly": true}}

一般都是使用RBAC + Node鉴权

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

推荐阅读更多精彩内容