API Server Pod Specification Permissions Are Restrictive
More Info:
Ensure that the API server pod specification file has permissions of 644 or more restrictive.
Risk Level
Medium
Address
Security
Compliance Standards
- CIS Kubernetes
Triage and Remediation
- Remediation
Remediation
Manual Steps
-
On every control plane node, check the current permissions of the API server pod specification file:
stat -c permissions=%a /etc/kubernetes/manifests/kube-apiserver.yaml -
If the reported permissions are more permissive than 644 (for example, 664, 666, 744, 755, 777), restrict them with:
chmod 644 /etc/kubernetes/manifests/kube-apiserver.yaml -
(Optional) Confirm file ownership is appropriate (typically root:root) and adjust if needed:
stat -c '%U:%G' /etc/kubernetes/manifests/kube-apiserver.yamlchown root:root /etc/kubernetes/manifests/kube-apiserver.yaml -
Be aware: editing this static pod manifest may trigger a restart of the kube-apiserver container on that control plane node as the kubelet re-reads the manifest directory.
-
Re-verify on every control plane node that the permissions are now compliant:
stat -c permissions=%a /etc/kubernetes/manifests/kube-apiserver.yamlThe output should show:
permissions=644
Using kubectl
kubectl cannot change file permissions on control plane nodes, so this finding cannot be fixed via the Kubernetes API. The permissions must be updated directly on each control plane node’s filesystem (for example, with chmod on /etc/kubernetes/manifests/kube-apiserver.yaml); see the Manual Steps section for how to do this.
Automation
#!/usr/bin/env bash
# Fix CISKubernetes 1.1.1:
# Ensure /etc/kubernetes/manifests/kube-apiserver.yaml has permissions 644 or more restrictive.
# Run on every control plane node.
set -euo pipefail
APISERVER_MANIFEST="/etc/kubernetes/manifests/kube-apiserver.yaml"
TARGET_MODE="644"
echo "=== CISKubernetes 1.1.1: Fix API server pod spec permissions ==="
if [ ! -e "$APISERVER_MANIFEST" ]; then
echo "INFO: $APISERVER_MANIFEST does not exist on this node. Nothing to do."
exit 0
fi
current_mode="$(stat -c '%a' "$APISERVER_MANIFEST")"
echo "Current permissions: $current_mode"
# Normalize permission to be no more permissive than 644.
# If already 644 or more restrictive (e.g. 640, 600), leave as-is.
if [ "$current_mode" -gt "$TARGET_MODE" ]; then
echo "Updating permissions to $TARGET_MODE on $APISERVER_MANIFEST"
chmod "$TARGET_MODE" "$APISERVER_MANIFEST"
else
echo "Permissions are already $current_mode (644 or more restrictive). No change needed."
fi
# Verification
echo "Verifying permissions..."
verified_mode="$(stat -c '%a' "$APISERVER_MANIFEST")"
echo "Verified permissions: $verified_mode"
if [ "$verified_mode" -le "$TARGET_MODE" ]; then
echo "SUCCESS: $APISERVER_MANIFEST permissions are $verified_mode (644 or more restrictive)."
exit 0
else
echo "ERROR: $APISERVER_MANIFEST permissions are $verified_mode (not 644 or more restrictive)." >&2
exit 1
fi