SOPS + Age: Шифруем секреты

Это краткая заметка по шифрованию YAML-файлов с секретами, которые публикуются в Git. Удобно для дальнейшей интеграции с Flux2\ArgoCD (через Helm Secrets плагин)

Вместо тысячи слов: Age is a simple, modern and secure file encryption tool, format, and Go library. Рекомендуется пользоваться age вместо GPG – по крайней мере, так рекомендуют сами разработчики sops.

Инструкция по работе с утилитой

  • Необходимо сформировать приватный и публичный ключи, на основе которых будет производиться шифрование:
# создать каталог, где age по умолчанию будет искать ключи
mkdir -p $HOME/.config/sops/age/

# сгенерировать ключи
age-keygen -o $HOME/.config/sops/age/keys.txt

# добавить публичный ключ в переменную
PUB_KEY=$(cat $HOME/.config/sops/age/keys.txt | grep "public" | awk '{print $4}')

  • В данном примере будут шифроваться yaml файлы с чувствительными данными. Поэтому для необходимых полей yaml необходимо создать маску. В encrypted_regex добавить необходимые значения полей, а в age – публичный ключ, сформированный на предыдущем шаге в файле $HOME/.config/sops/age/key.txt:
cat > $HOME/.sops.yaml << EOF
creation_rules:
  - encrypted_regex: '^(data|key|password)$'
    age: $(echo $PUB_KEY)
EOF

К файлу .sops.yaml и keys.txt sops будет обращаться при каждом выполнении.

Так как $HOME/.config/sops/age/keys.txt – путь по умолчанию, sops не требуется явно передавать путь к файлу ключей. Но при необходимости его также можно задавать через переменную окружения – export SOPS_AGE_KEY_FILE=$HOME/.config/sops/age/keys.tx

  • Теперь можно создать файл-пример:
cat > $HOME/secret.yaml << EOF
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  USER_NAME: bob
  PASSWORD: strongpass
EOF

  • И при наличии всех необходимых данных выполнить шифрование:
sops -e -i secret.yaml

  • На выходе будет файл с тем же именем, но с шифрованным содержимым в поле data:
cat secret.yaml
apiVersion: v1
kind: Secret
metadata:
    name: mysecret
type: Opaque
data:
    USER_NAME: ENC[AES256_GCM,data:BQ6O,iv:XyjcRI5/TzDykCQo6a9FoDotHjJlYNGH+4Yq30F+5k4=,tag:YNyd8LnwMnmHe0TUm5wKhg==,type:str]
    PASSWORD: ENC[AES256_GCM,data:dD3prw2Cs9VOxw==,iv:2adiZTUmXrIHnpwrgAvJvsMafvrG+DDGXhUKD/C9nio=,tag:Xbl9NCuVdFRwED1AuXFtQA==,type:str]
sops:
    kms: []
    gcp_kms: []
    azure_kv: []
    hc_vault: []
    age:
   - recipient: age10teuyr66yq0glkkdp8w8adpvuty7xl4vhp6ergna8k95r68g9p7q5gvt94
          enc: |
            -----BEGIN AGE ENCRYPTED FILE-----
            YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBGdVRaTU1OT2g2SkhhK2tm
            ckpCZ0pWanBTYXJBdloybXVvYzNKeUFLM3lnCnUvd2FtbDAzZFlIY2ZHTEwyYmFs
            MWl0VmNldnk0VzBzSUdCZmJzZ0VZaU0KLS0tIFJ6ZzJyZmxKYUE5cjRVdVViVzV6
            ZFVLN3V0N3dUQ1lPSjUxZE0xMXh0SjgKFNwNL2bDPhuTZU7qb46ZPQ+qWm0dcSUf
            mt2xZismI0/g9oZH1K4CzMkrgYHDketCDPFLDZ9lRPha7jZzY9lKNA==
            -----END AGE ENCRYPTED FILE-----
    lastmodified: "2022-12-29T10:46:46Z"
    mac: ENC[AES256_GCM,data:ZEKJyGWWvKlP2/nrxosy7tLbiNx0p6Eu0+wYLz69NHjwa1bzIWAzVNXKQgZy1fWLT/AGlgwqTfx5zg8bg0iv43dHqL+NhIhTrqMLPlmYO/IiCn9PBfSY0UVdUwoz2E9QLCDHFaBvOqK5Q9EVkAApjsTwC39KlofPkwB5f+5FKqY=,iv:6hfqwbsUWHxkEWILMa5SrRnpPM81W2lX4gNntbxvoW0=,tag:lWl47uddfa4N/lQ0J+0fBA==,type:str]
    pgp: []
    encrypted_regex: ^(data|key|password)$
    version: 3.7.3

  • Для расшифровки:
sops -d -i secret.yaml

apiVersion: v1
kind: Secret
metadata:
    name: mysecret
type: Opaque
data:
    USER_NAME: bob
    PASSWORD: strongpass

  • При необходимости можно задать расширение (например, enc), указав, что файл зашифрован:
sops -e secret.yaml > secret.yaml.enc

  • И дешифровать
sops -d --input-type yaml --output-type yaml secret.yaml.enc

Важно указать явно input и output формат – yaml. Этого нет в документации, см issue

Для удобства работы с шифрованными секретами можно установить плагин для VSC, который позволяет налету производить расшифровку. Плагин не требует настройки, если путь для хранения публичных\приватных ключей в linux лежит по пути $HOME/.config/sops/age/ – можно сразу открывать шифрованные файлы после установки и работать с ними