Risks
Protecting Important Directories in a Kubernetes Cluster
The Kubeconfig, Kubeletconfig, and Kubeadmconfig files contain crucial information about the Kubernetes cluster. Unauthorized access or modification of these configurations can severely impact the cluster's operation, potentially paralyzing it.
Key Directories Containing Critical Information
By default, the following directories contain important information about the cluster:
- /etc/kubernetes/
- /var/lib/kubelet/
- /etc/sysconfig/kubelet
- $HOME/.kube/config.yaml
These directories should be highly restricted as they are only relevant for troubleshooting by administrators.
Consequences of Unauthorized Access or Modification
Cluster Paralysis:
Modifying configuration files can disrupt the entire Kubernetes control plane. Changes to Kubeadmconfig can affect cluster initialization, upgrades, and version compatibility.
Service Disruption:
Unauthorized modifications to Kubeletconfig can impact the operation of the Kubelet, which is responsible for managing the lifecycle of pods on nodes. This can lead to node failures and service disruptions.
Security Breaches:
Accessing Kubeconfig can provide unauthorized users with cluster admin credentials, leading to potential security breaches. This can result in unauthorized deployments, data theft, and loss of control over the cluster.
Configuration Leakage:
Exposure of these configuration files can reveal sensitive cluster information, including cluster endpoints, certificates, and API server details. This information can be exploited to perform targeted attacks.
Stricter Access Controls
To mitigate the risks associated with unauthorized access, it is crucial to enforce strict access controls:
Restrict Directory Access:
Ensure that only cluster administrators have read and write permissions to the following directories:
- chmod -R 700 /etc/kubernetes/
- chmod -R 700 /var/lib/kubelet/
- chmod -R 700 /etc/sysconfig/kubelet
- chmod 700 $HOME/.kube/config.yaml
Limit systemctl Access:
The systemctl command can reveal configuration paths using systemctl cat kubelet. Limit access to systemctl so that only cluster administrators can execute it:
- chmod 700 /bin/systemctl
Restrict ConfigMap Access:
Configuration files are often mounted in pods via ConfigMaps in the kube-system namespace. Restrict access to these ConfigMaps:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: kube-system
name: configmap-reader
rules:
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["get", "list", "watch"]
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
namespace: kube-system
name: configmap-reader-binding
subjects:
- kind: User
name: <admin-username>
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: configmap-reader
apiGroup: rbac.authorization.k8s.io
Use Role-Based Access Control (RBAC):
Implement RBAC to manage access to resources based on user roles. Ensure that non-admin users have minimal permissions:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: view-only
rules:
- apiGroups: [""]
resources: ["pods", "services"]
verbs: ["get", "list", "watch"]
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: view-only-binding
subjects:
- kind: User
name: <non-admin-username>
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: view-only
apiGroup: rbac.authorization.k8s.io