====== 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. Этого нет в документации, см [[https://github.com/mozilla/sops/issues/596|issue]]
==== VSCode extensions ====
Для удобства работы с шифрованными секретами можно установить [[https://marketplace.visualstudio.com/items?itemName=signageos.signageos-vscode-sops|плагин ]]для VSC, который позволяет налету производить расшифровку. Плагин не требует настройки, если путь для хранения публичных\приватных ключей в linux лежит по пути $HOME/.config/sops/age/ – можно сразу открывать шифрованные файлы после установки и работать с ними