Back to Checks
Prowlerprowler-provider-kubernetes
Etcd pod has client certificate authentication enabled (--client-cert-auth=true)
etcd_client_cert_auth
Service: etcdSeverity: high
OfficialBuilt-inVerified
Categories:cluster-securityidentity-accessencryption
Resource Type:Pod
Etcd is configured to require TLS client certificate authentication when the etcd container includes --client-cert-auth, so client access is validated with trusted certificates.
Risk
Without mTLS client auth, any reachable client can query or mutate etcd:
- Confidentiality: exposure of Secrets and cluster metadata
- Integrity: tampering with RBAC, pods, and configs
- Availability: destructive writes can disrupt the control plane
Run this check with Prowler
Run in Prowler CloudRun
prowler kubernetes --checks etcd_client_cert_authRecommendation
Enforce mutual TLS for etcd clients by requiring validated certificates (--client-cert-auth=true) issued by a trusted CA.
Restrict network access to etcd to API servers, rotate keys regularly, and apply least privilege and separation of duties for certificate management.
Remediation
Terraform
# Enable client certificate authentication on etcd
resource "kubernetes_pod" "<example_resource_name>" {
metadata {
name = "<example_resource_name>"
namespace = "kube-system"
}
spec {
container {
name = "etcd"
image = "gcr.io/etcd-development/etcd:v3.5.13"
command = [
"etcd",
"--client-cert-auth=true" # Critical: enables client cert auth to pass the check
]
}
}
}Other
1SSH to the control plane node that runs etcd
2Edit the static pod manifest: /etc/kubernetes/manifests/etcd.yaml
3Under spec.containers[0].command (or args), add:
4```
5- --client-cert-auth=true # Critical: enables client certificate authentication
6```
7Save the file; kubelet will restart the etcd pod automatically
8Repeat on each control-plane node hosting an etcd pod
Check Code
from prowler.lib.check.models import Check, Check_Report_Kubernetes
from prowler.providers.kubernetes.services.etcd.etcd_client import etcd_client
class etcd_client_cert_auth(Check):
def execute(self) -> Check_Report_Kubernetes:
findings = []
for pod in etcd_client.etcd_pods:
report = Check_Report_Kubernetes(metadata=self.metadata(), resource=pod)
report.status = "PASS"
report.status_extended = (
f"Etcd has client certificate authentication enabled in pod {pod.name}."
)
for container in pod.containers.values():
if "--client-cert-auth" not in str(
container.command
) and "--client-cert-auth=true" not in str(container.command):
report.status = "FAIL"
report.status_extended = f"Etcd does not have client certificate authentication enabled in pod {pod.name}."
break
findings.append(report)
return findings