Kubernetes operator for generating secrets with templates and storing them in multiple destinations.
- Multiple Storage: Kubernetes secrets, AWS Secrets Manager, AWS Parameter Store, GCP Secret Manager
- Template Engine: Go templates with crypto, random, and TLS generators
- Create-Once: Secrets generated once and never modified
- Cloud Integration: AWS and GCP authentication support
helm repo add logiciq https://charts.logiciq.ca
helm install secret-santa logiciq/secret-santaFor AWS Secrets Manager or Parameter Store:
# With service account annotations (EKS)
helm install secret-santa logiciq/secret-santa \
--set aws.enabled=true \
--set aws.region=us-west-2 \
--set serviceAccount.annotations."eks\.amazonaws\.com/role-arn"=arn:aws:iam::123456789012:role/secret-santa
# With environment variables
helm install secret-santa logiciq/secret-santa \
--set aws.enabled=true \
--set aws.region=us-west-2 \
--set aws.credentials.useServiceAccount=false \
--set aws.credentials.accessKeyId=AKIA... \
--set aws.credentials.secretAccessKey=...For GCP Secret Manager:
# With service account key file
helm install secret-santa logiciq/secret-santa \
--set gcp.enabled=true \
--set gcp.projectId=my-project-id \
--set gcp.credentials.useWorkloadIdentity=false \
--set gcp.credentials.keyFile=/etc/gcp/key.json \
--set gcp.credentials.existingSecret=gcp-service-account-key
# With workload identity (GKE)
helm install secret-santa logiciq/secret-santa \
--set gcp.enabled=true \
--set gcp.projectId=my-project-id \
--set gcp.credentials.useWorkloadIdentity=true \
--set serviceAccount.annotations."iam\.gke\.io/gcp-service-account"[email protected]apiVersion: secrets.secret-santa.io/v1alpha1
kind: SecretSanta
metadata:
name: app-password
spec:
template: |
password: {{ .pass.password }}
generators:
- name: pass
type: random_password
config:
length: 32
media:
type: k8s # Default - can be omittedapiVersion: secrets.secret-santa.io/v1alpha1
kind: SecretSanta
metadata:
name: tls-cert
spec:
template: |
tls.crt: {{ .cert.certificate }}
tls.key: {{ .key.private_key_pem }}
generators:
- name: key
type: tls_private_key
- name: cert
type: tls_self_signed_cert
config:
key_pem: "{{ .key.private_key_pem }}"
subject:
common_name: example.com
secretType: kubernetes.io/tls
media:
type: k8s # Default - can be omittedapiVersion: secrets.secret-santa.io/v1alpha1
kind: SecretSanta
metadata:
name: aws-secret
spec:
template: |
{
"username": "admin",
"password": "{{ .pass.password }}"
}
generators:
- name: pass
type: random_password
config:
length: 24
media:
type: aws-secrets-manager
config:
region: us-west-2
kms_key_id: alias/secrets-keyapiVersion: secrets.secret-santa.io/v1alpha1
kind: SecretSanta
metadata:
name: db-url
spec:
template: |
postgresql://user:{{ .pass.password }}@db.example.com/app
generators:
- name: pass
type: random_password
config:
length: 32
media:
type: aws-parameter-store
config:
region: us-east-1
parameter_name: /app/database-urlapiVersion: secrets.secret-santa.io/v1alpha1
kind: SecretSanta
metadata:
name: gcp-secret
spec:
template: |
{
"username": "admin",
"password": "{{ .pass.password }}"
}
generators:
- name: pass
type: random_password
config:
length: 24
media:
type: gcp-secret-manager
config:
project_id: my-gcp-project
secret_name: app-credentials# Default media - can be omitted entirely
media:
type: k8s
# Or with custom secret name
media:
type: k8s
config:
secret_name: my-custom-secret-namemedia:
type: aws-secrets-manager
config:
region: us-west-2 # Optional
secret_name: my-custom-secret # Optional
kms_key_id: alias/my-kms-key # Optionalmedia:
type: aws-parameter-store
config:
region: us-east-1 # Optional
parameter_name: /my/custom/param # Optional
kms_key_id: alias/my-kms-key # Optionalmedia:
type: gcp-secret-manager
config:
project_id: my-gcp-project # Required
secret_name: my-custom-secret # Optional
credentials_file: /path/to/key.json # Optional - uses workload identity if emptyrandom_password- Secure passwordsrandom_string- Random stringsrandom_uuid- UUIDsrandom_bytes- Byte arrays
tls_private_key- Private keystls_self_signed_cert- Self-signed certificatestls_cert_request- Certificate requests
crypto_aes_key- AES keyscrypto_rsa_key- RSA keyscrypto_ed25519_key- Ed25519 keys
controller:
replicas: 1
args:
maxConcurrentReconciles: 5
watchNamespaces: ["default", "production"]
logLevel: "info"
aws:
enabled: true
region: us-west-2
credentials:
useServiceAccount: true
gcp:
enabled: true
projectId: my-gcp-project
credentials:
useWorkloadIdentity: true
# OR for service account key:
# useWorkloadIdentity: false
# existingSecret: gcp-service-account-key
# existingSecretKey: key.json
serviceAccount:
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/secret-santa
iam.gke.io/gcp-service-account: [email protected]SECRET_SANTA_MAX_CONCURRENT_RECONCILES=5
SECRET_SANTA_WATCH_NAMESPACES=default,production
SECRET_SANTA_LOG_LEVEL=debug
AWS_REGION=us-west-2
GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json
GCP_PROJECT_ID=my-gcp-project