====== 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/ – можно сразу открывать шифрованные файлы после установки и работать с ними