containerd Secrets Management
Secure handling of sensitive data in containerd and Kubernetes. Learn to use Kubernetes Secrets, HashiCorp Vault, encrypted storage, and best practices for secrets management.
Containers need access to sensitive data: API keys, database passwords, TLS certificates, and more. Exposing these secrets in plaintext is a security risk. Secrets management ensures:
- Confidentiality - Secrets are encrypted at rest and in transit.
- Integrity - Secrets can't be tampered with.
- Access Control - Only authorized containers can access secrets.
- Auditability - Track who accessed which secrets.
Kubernetes Secrets
HashiCorp Vault
External Secrets Operator
Sealed Secrets
Kubernetes Secrets are the simplest way to manage secrets in Kubernetes. They store data as base64-encoded strings.
# Create a secret
kubectl create secret generic db-credentials \
--from-literal=username=admin \
--from-literal=password=supersecret
# Create from file
kubectl create secret generic tls-cert \
--from-file=cert.pem=/path/to/cert.pem \
--from-file=key.pem=/path/to/key.pem
# View secret (base64 decoded)
kubectl get secret db-credentials -o yaml
# Decode secret
echo "YWRtaW4=" | base64 -d
# Use secret in pod
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
env:
- name: DB_USER
valueFrom:
secretKeyRef:
name: db-credentials
key: username
- name: DB_PASS
valueFrom:
secretKeyRef:
name: db-credentials
key: password
# Mount secret as volume
volumes:
- name: secrets
secret:
secretName: db-credentials
mode: 0400
Enable encryption at rest to protect secrets in etcd. This prevents attackers with etcd access from reading secret data.
# EncryptionConfiguration file
# /etc/kubernetes/encryption-config.yaml
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret:
- identity: {}
# Generate encryption key
head -c 32 /dev/urandom | base64
# Enable encryption in kube-apiserver
--encryption-provider-config=/etc/kubernetes/encryption-config.yaml
# Rotate encryption key (add new key)
# Update config with new key as first provider
# Restart kube-apiserver
# Re-encrypt all secrets with new key
Vault provides enterprise-grade secrets management with dynamic secrets, encryption as a service, and fine-grained access control.
# Install Vault
helm repo add hashicorp https://helm.releases.hashicorp.com
helm install vault hashicorp/vault
# Unseal Vault (first time)
vault operator init
vault operator unseal
# Enable Kubernetes auth
vault auth enable kubernetes
# Configure Kubernetes auth
vault write auth/kubernetes/config \
kubernetes_host="https://kubernetes.default.svc"
# Create a policy
vault policy write app-policy - <
ESO syncs secrets from external providers (Vault, AWS Secrets Manager, GCP Secret Manager) into Kubernetes Secrets.
# Install ESO
helm repo add external-secrets https://charts.external-secrets.io
helm install external-secrets external-secrets/external-secrets
# Create SecretStore (Vault)
apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
name: vault-store
spec:
provider:
vault:
server: "https://vault:8200"
path: "secret"
version: "v2"
auth:
kubernetes:
mountPath: "kubernetes"
role: "app-role"
# Create ExternalSecret
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: db-credentials
spec:
secretStoreRef:
name: vault-store
kind: SecretStore
target:
name: db-credentials
creationPolicy: Owner
data:
- secretKey: username
remoteRef:
key: app/db
property: username
- secretKey: password
remoteRef:
key: app/db
property: password
Sealed Secrets encrypts secrets so they can be safely stored in Git. Only the controller in the cluster can decrypt them.
# Install Sealed Secrets
kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/latest/download/controller.yaml
# Install kubeseal CLI
curl -L https://github.com/bitnami-labs/sealed-secrets/releases/latest/download/kubeseal-linux-amd64 -o kubeseal
chmod +x kubeseal
# Create a sealed secret
kubectl create secret generic db-credentials \
--from-literal=username=admin \
--dry-run=client -o yaml > secret.yaml
# Seal the secret
kubeseal -f secret.yaml -w sealed-secret.yaml
# Apply sealed secret (GitOps safe)
kubectl apply -f sealed-secret.yaml
# The controller decrypts and creates the secret
- Never hardcode secrets - Use environment variables or mounted files from secrets.
- Encrypt secrets at rest - Enable etcd encryption in Kubernetes.
- Use short-lived secrets - Rotate secrets regularly. Use Vault for dynamic secrets.
- Limit secret access - Use RBAC to restrict which pods can access which secrets.
- Audit secret access - Monitor who accesses secrets using audit logs.
- Use GitOps securely - Use Sealed Secrets or SOPS for Git.
- Don't store secrets in images - Images are immutable and exposed.
- Use encryption providers - Use KMS providers (AWS KMS, GCP KMS) for key management.
- Implement secret rotation - Automate rotation for better security.
- Scan for secrets - Use secret scanning tools (GitLeaks, TruffleHog) to detect leaks.
Detect secrets in code and prevent them from being committed to Git.
# GitLeaks (pre-commit scanning)
gitleaks detect --source . --report-format json
# TruffleHog
trufflehog filesystem .
trufflehog github --repo https://github.com/user/repo
# Pre-commit hook
# .pre-commit-config.yaml
repos:
- repo: https://github.com/gitleaks/gitleaks
rev: v8.16.0
hooks:
- id: gitleaks
# GitHub Secret Scanning
# Enable in GitHub settings > Security > Secret scanning
# GitLab Secret Detection
# Enable in Security & Compliance > Secret Detection
# Check if secret exists
kubectl get secret db-credentials
# View secret details (avoid showing values)
kubectl describe secret db-credentials
# Check if pod can access secret
kubectl exec -it nginx -- env | grep DB_
# Check secret mount
kubectl exec -it nginx -- ls -la /etc/secrets
# Verify encryption at rest
kubectl get secret db-credentials -o yaml
# Check Vault health
vault status
vault secrets list
# Test Vault authentication
vault token lookup
Secrets management is a critical aspect of container security. Choose the right solution for your needs and follow best practices to protect sensitive data.