One of the enormous advantages of Kubernetes is the delegation of permission to perform task that would ordinarily require administrative level access like root on Linux.
Now that we know who our users are, we are able to set up access controls.
Like everything in Kubernetes, authorization is pluggable and supports many different possible implementations. In a future post, we will take a look at a non-native implementation of authorization, but for now, let’s look at the Kubernetes native one.
RBAC
Most of the content of this post is a reiteration of the excellent RBAC documentation available on the Kubernetes web site.
Lets start with what RBAC is: Role Based Access Control. What that means is simply that users (and service accounts) are bound to roles. Roles specify permissions to resources.
Types of role
There are two kinds of role with different scopes; ClusterRole and Role.
A ClusterRole specifies permissions to either namespace- or cluster-scoped resources, such as Pods, and Namespaces. A Role can only specify permission to namespace-scoped resources, such as Pods and Servcies.
Here is an example ClusterRole:
--- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: # "namespace" omitted since ClusterRoles are not namespaced name: cluster-admin labels: beyondthekube.com/bootstrapping: rbac-defaults rules: - apiGroups: - '*' resources: - '*' verbs: - '*' - nonResourceURLs: - '*' verbs: - '*'
And an example Role:
--- kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: beyond name: pod-patcher labels: beyondthekube.com/bootstrapping: rbac-defaults rules: - apiGroups: - '' resources: - pods verbs: - patch
Once Roles have been defined we need to create another resource a RoleBinding for Roles or ClusterRoleBinding for ClusterRoles. This is the mechanism by which we associate ‘bind’ the users to the roles.
Example ClusterRoleBinding:
--- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: cluster-admin subjects: - kind: User name: bob@beyondthekube.com apiGroup: rbac.authorization.k8s.io - kind: User name: anna@beyondthekube.com apiGroup: rbac.authorization.k8s.io - kind: Group name: those-other-admins.beyondthekube.com apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: cluster-admin apiGroup: rbac.authorization.k8s.io
Example RoleBinding:
--- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: pod-patcher subjects: - kind: User name: bob@beyondthekube.com apiGroup: rbac.authorization.k8s.io - kind: User name: anna@beyondthekube.com apiGroup: rbac.authorization.k8s.io - kind: Group name: those-other-patchers.beyondthekube.com apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: pod-patcher apiGroup: rbac.authorization.k8s.io
Role aggregations
Role aggregations are a fancy way of including many role definitions into a ‘meta’ role. These allow many users to specify permissions in various roles, then union all of the permissions together in an aggregation. There are two parts to this; one is specifying the aggregation role with a selector, and the other is adding the label(s) to the roles you want
kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: beyondthekube-admin aggregationRule: clusterRoleSelectors: - matchLabels: beyondthekube.com/rbac-aggregations: "admin" rules: []
kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: namespace-admin labels: rbeyondthekube.com/rbac-aggregations: "admin" rules: - apiGroups: - "" resources: - "*" verbs: - "get" - "list" - "watch" - "update" - "create" - "delete"
Conclusion
RBAC provides an extremely rich permission definition framework that can itself be delegated to other administrators, and augmented via resources provided via helm charts etc.
There are issues with RBAC in terms of multi-cluster administration and the fact that it does not integrate well with services like LDAP and ActiveDirectory that provide groups. In a coming post, I will demonstrate ways to improve that, both with and without standard RBAC.