Kubernetes Secrets Management
Best practices for managing secrets in Kubernetes
Kubernetes Secrets Management
Proper secrets management is crucial for maintaining security in Kubernetes. This guide covers essential practices for handling sensitive information.
Video Tutorial
Prerequisites
- Basic understanding of Kubernetes
- Access to a Kubernetes cluster
- kubectl CLI tool installed
- Familiarity with security concepts
Project Structure
.
├── secrets/
│ ├── vault/ # HashiCorp Vault configs
│ ├── sealed/ # Sealed Secrets
│ ├── external/ # External Secrets
│ └── encryption/ # Encryption configs
└── monitoring/
├── audit/ # Audit logging
└── alerts/ # Security alerts
Vault Integration
1. Vault Configuration
apiVersion: vault.banzaicloud.com/v1alpha1
kind: Vault
metadata:
name: vault
spec:
size: 1
image: vault:1.12.0
bankVaultsImage: banzaicloud/bank-vaults:latest
config:
storage:
file:
path: /vault/file
listener:
tcp:
address: "0.0.0.0:8200"
tls_disable: true
2. Vault Auth
apiVersion: vault.banzaicloud.com/v1alpha1
kind: VaultSecret
metadata:
name: vault-auth
spec:
path: secret/data/myapp
type: Opaque
vault:
role: myapp
auth:
kubernetes:
role: myapp
serviceAccount: default
Sealed Secrets
1. SealedSecret Definition
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
name: mysecret
spec:
encryptedData:
username: AgBy8hCK8s...
password: AgBy8hCK8s...
template:
metadata:
labels:
app: myapp
type: Opaque
2. Secret Template
apiVersion: v1
kind: Secret
metadata:
name: template-secret
type: Opaque
stringData:
config.yaml: |
apiKey: ${API_KEY}
endpoint: ${ENDPOINT}
External Secrets
1. SecretStore Configuration
apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
name: aws-secret-store
spec:
provider:
aws:
service: SecretsManager
region: us-west-2
auth:
secretRef:
accessKeyIDSecretRef:
name: aws-secret-creds
key: access-key
secretAccessKeySecretRef:
name: aws-secret-creds
key: secret-key
2. External Secret
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: aws-secret
spec:
refreshInterval: 1h
secretStoreRef:
name: aws-secret-store
kind: SecretStore
target:
name: application-secret
data:
- secretKey: username
remoteRef:
key: app/production/username
- secretKey: password
remoteRef:
key: app/production/password
Encryption Configuration
1. Encryption at Rest
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
metadata:
name: encryption-config
spec:
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: <base64-encoded-key>
- identity: {}
2. Key Rotation
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
spec:
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key2
secret: <new-key>
- name: key1
secret: <old-key>
- identity: {}
Best Practices Checklist
- ✅ Use encryption at rest
- ✅ Implement secret rotation
- ✅ Enable audit logging
- ✅ Use RBAC controls
- ✅ Monitor secret access
- ✅ Regular key rotation
- ✅ Secure storage
- ✅ Access policies
- ✅ Documentation
- ✅ Backup strategy
Secret Management Patterns
Centralized Secrets
- Single source of truth
- Automated rotation
- Access control
- Audit logging
Distributed Secrets
- Per-namespace secrets
- Local encryption
- Limited access
- Namespace isolation
External Secrets
- Cloud provider integration
- Automated sync
- Version control
- Disaster recovery
Common Pitfalls
- ❌ Hardcoded secrets
- ❌ Unencrypted storage
- ❌ Poor access control
- ❌ Missing rotation
- ❌ Insufficient monitoring
Monitoring Setup
1. Audit Policy
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: RequestResponse
resources:
- group: ""
resources: ["secrets"]
verbs: ["create", "update", "delete"]
2. Alert Rules
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: secret-alerts
spec:
groups:
- name: secrets
rules:
- alert: SecretAccessAnomaly
expr: rate(secret_access_total{status="unauthorized"}[5m]) > 10
for: 5m
labels:
severity: critical
Secret Rotation
1. Automated Rotation
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: aws-secrets
spec:
provider: aws
parameters:
objects: |
- objectName: "app/production/secret1"
objectType: "secretsmanager"
secretObjects:
- secretName: application-secret
type: Opaque
data:
- objectName: secret1
key: username
2. Manual Rotation
apiVersion: v1
kind: Secret
metadata:
name: rotating-secret
annotations:
secret-rotation: "true"
rotation-date: "2025-01-20"
type: Opaque
data:
api-key: <base64-encoded-key>
Access Control
1. RBAC Policy
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "list"]
resourceNames: ["app-secret"]
2. Network Policy
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: secret-access
spec:
podSelector:
matchLabels:
role: secret-consumer
policyTypes:
- Egress
egress:
- to:
- podSelector:
matchLabels:
app: vault
Conclusion
Implementing these secrets management practices ensures secure handling of sensitive information in your Kubernetes clusters. Regular audits and updates are essential for maintaining security.