SOPS (Secrets OPerationS) — encrypting files with secrets. Age — modern alternative to GPG.
Installation:
1brew install sops age
Key generation:
1age-keygen -o key.txt2# Public key: age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrj2kg5sfn9aqmcac8p
Encryption:
1sops --encrypt --age age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrj2kg5sfn9aqmcac8p \2 secrets.yaml > secrets.enc.yaml
secrets.yaml (plaintext):
1db_password: supersecret2api_key: sk-xxx
secrets.enc.yaml (encrypted):
1db_password: ENC[AES256_GCM,data:xxx]2api_key: ENC[AES256_GCM,data:xxx]3sops:4 age:5 - recipient: age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrj2kg5sfn9aqmcac8p6 enc: |7 -----BEGIN AGE ENCRYPTED FILE-----8 ... -----END AGE ENCRYPTED FILE-----9 lastmodified: "2024-01-15"10 version: 3.8.1
Decryption:
1SOPS_AGE_KEY_FILE=key.txt sops --decrypt secrets.enc.yaml2sops --decrypt --in-place secrets.enc.yaml # in place
Kubernetes integration (helm-secrets):
1helm secrets upgrade my-release ./mychart \2 -f values.yaml \3 -f "secrets://secrets.enc.yaml" \4 --set sops.age.key-file=key.txt
GitHub Actions:
1- name: Decrypt secrets2 run: sops --decrypt --in-place secrets.enc.yaml3 env:4 SOPS_AGE_KEY: ${{ secrets.SOPS_AGE_KEY }}
SOPS + AWS KMS: sops --encrypt --kms arn:aws:kms:... secrets.yaml.