RBAC是什么?
RBAC模型(Role-Based Access Control:基于角色的访问控制)模型是比较早期提出的权限实现模型,在多用户计算机时期该思想即被提出,其中以美国George Mason大学信息安全技术实验室(LIST)提出的RBAC96模型最具有代表,并得到了普遍的公认。
RBAC认为权限授权的过程可以抽象地概括为:Who是否可以对What进行How的访问操作,并对这个逻辑表达式进行判断是否为True的求解过程,也即是将权限问题转换为Who、What、How的问题,Who、What、How构成了访问权限三元组,具体的理论可以参考RBAC96。
在RBAC模型里面,有3个基础组成部分,分别是:用户、角色和权限,它们之间的关系如下图所示:
User(用户):每个用户都有唯一的UID识别,并被授予不同的角色
Role(角色):不同角色具有不同的权限
Permission(权限):访问权限
用户-角色映射:用户和角色之间的映射关系
角色-权限映射:角色和权限之间的映射
例如下图,管理员和普通用户被授予不同的权限,普通用户只能去修改和查看个人信息,而不能创建用户和冻结用户,而管理员由于被授予所有权限,所以可以做所有操作。
Kubernates集群中的所有资源的访问和变更都是通过Kubernates API Server的 REST API来实现的,所以集群安全的关键点就在于如何识别并认证客户端身份,以及随后访问权限的授权这两个关键问题。Kubernates安全机制里面设计了三道关卡,得通过三关客户端的调用请求才能够得到API Server的真正响应:
1. 认证
2. 鉴权
3. 准入控制(Admission Control)
API Server认证方式有三种:
1. HTTPS证书认证:基于CA根证书签名的双向数字证书认证方式
2. HTTP Token认证:通过一个Token来识别合法用户
3. HTTP Base认证:通过用户名+密码的方式认证
API Server目前支持以下6种授权策略:
1. AlwaysDeny
2. AlwaysAllow
3. ABAC: 基于属性的访问控制
4. Webhook:通过调用外部REST服务对用户进行授权
5. RBAC:基于角色的访问控制
6. Node: 是一种专用模式,用于对kubelet发出的请求进行访问控制
RBAC工作原因HOW?
RBAC作为kubeadm安装方式的默认选项,足见其重要程度。
1. RBAC的资源对象
1. 1Role
◦ 一个角色就是一组权限的集合。角色(Role)只能对命名空间内的资源进行授权,例如:
• apiGroups:支持的API组列表
• resources: 支持的资源对象列表,例如pods、deployments、jobs等
• verbs:对资源对象的操作方法列表,例如get、watch、list、delete、replace、patch等
2. ClusterRole
◦ 集群角色除了具有和角色一致的命名空间内资源的管理能力,因其集群级别的范围,还可以用于这些特殊元素的授权:
• 集群范围的资源,例如Node
• 非资源型的路径,/healthz
• 包含全部命名空间的资源,例如pods, --all-namespace
3. RoleBinding & ClusterRoleBinding
◦ 角色绑定或集群角色绑定用来把一个角色绑定到一个目标上,绑定目标可以是User,Group,或者Service Account。使用RoleBinding 为某个命名空间授权,使用ClusterRoleBinding为集群范围内授权.
2. 对资源的引用方式
有两种resources和ResourceNames. 可以像以上例子一样配置resources为一个数组, 以此来授权让某个主体同时能够读取pod和pod log:
在指定resourceNames以后,使用get,delete等操作请求,就会被限制在这个资源实例范围内。例如,下面的声明让一个主体只能对一个configmap进行get和update操作:
API Server在接受到请求以后,会读取该请求的数据,生成一个访问策略对象。然后将这个访问策略对象和授权策略文件中的所有访问策略对象逐条匹配,如果至少有一个策略对象被匹配,则该请求被鉴权通过,否则终止API调用流程,并返回客户端的错误调用码。
示例
1. 使用RBAC授权模式,需要在API Server的启动参数中加上 --authorization-mode = RBAC
2. 常见的角色绑定示例
首先声明角色pod-reader:
声明RoleBinding:
通过kubectl apply -f 上面的yaml文件,可以完成jane is pod-reader的角色绑定,pod-reader只能对该命名空间范围内的pods做操作get, watch, list.
总结:
本文首先介绍了RBAC的基本概念,RBAC的工作原理,最后演示了如何进行角色绑定。
reference:
(1)https://segmentfault.com/a/1190000023179921
(2)https://blog.51cto.com/billy98/2380061