Kubernetes Security with Authentication Mechanisms

Kubernetes Security with Authentication Mechanisms

🗼Introduction

In Kubernetes, the kube-apiserver serves as the core component that handles all operations within the cluster. Users and other components interact with the Kubernetes cluster through this API server, typically using the kubectl command-line utility. As such, securing access to the kube-apiserver is paramount for maintaining a secure and well-functioning Kubernetes environment.

🗼Authentication in Kubernetes

Authentication determines who can access the kube-apiserver. Kubernetes supports several authentication methods, including:

  • UserID and Password

  • Certificates

  • External authentication providers (such as LDAP)

  • Service Accounts

Understanding Permissions: What Can They Do?

Once authenticated, the authorization mechanisms determine what actions the users or service accounts can perform. Kubernetes supports multiple authorization strategies:

  • RBAC (Role-Based Access Control): Controls access based on the roles assigned to users.

  • ABAC (Attribute-Based Access Control): Uses attributes of users and resources to determine access.

  • Node Authorization: Authorizes kubelets based on the attributes of the node they are running on.

  • Webhook: Uses a remote service to authorize requests.

🗼Kube-apiserver Authentication Mechanism

The kube-apiserver offers flexibility in setting up different authentication mechanisms, allowing administrators to choose the most suitable method for their environment.

🗼Setting Up Basic Authentication in Kubernetes

Basic authentication can be a straightforward method to secure the kube-apiserver, particularly in smaller or test environments. Below are the steps to set up basic authentication.

Step 1: Create User Details File

Create a file with user details locally at /tmp/users/user-details.csv. The file should contain entries in the following format: password,username,userID.

Example:

Copy codepassword123,user1,u0001
password123,user2,u0002
password123,user3,u0003
password123,user4,u0004
password123,user5,u0005

Step 2: Edit the Kube-apiserver Static Pod Configuration

Locate and edit the kube-apiserver static pod configuration file. This file is typically found at /etc/kubernetes/manifests/kube-apiserver.yaml.

Step 3: Modify Kube-apiserver Startup Options

Add the --basic-auth-file parameter to the kube-apiserver startup options within the configuration file:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  name: kube-apiserver
  namespace: kube-system
spec:
  containers:
  - command:
    - kube-apiserver
    - --authorization-mode=Node,RBAC
    - --basic-auth-file=/tmp/users/user-details.csv

Step 4: Add Volume for User Details File

Add a volume to the kube-apiserver pod configuration to mount the user details file:

volumes:
- hostPath:
    path: /tmp/users
    type: DirectoryOrCreate
  name: usr-details

Step 5: Create Roles and RoleBindings

Define the necessary roles and role bindings to grant specific permissions to the users.

Example Role:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

Example RoleBinding:

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-pods
  namespace: default
subjects:
- kind: User
  name: user1
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

Authenticating to the Kube-apiserver

With the user and role configurations in place, you can now authenticate and interact with the kube-apiserver using the user's credentials. For example, you can use curl to access the API:

curl -v -k https://localhost:6443/api/v1/pods -u "user1:password123"

🗼Conclusion

Implementing authentication mechanisms such as basic authentication, while suitable for certain scenarios, is just the starting point. Combining it with robust authorization strategies like RBAC enhances security by ensuring users can only perform actions they're authorized to do. As your Kubernetes environment grows, considering more advanced authentication methods and continuous monitoring will be key to maintaining a secure and efficient cluster.

Did you find this article valuable?

Support Ashutosh Mahajan's blog by becoming a sponsor. Any amount is appreciated!