Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >k8s 基于角色的权限控制 RBAC

k8s 基于角色的权限控制 RBAC

作者头像
LinkinStar
发布于 2022-09-01 06:35:35
发布于 2022-09-01 06:35:35
66800
代码可运行
举报
文章被收录于专栏:LinkinStar's BlogLinkinStar's Blog
运行总次数:0
代码可运行

RBAC 之所以一直没有写这个,一方面是因为它确实并不复杂,二来平常确实接触不多,今天就来顺路讲讲它

定义

Role-Based Access Control 我们常说的 RBAC,我们知道在一个后台管理系统里面经常会有权限管理。而最常用的一种权限设计方式就是基于角色的权限设计,A 用户是管理员拥有所有的权限,B 是普通用户角色只有部分权限等等,而 k8s 也是如此,k8s 内部也有许许多多的资源,通过 RBAC 的权限设计进行管理授权工作。

  • Role: 角色,定义了一组对 Kubernetes API 对象的操作权限
  • Subject: 用户,绑定角色的对象
  • RoleBinding: 用户和角色的绑定关系

其实非常好理解: 用户 -> 角色 -> 权限

Role

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""] # "" 标明 core APIresources: ["pods"]
  verbs: ["get", "watch", "list"]

这就是 k8s 里面的角色,这里定义了一个角色 pod-reader 这个角色可以对 default 命名空间中的 pod 资源进行 get watch list 操作

ClusterRole

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  # "namespace" 被忽略,因为 ClusterRoles 不受名字空间限制
  name: secret-reader
rules:
- apiGroups: [""]
  # 在 HTTP 层面,用来访问 Secret 对象的资源的名称为 "secrets"
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]

ClusterRole 属于集群范围,所以整个集群对应的资源都可以被使用

RoleBinding

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: rbac.authorization.k8s.io/v1
# 此角色绑定允许 "jane" 读取 "default" 名字空间中的 Pods
kind: RoleBinding
metadata:
  name: read-pods
  namespace: default
subjects:
# 你可以指定不止一个“subject(主体)”
- kind: User
  name: jane # "name" 是区分大小写的
  apiGroup: rbac.authorization.k8s.io
roleRef:
  # "roleRef" 指定与某 Role 或 ClusterRole 的绑定关系
  kind: Role # 此字段必须是 Role 或 ClusterRole
  name: pod-reader     # 此字段必须与你要绑定的 Role 或 ClusterRole 的名称匹配
  apiGroup: rbac.authorization.k8s.io

有了角色自然就是将用户绑定到对应的角色上去了,这个没有什么好说的,很容易理解

ClusterRoleBinding

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: rbac.authorization.k8s.io/v1
# 此集群角色绑定允许 “manager” 组中的任何人访问任何名字空间中的 secrets
kind: ClusterRoleBinding
metadata:
  name: read-secrets-global
subjects:
- kind: Group
  name: manager # 'name' 是区分大小写的
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: secret-reader
  apiGroup: rbac.authorization.k8s.io

同样的 ClusterRoleBinding 也是类似

ServiceAccount

其实 User 不多,其实我们更多的使用 k8s 里的内置用户也就是 ServiceAccount,这个 ServiceAccount 会生成一个 secrets 利用这个可以跟 APIServer 进行交互

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: v1
kind: ServiceAccount
metadata:
  namespace: mynamespace
  name: example-sa
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: example-rolebinding
  namespace: mynamespace
subjects:
- kind: ServiceAccount
  name: example-sa
  namespace: mynamespace
roleRef:
  kind: Role
  name: example-role
  apiGroup: rbac.authorization.k8s.io
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: v1
kind: Pod
metadata:
  namespace: mynamespace
  name: sa-token-test
spec:
  containers:
  - name: nginx
    image: nginx:1.7.9
  serviceAccountName: example-sa

通过 serviceAccountName 指定对应的 ServiceAccount 就可以使用了

通过 client-go 来使用

如果只是上面那样有点空,也有点虚,不如直接开官网文档来的快。下面就直接使用实际的案例来看看 rbac 到底是怎么样作用的。

目标

我们的目标是创建一个用户,然后绑定对应的权限,有了对应的权限之后,创建的对应的 deployment 使用对应的用户,然后获取到对应的资源,我们使用 client-go 直接获取对应的资源信息看看。

创建用户

这里我们使用 ClusterRole,并且直接绑定已有的角色 cluster-admin, 然后创建需要使用的 ServiceAccount

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: admin
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
  name: admin
  namespace: my-namespace
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin
  namespace: my-namespace
  labels:
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile

一个简单的 client-go 应用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
   "context"
   "fmt"

   metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
   "k8s.io/client-go/kubernetes"
   "k8s.io/client-go/rest"
   //
   // Uncomment to load all auth plugins
   // _ "k8s.io/client-go/plugin/pkg/client/auth"
   //
   // Or uncomment to load specific auth plugins
   // _ "k8s.io/client-go/plugin/pkg/client/auth/azure"
   // _ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
   // _ "k8s.io/client-go/plugin/pkg/client/auth/oidc"
   // _ "k8s.io/client-go/plugin/pkg/client/auth/openstack"
)

func main() {
   config, err := rest.InClusterConfig()
   if err != nil {
      panic(err.Error())
   }

   clientset, err := kubernetes.NewForConfig(config)
   if err != nil {
      panic(err.Error())
   }

   fmt.Printf("all namespaces: ")
   nsList, err := clientset.CoreV1().Namespaces().List(context.TODO(), metav1.ListOptions{})
   if err != nil {
      panic(err.Error())
   }
   for _, item := range nsList.Items {
      fmt.Printf("%s ", item.Name)
   }

   fmt.Println()
   fmt.Printf("all deployments in default namespace: ")
   deployments, err := clientset.AppsV1().Deployments("default").List(context.TODO(), metav1.ListOptions{})
   if err != nil {
      panic(err.Error())
   }
   for _, item := range deployments.Items {
      fmt.Printf("%s ", item.Name)
   }

   select {}
}

因为我们的应用运行在 k8s 内部,所以使用 client-go 非常容易,使用 rest.InClusterConfig() 就可以获取到对应配置

只要当前 deployment 有对应的权限,就可以获取到对应的资源 pod 或者 namespace 等

创建 deployment

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: rabc-test
  namespace: my-namespace
  labels:
    app: rabc-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: rabc-test
  template:
    metadata:
      labels:
        app: rabc-test
    spec:
      containers:
      - name: rabc-test
        image: linkinstars.com/rabc-test:latest
      serviceAccountName: admin

创建 deployment 使用 serviceAccountName 指定刚才创建的 ServiceAccount admin 这里需要注意缩进,它是 template 下的 spec 的一个属性

运行后查看日志则可以获取到对应的所有的 namespace 列表和 default 下的所有 deployment

总结

  • 对于 k8s 的 rbac 其实使用还是非常简单的,基本上没有必要单独去记,用到的时候需要创建对应权限角色的时候查询对应的文档使用就可以了。
  • 而当我们有了对应权限之后就可以在 k8s 内部的应用使用 client-go 去获取对应的 k8s 的资源信息,并且还可以对相应的资源进行操作,这样就大大的丰富了你开发 k8s 原生应用的想象力

参考文档:https://kubernetes.io/zh/docs/reference/access-authn-authz/rbac/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-07-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
k8s之RBAC授权模式
基于角色的访问控制,启用此模式,需要在API Server的启动参数上添加如下配置,(k8s默然采用此授权模式)。
Liusy
2020/11/19
1.4K0
k8s之RBAC授权模式
一文读懂k8s RBAC权限控制
k8s API服务器在接收到请求后,会经过 1) 认证插件; 如果其中一个认证插件通过,则认证结束。2) 进入授权流程。3) 进入准入控制链,所有注册的注入控制节点全部通过,则准入结束
你算哪块香橙夹心饼干
2021/11/02
2.1K0
Kubernetes(k8s)权限管理RBAC详解
在K8S中支持授权有AlwaysDeny、AlwaysAllow、ABAC、Webhook、RBAC、Node共6种模式,从1.6版本起,K8S默认启用RBAC访问控制策略,目前RBAC已作为稳定的功能,管理员可以通过 Kubernetes API 动态配置策略来启用RBAC,需要在 kube-apiserver 中添加参数--authorization-mode=RBAC。
王先森sec
2023/10/17
1.9K0
Kubernetes(k8s)权限管理RBAC详解
kubernetes rbac 权限管理
访问控制是云原生中的一个重要组成部分,也是一个 Kubernetes 集群在多租户环境下必须要采取的一个基本的安全架构手段。
看、未来
2022/11/02
7470
kubernetes rbac 权限管理
图解K8s源码 - kube-apiserver下的RBAC鉴权机制
最近有大佬问了阿巩个问题,“开发PaaS平台遇到多租户的权限管理问题该如何处理”。考虑到k8s默认提供了类似的RBAC机制,于是想着借鉴或者直接利用k8s的RBAC来实现,下面是阿巩梳理的这部分内容,特来与大伙分享也让自己对这部分知识更加深化。
才浅Coding攻略
2022/12/12
7530
图解K8s源码 - kube-apiserver下的RBAC鉴权机制
Kubernetes K8S之鉴权RBAC详解
HTTP Token的认证是用一个很长的特殊编码方式的并且难以被模仿的字符串来表达客户的一种方式。每一个Token对应一个用户名,存储在API Server能访问的文件中。当客户端发起API调用请求时,需要在HTTP Header里放入Token。
踏歌行
2020/12/16
1.8K0
Kubernetes K8S之鉴权RBAC详解
「走进k8s」Kubernetes1.15.1的RBAC(28)
PS:RBAC只是k8s中的一种安全的认证方式,后面在一起说说k8s的关于安全的一些设计。
IT架构圈
2019/09/02
7690
kubernete编排技术六:RBAC权限控制
这是kubernete编排技术的第六篇,本文主要讲一下RBAC。之前讲过,kubernete所有API对象,都保存在etcd里。要访问和操作这些对象,一定会通过apiserver,因为apiserver可以做授权工作。
jinjunzhu
2020/08/21
6130
k8s集群访问控制之RBAC授权
所以说,之后的所有的操作许可,都是直接授权给角色(Role),而不是直接授权给用户。
Linux运维技术之路
2022/06/07
6770
k8s集群访问控制之RBAC授权
Kubernetes-基于RBAC的授权
在Kubernetes中,授权有ABAC(基于属性的访问控制)、RBAC(基于角色的访问控制)、Webhook、Node、AlwaysDeny(一直拒绝)和AlwaysAllow(一直允许)这6种模式。从1.6版本起,Kubernetes 默认启用RBAC访问控制策略。从1.8开始,RBAC已作为稳定的功能。通过设置–authorization-mode=RBAC,启用RABC。在RABC API中,通过如下的步骤进行授权:1)定义角色:在定义角色时会指定此角色对于资源的访问控制的规则;2)绑定角色:将主体与角色进行绑定,对用户进行访问授权。
菲宇
2019/06/12
9240
Kubernetes-基于RBAC的授权
【K8s】Kubernetes 安全机制之 RBAC
在 Kubernetes 中,RBAC(Role-Based Access Control,基于角色的访问控制)是一种权限管理机制,用于控制用户、系统进程或系统组件对 Kubernetes 资源的访问权限。
行者Sun
2024/10/08
1840
【K8s】Kubernetes 安全机制之 RBAC
k8s的安全认证
kubernetes作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。所谓的安全性其实就是保证对kubernetes的各种客户端进行认证和授权操作。
大忽悠爱学习
2022/09/28
4470
k8s的安全认证
K8s API访问控制
我们在请求API Server的时候,会经历哪些步骤呢?总得来说,有如下步骤:
谢公子
2023/02/27
2.2K0
K8s API访问控制
Kubernetes(k8s)-RBAC服务账户(ServiceAccount)介绍&应用
作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
运维小路
2025/02/19
1280
Kubernetes(k8s)-RBAC服务账户(ServiceAccount)介绍&应用
k8s基于RBAC的认证、授权介绍和实践
在K8S中,当我们试图通过API与集群资源交互时,必定经过集群资源管理对象入口kube-apiserver。显然不是随随便便来一个请求它都欢迎的,每个请求都需要经过合规检查,包括Authentication(身份验证)、Authorization(授权)和Admission Control(准入控制)。通过一系列验证后才能完成交互。
你大哥
2022/03/14
1.8K0
k8s基于RBAC的认证、授权介绍和实践
K8s认证_ce安全认证是什么意思
概述 kubernetes作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。所谓的安全性其实就是保证对kubernetes的各种客户端进行认证和授权操作。 让所有的客户端以合法的身份和步骤访问k8s 客户端 • 在kubernetes集群中,客户端通常由两类: • User Account:一般是独立于kubernetes之外的其他服务管理的用户账号。 • Service Account:kubernetes管理的账号,用于为Pod的服务进程在访问kubernetes时提供身份标识。
全栈程序员站长
2022/09/22
8020
K8s认证_ce安全认证是什么意思
mac 上学习k8s系列(17)rbac 源码学习(part I)
整理了下k8s 源码的核心数据结构,类图如上,可以看到核心就是Role和RoleBinding,对应到资源文件如下
golangLeetcode
2022/08/02
3440
mac 上学习k8s系列(17)rbac 源码学习(part I)
11 . KubernetesRBAC认证及ServiceAccount、Dashboard
允许读取一个名为my-config的ConfigMap(必须绑定到一个RoleBinding来限制到一个Namespace下的ConfigMap)
iginkgo18
2020/09/27
1.3K0
11 . KubernetesRBAC认证及ServiceAccount、Dashboard
备战CKA每日一题——第11天 | 权限控制怎么做?
获取到cka-1202-sa这个Service Account绑定的secret并base64 -d解码token字段:
我的小碗汤
2019/12/10
1K0
【K8S专栏】Kubernetes权限管理
Kubernetes 主要通过 API Server 对外提供服务,对于这样的系统来说,如果不加以安全限制,那么可能导致请求被滥用,甚至导致整个集群崩塌。
没有故事的陈师傅
2022/09/15
9790
【K8S专栏】Kubernetes权限管理
相关推荐
k8s之RBAC授权模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验