Understanding Kubernetes Authorization Mechanisms and Modes

Kubernetes, a robust container orchestration platform, provides various authorization mechanisms to manage and control access to the cluster's resources. In this blog, we will explore different authorization modes, their uses, and how to configure and manage them. We will also discuss common problems encountered and their solutions.

🗼Authorization Mechanisms in Kubernetes

  1. Node

    • Description: Any request coming from a system node group is authorized by the node authorizer.

    • Problem: Ensuring only legitimate system nodes can perform certain actions.

    • Solution: Use the node authorization mode to restrict access to node-specific actions.

  2. Attribute-Based Access Control (ABAC)

    • Description: Associates a user or a group of users with a set of permissions. Security policies are manually added to a policy file and the kube-apiserver needs to be restarted for changes to take effect.

    • Problem: ABAC is difficult to manage due to the manual updates required and the need to restart the kube-apiserver.

    • Solution: Consider using Role-Based Access Control (RBAC) for easier management.

  3. Role-Based Access Control (RBAC)

    • Description: Simplifies management by defining roles with permissions and associating users or groups with these roles.

    • Example: Create a role for developers with specific permissions and associate all developers to that role.

    • Problem: Understanding and setting up roles and role bindings correctly.

    • Solution: Use kubectl commands to create roles and role bindings, and verify permissions using kubectl auth can-i.

  4. Webhook

    • Description: Externalizes authorization management through third-party tools like Open Policy Agent (OPA).

    • Problem: Ensuring the external service is always available and properly integrated.

    • Solution: Regularly test the integration and ensure high availability for the external service.

  5. AlwaysAllow

    • Description: Allows all requests without performing any authorization checks.

    • Problem: Not secure for production environments.

    • Solution: Use more secure authorization modes like RBAC or Webhook in production.

  6. AlwaysDeny

    • Description: Denies all requests.

    • Problem: Useful only in specific scenarios like maintenance windows.

    • Solution: Use it sparingly and ensure proper communication with users when enabled.

🗼Managing Roles and Role Bindings with RBAC

Creating a Role:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: developer
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]
kubectl create -f rbac-role.yaml

Binding a Role to a User:

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: developer-binding
  namespace: default
subjects:
- kind: User
  name: dev-user
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: developer
  apiGroup: rbac.authorization.k8s.io
kubectl create -f rolebinding.yaml

Checking User Permissions:

kubectl auth can-i create deployment

Checking Other User Permissions:

kubectl auth can-i create deployment --as dev-user

🗼Cluster Roles and Role Binding

Cluster roles can be created using a manifest file and can be configured to apply across namespaces or within specific namespaces.

Example: Creating a Cluster Role

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cluster-admin
rules:
- apiGroups: [""]
  resources: ["pods", "services"]
  verbs: ["get", "list", "watch", "create", "delete"]
kubectl create -f cluster-role.yaml

Binding a Cluster Role:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: cluster-admin-binding
subjects:
- kind: User
  name: cluster-admin-user
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
kubectl create -f cluster-rolebinding.yaml

🗼Conclusion

A common problem in Kubernetes authorization is the difficulty in managing permissions with Attribute-Based Access Control (ABAC), which requires manual updates to a policy file and restarting the kube-apiserver for changes to take effect, leading to errors, inconsistencies, and downtime. The solution is to transition to Role-Based Access Control (RBAC), which simplifies management by defining reusable roles with specific permissions and associating them with users or groups dynamically without requiring a server restart. This approach not only reduces operational overhead but also scales better as the number of users and roles increases, ensuring efficient and secure access control in large clusters.

1
Subscribe to my newsletter

Read articles from Ashutosh Mahajan directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Ashutosh Mahajan
Ashutosh Mahajan

Proficient in variety of DevOps technologies, including AWS, Linux, Shell Scripting, Python, Docker, Terraform, Jenkins and Computer Networking. They have strong ability to troubleshoot and resolve issues and are consistently motivated to expand their knowledge and skills through expantion of new technologies.