Skip to main content

Etcd Data Directory Permissions Should Be 700 Or More

More Info:

Verifies that the etcd data directory has permissions of 700 or more restrictive. The etcd datastore holds all cluster state including secrets and must be tightly protected.

Risk Level

Medium

Address

Security

Compliance Standards

  • CIS Kubernetes

Triage and Remediation

Remediation

Manual Steps
  1. On every control plane node, identify the etcd data directory path:

    ps -ef | grep [e]tcd | grep -- --data-dir

    Note the value of the --data-dir argument (for example /var/lib/etcd or /var/lib/etcd/default.etcd). If no --data-dir is shown, use /var/lib/etcd/default.etcd.

  2. On the same control plane node, confirm the directory exists (replace the path if different):

    ls -ld /var/lib/etcd

    or, if identified differently:

    ls -ld /var/lib/etcd/default.etcd
  3. On the same control plane node, set the directory permissions to 700 (replace with the actual data directory if different):

    chmod 700 /var/lib/etcd

    or:

    chmod 700 /var/lib/etcd/default.etcd
  4. On the same control plane node, ensure the directory is owned by the etcd user and group (adjust user/group if your deployment uses a different account):

    chown etcd:etcd /var/lib/etcd

    or:

    chown etcd:etcd /var/lib/etcd/default.etcd
  5. Repeat steps 1–4 on every control plane node in the cluster.

  6. Verification (on every control plane node): re-run the benchmark’s audit logic to confirm permissions are 700 or more restrictive:

    DATA_DIR=''
    for d in $(ps -ef | grep etcd | grep -- --data-dir | sed 's%.*data-dir[= ]\([^ ]*\).*%\1%'); do
    if test -d "$d"; then DATA_DIR="$d"; fi
    done
    if ! test -d "$DATA_DIR"; then DATA_DIR=/var/lib/etcd/default.etcd; fi
    stat -c permissions=%a "$DATA_DIR"

    Ensure the output shows permissions=700 (or a more restrictive value such as 600).

Using kubectl

kubectl cannot change file system permissions on control plane nodes, including the etcd data directory at /var/lib/etcd. This finding must be remediated directly on every control plane node via host-level configuration; see the Manual Steps section for how to apply and verify the fix.

Automation
#!/usr/bin/env bash
#
# Remediation for:
# CISKubernetes 1.1.11 - Ensure that the etcd data directory permissions are set to 700 or more restrictive
#
# Usage: run as root on every control plane node
# sudo bash fix-etcd-data-dir-perms.sh
#
set -euo pipefail

echo "[INFO] Detecting etcd data directory..."

DATA_DIR=""

# Find etcd --data-dir from running processes
while read -r line; do
dir="$(printf '%s\n' "$line" | sed 's%.*data-dir[= ]\([^ ]*\).*%\1%')"
if [ -n "$dir" ] && [ -d "$dir" ]; then
DATA_DIR="$dir"
fi
done < <(ps -ef | grep etcd | grep -- --data-dir || true)

# Fallback to default if not found
if [ -z "$DATA_DIR" ]; then
DATA_DIR="/var/lib/etcd/default.etcd"
fi

if [ ! -d "$DATA_DIR" ]; then
echo "[ERROR] etcd data directory not found: $DATA_DIR"
echo " Confirm the etcd --data-dir argument or create the directory if appropriate."
exit 1
fi

echo "[INFO] etcd data directory detected: $DATA_DIR"

# Show existing permissions
CURRENT_PERMS="$(stat -c '%a' "$DATA_DIR")"
echo "[INFO] Current permissions on $DATA_DIR: $CURRENT_PERMS"

# Apply restrictive permissions (700) idempotently
echo "[INFO] Setting permissions to 700 on $DATA_DIR (idempotent)..."
chmod 700 "$DATA_DIR"

# Verification
NEW_PERMS="$(stat -c '%a' "$DATA_DIR")"
echo "[INFO] New permissions on $DATA_DIR: $NEW_PERMS"

if [ "$NEW_PERMS" -le 700 ]; then
echo "[SUCCESS] etcd data directory permissions are 700 or more restrictive."
exit 0
else
echo "[FAIL] etcd data directory permissions are NOT 700 or more restrictive."
exit 2
fi