API server pod has the --encryption-provider-config argument set
Kubernetes API server pods include --encryption-provider-config, supplying an EncryptionConfiguration to apply encryption at rest to selected API resources stored in etcd.
Risk
Absent an encryption provider, Secrets and credentials are stored in plaintext in etcd and backups. Access to etcd, control plane disks, or snapshots can expose keys and tokens, enabling unauthorized API calls and lateral movement, compromising confidentiality and integrity.
Run this check with Prowler
Run in Prowler Cloudprowler kubernetes --checks apiserver_encryption_provider_config_setRecommendation
Enable encryption at rest with an EncryptionConfiguration and run with --encryption-provider-config using a non-identity provider (prefer kms v2). Apply least privilege to key/KMS access, rotate keys, restrict config file access, keep settings consistent across API servers, and re-encrypt existing objects.
Remediation
Other
Check Code
from prowler.lib.check.models import Check, Check_Report_Kubernetes
from prowler.providers.kubernetes.services.apiserver.apiserver_client import (
apiserver_client,
)
class apiserver_encryption_provider_config_set(Check):
def execute(self) -> Check_Report_Kubernetes:
findings = []
for pod in apiserver_client.apiserver_pods:
report = Check_Report_Kubernetes(metadata=self.metadata(), resource=pod)
report.status = "PASS"
report.status_extended = (
f"Encryption provider config is set appropriately in pod {pod.name}."
)
encryption_provider_config_set = True
for container in pod.containers.values():
# Check if "--encryption-provider-config" is set
if "--encryption-provider-config" not in str(container.command):
encryption_provider_config_set = False
break
if not encryption_provider_config_set:
report.status = "FAIL"
report.status_extended = (
f"Encryption provider config is not set in pod {pod.name}."
)
findings.append(report)
return findings