Secrets in the cluster often end up carried into backups. This episode covers encrypting data in object storage with SSE/KMS, volume snapshot encryption, TLS to the S3 endpoint, and NetworkPolicies to restrict communication between Velero components inside the cluster.

In episode 13 you secured the safe's key (credentials). Episode 14 secures the contents of the safe itself. The point that often surprises: a Velero backup contains raw Kubernetes Secrets — database passwords, API tokens, even TLS keys. Anyone who manages to read your bucket, or steals a disk snapshot, gets all those secrets.
That's why encryption isn't optional — it's the last line of defense. Imagine secret archives stored in a plain folder vs a locked folder. Velero + unencrypted object storage is the plain folder: safe as long as nobody touches it, wide open the moment someone does.
Always enable server-side encryption at the bucket level — data is encrypted at rest and automatically decrypted when Velero reads it:
aws s3api put-bucket-encryption --bucket velero-backups \
--server-side-encryption-configuration '{
"Rules": [{"ApplyServerSideEncryptionByDefault": {"SSEAlgorithm": "aws:kms"}}]
}'Two common options:
kmsKeyName on the bucket, or default encryption with customer-managed keys.Note
SSE encryption is transparent to Velero — no extra BSL configuration needed. What you need to watch instead is KMS permissions: make sure Velero's IAM role is allowed to use the encryption key, or backup/restore will fail with an AccessDenied error from KMS.
Cloud volume snapshots can also be encrypted. For the AWS plugin, set kmsKeyId in the VSL configuration:
apiVersion: velero.io/v1
kind: VolumeSnapshotLocation
metadata:
name: default
namespace: velero
spec:
provider: aws
config:
region: us-east-1
kmsKeyId: arn:aws:kms:us-east-1:123456789012:key/abc123Every EBS snapshot Velero creates is now encrypted with that KMS key — and can only be read with the same permissions.
File-level backups (kopia) are always encrypted by their repository — the key is created automatically when the repository is first created and stored as a kopia-repo-* Secret in the velero namespace. Never delete this repository Secret; without the key, the data can't be decrypted.
kubectl get secrets -n velero -l velero.io/repository-type=kopiaAn absolute rule: object storage must be accessed via HTTPS in any environment except a lab. MinIO in a lab may use http://, but production (including internal MinIO) must use TLS:
apiVersion: velero.io/v1
kind: BackupStorageLocation
metadata:
name: minio-prod
namespace: velero
spec:
provider: aws
objectStorage:
bucket: velero
prefix: backups
caCertRef:
name: minio-ca
key: ca.crt
config:
region: minio
s3ForcePathStyle: "true"
s3Url: https://minio.internal:443caCertRef points to a Secret containing the internal CA (Velero 1.18 supports Secret-based CA on BSL) — for MinIO endpoints using internal self-signed certificates.
On clusters with network policies enabled, Velero components should only communicate with what they need: the API server and the external object storage endpoint.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: velero-egress
namespace: velero
spec:
podSelector:
matchLabels:
app.kubernetes.io/name: velero
policyTypes:
- Egress
egress:
- to:
- namespaceSelector: {}
ports:
- protocol: TCP
port: 443
- protocol: TCP
port: 6443
- to:
- ipBlock:
cidr: 10.0.0.0/16
ports:
- protocol: TCP
port: 443Note: the ipBlock entry is a placeholder for your object storage CIDR — adjust it to your network. The policy above restricts Velero's outbound traffic to the API server and object storage only.
Warning
Before applying a strict NetworkPolicy, test in staging: the node-agent also needs egress to the BSL, and every pod in the velero namespace needs API server access. A wrong policy can make backups fail in a hard-to-diagnose way.
kmsKeyId in the VSL.Key takeaways:
kmsKeyId in the VSL.caCertRef for internal CAs) and NetworkPolicies to restrict communication.In episode 15 next, we build Backup Policies & Compliance — immutability with object lock, per-policy compliance retention, and audit via server logs and backup/restore events.