Skip to main content

etcd Encryption

Why encrypt etcd

etcd stores every Kubernetes Secret at rest. Encrypting it means a stolen disk or backup does not hand over your Secrets in plaintext.

Read more about it: Kubernetes Docs: Encrypting Data at Rest

Enabling etcd encryption in Syself Autopilot

To enable it in Syself Autopilot, one possible approach is changing the spec.topology.variables of your cluster.yaml or Cluster resource within the management cluster and add:

yaml
		- name: etcdEncryptionSecretRef
  value:
    enabled: true
	

And create the related secret:

etcd-encryption-secret.yamlyaml
		apiVersion: v1
kind: Secret
metadata:
  name: etcd-encryption
type: Opaque
stringData:
  config: |-
    apiVersion: apiserver.config.k8s.io/v1
    kind: EncryptionConfiguration
    resources:
      - resources:
        - secrets
        providers:
        - aescbc:
            keys:
            - name: key1
              secret: <token>
        - identity: {}
	

To generate a random value to replace <token>, you can use:

		$ head -c 32 /dev/urandom | base64
	

Then save the above file as etcd-encryption-secret.yaml and run:

		$ kubectl apply -f etcd-encryption-secret.yaml
	

Direct verification of encrypted Secret data in etcd (for example using etcdctl) requires access to the control plane / etcd.

Encrypt already existing Secrets

Enabling encryption does not automatically rewrite Secrets that were already stored before encryption was enabled. Existing Secrets are encrypted after their next write.

To re-encrypt one existing Secret, trigger a small write (for example by annotating it):

		$ kubectl annotate secret <secret-name> \
-n <namespace> \
encryption-rewrite-timestamp="$(date +%s)" \
--overwrite
	

This updates the Secret and causes it to be written again using the currently configured encryption settings.

To re-encrypt all existing Secrets cluster-wide, run:

		$ kubectl get secrets --all-namespaces -o json | \
kubectl replace -f -
	

This command reads and rewrites all Secrets with the same data, which applies encryption at rest to objects that were previously unencrypted.

Troubleshooting

The official Kubernetes verification procedure for encryption at rest checks the raw Secret data in etcd using etcdctl. To execute those commands on a node, you need access to the control plane / etcd.

If you need to troubleshoot or prove that data is encrypted in etcd, follow the upstream Kubernetes verification steps:

Kubernetes Docs: Encrypt data at rest (verification)