Controller Manager with invalid --root-ca-file argument
ID |
kube_controller_manager_root_ca_file |
Severity |
high |
Vendor |
Kubernetes |
Resource |
kube-controller-manager |
Tags |
reachable |
Description
The Kubernetes controller manager is a daemon that embeds the core control loops shipped with Kubernetes.
Connections between pods and the API server should be protected by utilizing transport encryption protocols, such as TLS. Not using it could lead to man-in-the-middle attacks.
Thus, the --root-ca-file argument must be used to pass the trusted bundle into pods so that they can verify TLS connections to the API server.
Examples
apiVersion: v1
kind: Pod
metadata:
name: bad
spec:
containers:
- command:
- kube-controller-manager
- --root-ca-file=private.txt (1)
image: gcr.io/google_containers/kube-apiserver-amd64:v1.9.0
name: bad-container
livenessProbe:
failureThreshold: 8
httpGet:
host: 127.0.0.1
path: /health
port: 6443
scheme: HTTPS
initialDelaySeconds: 15
timeoutSeconds: 15
resources:
requests:
cpu: 250m
volumeMounts:
- mountPath: /etc/kubernetes/
name: k8s
readOnly: true
- mountPath: /etc/ssl/certs
name: certs
- mountPath: /etc/pki
name: pki
hostNetwork: true
volumes:
- hostPath:
path: /etc/kubernetes
name: k8s
- hostPath:
path: /etc/ssl/certs
name: certs
- hostPath:
path: /etc/pki
name: pki
| 1 | Bad --root-ca-file command argument means pods do not verify the API server’s serving certificate before establishing connections. |
Mitigation / Fix
apiVersion: v1
kind: Pod
metadata:
name: good
spec:
containers:
- command:
- kube-controller-manager
- --root-ca-file=private.pem (1)
image: gcr.io/google_containers/kube-apiserver-amd64:v1.9.0
name: good-container
livenessProbe:
failureThreshold: 8
httpGet:
host: 127.0.0.1
path: /health
port: 6443
scheme: HTTPS
initialDelaySeconds: 15
timeoutSeconds: 15
resources:
requests:
cpu: 250m
volumeMounts:
- mountPath: /etc/kubernetes/
name: k8s
readOnly: true
- mountPath: /etc/ssl/certs
name: certs
- mountPath: /etc/pki
name: pki
hostNetwork: true
volumes:
- hostPath:
path: /etc/kubernetes
name: k8s
- hostPath:
path: /etc/ssl/certs
name: certs
- hostPath:
path: /etc/pki
name: pki
| 1 | Command argument --bind-address set to 127.0.0.1 means Controller Manager is not bind to a non-loopback insecure address. |