kubectl create secret generic db-secret \
--from-literal=username=root \
--from-literal=password=mySecret
In deployment yaml :
env:
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: db-secret
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
In Spring boot :
spring:
datasource:
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
External Secret Manager
HashiCorp Vault
AWS Secrets Manager
Azure Key Vault
Google Secret Manager
6. Least Privilege
Every service should only access the secrets it needs.
Example
Payment Service
↓
Payment DB password only
Order Service
↓
Order DB password only
Not Payment Service
↓
All company passwords
7. Encrypt Secrets at Rest
Kubernetes Secrets are Base64 encoded by default, which is not encryption.
For production, enable encryption at rest in the Kubernetes API server or use an external KMS provider.
8. CI/CD
Never store secrets in:
· Git
· GitHub repository
· GitLab repository
· Dockerfile
Instead, store them in your CI/CD platform's secure secret store and inject them during deployment.
9. Logging
Never log secrets.
❌ Bad
log.info("Password = {}", password);
Even during debugging.
10. Certificates
Store:
TLS certificates
Private keys
JWT signing keys
as secrets, not inside the application JAR.
Git
│
(No secrets stored)
│
▼
CI/CD Pipeline
│
Reads Secret Store
│
▼
Kubernetes Secret
│
▼
Spring Boot Pod
│
Environment Variable
│
▼
Spring Configuration
Best Practices Checklist
|
Practice |
Recommended |
|
Hardcode passwords |
❌ No |
|
Commit secrets to Git |
❌ No |
|
Use environment variables |
✅ Yes |
|
Use Kubernetes Secrets |
✅ Yes |
|
Use Vault/Key Vault in production |
✅ Yes |
|
Rotate secrets regularly |
✅ Yes |
|
Enable encryption at rest |
✅ Yes |
|
Apply least privilege |
✅ Yes |
|
Never log secrets |
✅ Yes |
|
Audit secret access |
✅ Yes |