RBAC权限控制

TOC

RBAC入门

RBAC开启

对于资源对象的操作都是通过 APIServer 进行的,RBAC可以知道我们的请求是否合法。需要在kube-apiserver中添加参数–authorization-mode=RBAC

# master主节点
cat /etc/kubernetes/manifests/kube-apiserver.yaml
------------------------------------------------
command:
  - kube-apiserver
  ...
  - --authorization-mode=Node,RBAC
  ...

注意:默认是已经添加了的,二进制的方式搭建的集群,添加这个参数过后,记得要重启服务

RBAC基本概念

API对象了解
对比yaml中的api声明可以看出不同api的路径,支持多个版本,比如:/api/v1或者/apis/batch
api对象的级别稳定性和支持:

  • Alpha级别:比如v1alpha1,默认被禁用,可能随时删除功能特点
  • Beta级别:比如v2beta1,默认启用,表示已经测试得比较完善,但是对象的语义可能会在随后的版本中以不兼容的方式更改
  • 稳定级别:比如v1,很稳定,后续版本也会出现

RBAC资源对象和操作权限
在RBAC授权中,Kubernetes的所有资源对象都是模型化的API对象,我们可以对这些资源对象进行(Create、Read、Update、Delete)等操作,也就是我们在数据库中的增、删、改、查等操作。

资源对象: Pods、ConfigMaps、Deployments、Nodes、Secrets、Namespaces等

操作权限: get、list、create、delete、update、edit、watch、exec、patch等

RBAC使用

RBAC配置步骤:
1.创建用户,用户分为:User(通过管理员进行私钥分配)、Group(组,关联多个用户,群集会有一些默认的组,比如cluster-admin)、ServiceAccount(服务账号,通过API来管理一些用户账号,和namespace进行关联,适用于群集内部运行的应用程序)。
2.制定Role规则,创建一个角色,也就是制定一些规则来规定能够访问的资源以及拥有哪些操作权限的角色。
3.对于角色进行绑定,也就是给自己创建的用户绑定到自己制定的角色,这样该用户就能拥有该角色拥有相对的资源,以及操作的权限了。

1.创建普通用户进行RBAC授权

Kubernetes没有User Account的API对象,但是我们也可以通过自己创建私钥进行认证创建用户,这里我们需要使用openssl工具,或者也可以使用cfssl工具。
我来先来创建我们用户的证书文件,如下所示:

# 创建私钥
openssl genrsa -out test.key 2048
# 创建证书签名请求文件
openssl req -new -key test.key -out test.csr -subj "/CN=test/O=test"
# 使用k8s集群的CA证书来进行签名生成证书文件
openssl x509 -req -in test.csr -out test.crt -CA ca.crt -CAkey ca.key -CAcreateserial -days 365

注意:一般kubeadm创建的集群CA证书文件默认在/etc/kubernetes/pki/目录下,二进制安装方式在你开始指定的CA存放目录下。

然后我们使用刚刚创建好的证书文件进行用户的创建和配置部分,如下所示:

# 创建新的凭证
kubectl config set-credentials test --client-certificate=test.crt --client-key=test.key
# 为新创建好的用户设置一个新的Context上下文
kubectl config set-context test-context --cluster=kubernetes --namespace=default --user=test

然后我们使用创建好的上下文进行访问资源,如下所示:

kubectl get pods --context=test-context
# 会出现以下报错
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:default:test-sa" cannot list resource "pods" in API group "" in the namespace "default"

出现上面的报错是因为我们没有对该用户进行授权,设置角色规则的的yaml文件如下:

# test-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: test-role
  namespace: default
rules:
  - apiGroups: ['', 'apps']
    resources: ['deployments', 'replicasets', 'pods']
    verbs: ['get', 'list', 'watch', 'create', 'update', 'patch', 'delete']

绑定角色的yaml文件如下:

# test-rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: test-rolebinding
  namespace: default
subjects:
  - kind: ServiceAccount
    name: test
    namespace: default
roleRef:
  kind: Role
  name: test-role
  apiGroup: rbac.authorization.k8s.io

我们还是用apply进行授权和绑定:

kubectl apply -f test-role.yaml
kubectl apply -f test-rolebinding.yaml

然后我们进行访问就能正常访问了,一旦访问没有授权的资源和进行操作还是会报错。
我们可以根据上面的权限分别访问default命名空间的pods和nodes资源进行验证,如下所示:

kubectl get pods --context=test-context
kubectl get nodes --context=test-context
# 访问node资源时会报以下错误
Error from server (Forbidden): nodes is forbidden: User "system:serviceaccount:default:test" cannot list resource "nodes" in API group "" at the cluster scope

2.创建sa用户进行RBAC授权

我们先创建sa用户,创建sa用户的yaml文件如下:

# test-serviceAccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: test-sa
  namespace: default

进行apply创建sa用户

kubectl apply -f test-serviceAccount.yaml

我们需要获取刚刚创建的sa用户的Token,创建sa用户,会默认创建一个名为上面名字(我的是test-sa)开头secrets资源,我们可以用以下命令查看:

kubectl get secrets test-sa-token-9dv6k -o jsonpath={.data.token} |base64 -d
# 下面会显示出token值
eyJhbGciOiJSUz......

使用这个token设置访问k8s资源的凭证(=后面配置上查询出来的凭证即可):

kubectl config set-credentials test-sa --token='eyJhbGciOiJSUz......'

然后我们为新的用户设置上下文,并使用这个上下文查看资源

kubectl config set-context test-context --cluster=kubernetes --namespace=default --user=test-sa
kubectl get pods --context=test-context
# 会出现以下报错
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:default:test-sa" cannot list resource "pods" in API group "" in the namespace "default"

出现上面的报错是因为我们没有对该用户进行授权,设置角色规则的的yaml文件如下:

# test-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: test-sa-role
  namespace: default
rules:
  - apiGroups: ['', 'apps']
    resources: ['deployments', 'replicasets', 'pods']
    verbs: ['get', 'list', 'watch', 'create', 'update', 'patch', 'delete']

绑定角色的yaml文件如下:

# test-rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: test-sa-rolebinding
  namespace: default
subjects:
  - kind: ServiceAccount
    name: test-sa
    namespace: default
roleRef:
  kind: Role
  name: test-sa-role
  apiGroup: rbac.authorization.k8s.io

我们还是用apply进行授权和绑定:

kubectl apply -f test-role.yaml
kubectl apply -f test-rolebinding.yaml

然后我们进行访问就能正常访问了,一旦访问没有授权的资源和进行操作还是会报错。
我们可以根据上面的权限分别访问default命名空间的pods和nodes资源进行验证,如下所示:

kubectl get pods --context=test-context
kubectl get nodes --context=test-context
# 访问node资源时会报以下错误
Error from server (Forbidden): nodes is forbidden: User "system:serviceaccount:default:test-sa" cannot list resource "nodes" in API group "" at the cluster scope