一 RBAC的概念
RBAC是基于角色的访问控制(Role-Based Access Control)
通俗的讲:
1)先定义某个'角色-->role'能做的事情-->'actions'-->'verbs'
2)再将这个角色'授予'某个人-->'授权'-->'授权的动作如何表现'
3)当'人-->user'做这些事情的时候,'校验'他的凭证'token'里面是否'携带了'对应的'角色',如果有对应的角色,则'鉴权成功',允许它做
备注: 更常用的方法是,将'role'和'用户组'绑定,给用户授权的时候,直接将用户'加入对应的用户组'即可
案例讲解
1) 定义一个'Role'-->name=admin,拥有这个'角色的用户'能够'调用'所有的'ECS API'
2) 授权给'wzj':把'admin'放入一个用户组'ECS_Admin',再将'wzj'放入用户组
3) 鉴权:'wzj'获取自己的访问凭证'token',使用凭证调用'ECS API'创建虚拟机,ECS服务解析凭证,并校验凭证'role'字段中是否含有'admin',若有则'同意'该次调用
二 k8s中RBAC的应用
开启RBAC
subject -->'用户、group、serviceaccount的综合'
说明: kubectl上'会绑定user',kubectl就是一个工具
三 案例讲解
(1)需求1
创建一个 'User Account-->普通用户',只能'only'访问 'kube-system' 这个命名空间,对应的'用户信息'如下所示
username: wzj
group: home
① 创建用户凭据
[root@master userrbac]# 'openssl genrsa -out wzj.key 2048'
Generating RSA private key, 2048 bit long modulus
...................................+++
........................+++
e is 65537 (0x10001)
[root@master userrbac]# 'ls'
'wzj.key'
② 使用我们刚刚创建的私钥创建一个证书签名请求文件wzj.csr
要注意需要确保在'-subj参数'中指定'用户名和组'-->'CN表示用户名,O表示组'
[root@master userrbac]# openssl req -new -key wzj.key -out wzj.csr -subj "/CN=wzj/O=home"
[root@master userrbac]# ls
'wzj.csr' wzj.key
③ ca.crt
和 ca.key
两个文件来批准上面的证书请求,生成最终的证书文件
[root@master userrbac] openssl x509 -req '-in wzj.csr' -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial '-out wzj.crt' -days 500
Signature ok
subject=/CN=wzj/O=home
Getting CA Private Key
[root@master userrbac]# ls
'wzj.crt' wzj.csr wzj.key
④ 使用刚刚创建的证书文件和私钥文件在集群中创建新的凭证和上下文(Context)
'证书-->crt'和'私钥-->key'文件
[root@master userrbac]# kubectl config set-credentials wzj --client-certificate=wzj.crt --client-key=wzj.key --embed-certs=true
User "wzj" set -->'提示信息'
把证书嵌入到yaml文件中-->'--embed-certs=true'
⑤ 创建上下文
我们可以看到一个'用户 wzj' 创建了,然后为这个用户'设置新的 Context',我们这里'指定特定'的一个 namespace
+++++++++++++++ '分割线' +++++++++++++++
[root@master userrbac]# kubectl config set-context wzj-context --cluster=kubernetes --namespace=kube-system --user=wzj
Context "wzj-context" created.
备注: 为'哪个用户-->user'设置上下文,上下文的名称'wzj-context',针对哪个集群'kubernetes'的命令空间'namespace'
注意: 'wzj-context'这个上下文关联的是'wzj'这个用户
⑥ 测试
重点: ""表示是'核心组-->core'、资源'pods'、权限'list'
注意看'日志报错'
⑦ 创建角色
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: wzj-role
namespace: kube-system
rules:
- apiGroups: [""] -->'操作资源所在的用户组;一个资源可能有多个用户组' -->'空串表示core'
resources: ["pods"]
verbs: ["list"]
+++++++++++++++ '分割线'
创建的role,和用户'wzj'没有任何关系,所以需要把'user和角色'绑定
⑧ 角色绑定
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: wzj-rolebinding
namespace: kube-system
subjects:
- kind: User -->'三种类型中的一种'
name: wzj -->'用户的名称'
apiGroup: ""
roleRef:
kind: Role
name: wzj-role
apiGroup: rbac.authorization.k8s.io 'Role的'
⑨ 运行
⑩ 测试
context'已经包含namespace' -->如果不指定'ns',默认就是kube-system
user专门是给'kubectl工具'使用的
多个的形式