RBAC(基于角色的访问控制),RBAC使用rbac.authorization.k8s.io API Group 来实现授权决策,允许管理员通过 Kubernetes API 动态配置策略。

RBAC API 对象

Kubernetes有一个很基本的特性就是它的所有资源对象都是模型化的 API 对象,允许执行 CRUD增、删、改、查操作,比如下面的这下资源:

  • Pods
  • ConfigMaps
  • Deployments
  • Nodes
  • Secrets
  • Namespaces

上面这些资源对象的可能存在的操作有:

  • create
  • get
  • delete
  • list
  • update
  • edit
  • watch
  • exec

在更上层,这些资源和 API Group 进行关联,比如Pods属于 Core API Group,而Deployements属于 apps API Group,要在Kubernetes中进行RBAC的管理,除了上面的这些资源和操作以外,我们还需要另外的一些对象:

  • Rule:规则,规则是一组属于不同 API Group 资源上的一组操作的集合
  • Role 和 ClusterRole:角色和集群角色,这两个对象都包含上面的 Rules 元素,二者的区别在于,在 Role 中,定义的规则只适用于单个命名空间,也就是和 namespace 关联的,而 ClusterRole 是集群范围内的,因此定义的规则不受命名空间的约束。另外 Role 和 ClusterRole 在Kubernetes中都被定义为集群内部的 API 资源
  • Subject:主题,对应在集群中尝试操作的对象,集群中定义了3种类型的主题资源:
    • User Account:用户,这是有外部独立服务进行管理的,管理员进行私钥的分配,用户可以使用 KeyStone或者 Goolge 帐号,甚至一个用户名和密码的文件列表也可以。对于用户的管理集群内部没有一个关联的资源对象,所以用户不能通过集群内部的 API 来进行管理
    • Group:组,这是用来关联多个账户的,集群中有一些默认创建的组,比如cluster-admin
    • Service Account:服务帐号,通过Kubernetes API 来管理的一些用户帐号,和 namespace 进行关联的,适用于集群内部运行的应用程序,需要通过 API 来完成权限认证,所以在集群内部进行权限操作,都需要使用到 ServiceAccount
  • RoleBinding 和 ClusterRoleBinding:角色绑定和集群角色绑定,简单来说就是把声明的 Subject 和我们的 Role 进行绑定的过程(给某个用户绑定上操作的权限),二者的区别也是作用范围的区别:RoleBinding 只会影响到当前 namespace 下面的资源操作权限,而 ClusterRoleBinding 会影响到所有的 namespace。

创建一个只能访问某个 namespace 的用户

创建一个it组的wakamizu账户,只能访问kube-system

创建用户凭证

openssl genrsa -out wakamizu.key 2048 #创建私钥

openssl req -new -key wakamizu.key -out wakamizu.csr -subj "/CN=wakamizu/O=it" #创建证书签名请求文件,CN表示用户名,O表示组

openssl x509 -req -in wakamizu.csr -CA /etc/kubernetes/pki/ca.crt -CAcreateserial -out wakamizu.crt -days 500 #生成证书,有效期为500day

kubectl config set-credentials wakamizu --client-certificate=wakamizu.crt --client-key=wakamizu.key #创建新凭证

kubectl config set-context wakamizu-context --cluster=kubernetes --namespace=kube-system --user=wakamizu #创建上下文

创建角色

创建一个允许用户操作 Deployment、Pod、ReplicaSets 的角色

vim wakamizu-role.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: wakamizu-role
namespace: kube-system
rules:
- apiGroups: ["", "extensions", "apps"]
resources: ["deployments", "replicasets", "pods"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

kubectl create -f wakamizu-role.yaml

角色权限绑定

vim wakamizu-rolebinding.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: wakamizu-rolebinding
namespace: kube-system
subjects:
- kind: User
name: wakamizu
apiGroup: ""
roleRef:
kind: Role
name: wakamizu-role
apiGroup: ""

kubectl create -f wakamizu-rolebinding.yaml

测试

kubectl get pods --context=wakamizu-context --namespace=kube-system
kubectl get pods --context=wakamizu-context --namespace=default

创建一个只能访问某个 namespace 的ServiceAccount

创建一个集群内部的用户只能操作 kube-system 这个命名空间下面的 pods 和 deployments

创建ServiceAccount对象

kubectl create sa wakamizu-sa -n kube-system

创建角色

vim wakamizu-sa-role.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: wakamizu-sa-role
namespace: kube-system
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

kubectl create -f wakamizu-sa-role.yaml

角色权限绑定

vim wakamizu-sa-rolebinding.yaml

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: wakamizu-sa-rolebinding
namespace: kube-system
subjects:
- kind: ServiceAccount
name: wakamizu-sa
namespace: kube-system
roleRef:
kind: Role
name: wakamizu-sa-role
apiGroup: rbac.authorization.k8s.io

kubectl create -f wakamizu-sa-rolebinding.yaml

验证

kubectl get secret -n kube-system |grep "wakamizu-sa"

复制secret名字

kubectl get secret wakamizu-sa-token-rp7bq -o jsonpath={.data.token} -n kube-system |base64 -d #获取口令

前往dashboard登录,只能访问kube-system名称空间,其他会报错

创建一个可以访问所有 namespace 的ServiceAccount

如果创建一个ServiceAccount,需要他操作的权限作用于所有的 namespace,就需要使用到 ClusterRole 和 ClusterRoleBinding 这两种资源对象

创建ServiceAccount对象

vim wakamizu-sa2.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
name: wakamizu-sa2
namespace: kube-system

kubectl create -f wakamizu-sa2.yaml

创建 ClusterRoleBinding对象

vim wakamizu-clusterolebinding.yaml

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: wakamizu-sa2-clusterrolebinding
subjects:
- kind: ServiceAccount
name: wakamizu-sa2
namespace: kube-system
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io

kubectl create -f -clusterolebinding.yaml

验证

kubectl get secret -n kube-system |grep "wakamizu-sa2"

复制secret名字

kubectl get secret wakamizu-sa2-token-w5sk5 -o jsonpath={.data.token} -n kube-system |base64 -d #获取token

前往dashboard登录,可访问所有namespace