SOPS – ваш швейцарский нож для безопасного управления секретами в Git
Привет, коллеги! Наверное, каждый из нас сталкивался с этой проблемой: как безопасно хранить конфиденциальные данные – пароли, API-ключи, токены – в Git-репозитории, чтобы они были доступны только нужным сервисам и людям? Заливать их в открытом виде – табу, а хранить где-то отдельно и вручную раскидывать по серверам – утомительно и чревато ошибками. Именно здесь на помощь приходит SOPS (Secrets OPerationS).

Что это за зверь SOPS и зачем он нам?
Представьте себе инструмент, который позволяет вам шифровать файлы конфигурации (YAML, JSON, ENV, INI) и даже бинарные данные прямо в вашем репозитории. При этом ключи остаются читаемыми, а значения – надежно зашифрованными. SOPS делает это, используя различные бэкенды для хранения мастер-ключей: от облачных сервисов, таких как AWS KMS, GCP KMS, Azure Key Vault и HuaweiCloud KMS, до локальных PGP-ключей и современного age.
Этот проект родился в Mozilla в 2015 году, чтобы решить их собственные задачи по безопасной дистрибуции секретов в динамической инфраструктуре. А теперь он стал частью Cloud Native Computing Foundation (CNCF), что говорит о его зрелости и востребованности в мире облачных технологий.
Ключевые возможности, которые упрощают жизнь
Давайте разберем, что именно SOPS умеет и как это может помочь вам в повседневной работе.
1. Единый редактор для всех секретов
SOPS работает как прозрачный редактор зашифрованных файлов. Вы просто вызываете sops edit mysecret.yaml, и он сам расшифровывает файл, открывает его в вашем любимом текстовом редакторе (будь то Vim, Nano или что-то другое), а после сохранения — снова шифрует. Вам не нужно думать о ключах или алгоритмах – всё происходит автоматически.
$ sops edit mynewtestfile.yaml
mynewtestfile.yaml doesn't exist, creating it.
please wait while an encryption key is being generated and stored in a secure fashion
file written to mynewtestfile.yaml
Результат выглядит как обычный конфиг, но значения заменены на зашифрованные блоки:
myapp1: ENC[AES256_GCM,data:Tr7o=,iv:1=,aad:No=,tag:k=]
app2:
db:
user: ENC[AES256_GCM,data:CwE4O1s=,iv:2k=,aad:o=,tag:w==]
password: ENC[AES256_GCM,data:p673w==,iv:YY=,aad:UQ=,tag:A=]
# private key for secret operations in app2
key: |-
ENC[AES256_GCM,data:Ea3kL5O5U8=,iv:DM=,aad:FKA=,tag:EA==]
2. Гибкость выбора ключей шифрования
SOPS поддерживает широкий спектр систем управления ключами:
- AWS KMS, GCP KMS, Azure Key Vault, HuaweiCloud KMS: Идеально для облачных инфраструктур. Вы можете использовать IAM-роли для контроля доступа, что значительно упрощает управление ключами по сравнению с традиционными PGP.
- PGP: Классика. Отлично подходит для локального использования или в качестве резервного варианта на случай потери доступа к облачным KMS.
- Age: Современная, простая и безопасная альтернатива PGP, набирающая популярность. SOPS отлично с ней дружит.
- HashiCorp Vault Transit: Для тех, кто уже использует Vault как централизованное хранилище секретов.
Вы можете комбинировать эти методы, например, шифровать одним файлом с помощью AWS KMS и PGP одновременно, повышая надежность и отказоустойчивость.
3. Git-friendly Diff'ы
Одна из самых крутых фич – это интеграция с Git. Знакома ситуация, когда зашифрованный файл меняется, и git diff показывает бесполезный бинарный бред? SOPS решает эту проблему! Вы можете настроить Git так, чтобы при просмотре diff он автоматически расшифровывал файлы, показывая изменения в чистом виде. Это бесценно для code review и отслеживания истории изменений.
*.yaml diff=sopsdiffer
$ git config diff.sopsdiffer.textconv "sops decrypt"
4. Гранулярный контроль и частичное шифрование
SOPS позволяет вам не шифровать весь файл целиком. Вы можете указать, какие поля должны оставаться в открытом виде, используя суффиксы (_unencrypted) или регулярные выражения. Это удобно, когда в одном файле есть и чувствительные, и нечувствительные данные.
# В этом файле 'description' останется незашифрованным
description: Это описание проекта
database_password: ENC[...] # Это зашифровано
5. Безопасная передача секретов в процессы
Когда нужно передать секреты в другое приложение, SOPS предлагает команды exec-env и exec-file. Они позволяют расшифровать секреты и передать их в переменные окружения или во временный файл для дочернего процесса. Самое главное — секреты никогда не записываются на диск в открытом виде и доступны только этому процессу.
$ sops exec-env out.json 'echo secret: $database_password; ./database-import'
secret: jf48t9wfw094gf4nhdf023r
Как это работает под капотом? Протокол шифрования
SOPS не просто шифрует весь файл как единый блок. При создании файла он генерирует случайный 256-битный ключ данных (data key). Этот ключ данных затем шифруется каждым из ваших мастер-ключей (KMS, PGP, age) и сохраняется в метаданных файла.
Далее, каждый отдельный лист (значение) в вашем YAML/JSON файле шифруется с помощью этого ключа данных, используя алгоритм AES256_GCM, уникальный вектор инициализации и дополнительные аутентификационные данные (AAD), которые формируются из имен ключей в иерархии документа. Это позволяет:
- Сохранять структуру файла: Ключи остаются в открытом виде, что делает diff'ы осмысленными.
- Гарантировать целостность: MAC (Message Authentication Code) вычисляется для всех значений, предотвращая незаметные изменения.
Такой подход обеспечивает высокую безопасность и удобство использования.
SOPS в вашей DevOps-практике
Где SOPS покажет себя лучше всего?
- CI/CD пайплайны: Безопасное развертывание секретов в различных окружениях (dev, staging, prod) без жесткого кодирования или ручной передачи.
.sops.yamlпозволяет настроить правила шифрования для разных файлов и окружений. - Infrastructure as Code (IaC): Хранение чувствительных данных для Terraform, Ansible, Kubernetes Manifests. Например, пароли для баз данных или токены для внешних сервисов прямо рядом с кодом вашей инфраструктуры, но в зашифрованном виде.
- Многопользовательская разработка: Благодаря поддержке нескольких мастер-ключей и Shamir's Secret Sharing, несколько разработчиков могут работать с одним файлом, требуя N из M ключей для расшифровки.
Стоит ли попробовать SOPS?
Если вы:
- Устали от небезопасного хранения секретов.
- Используете Git для управления конфигурациями.
- Работаете в облаке и цените интеграцию с KMS.
- Ищете инструмент, который упростит работу с зашифрованными файлами в команде.
Тогда SOPS — это то, что вам нужно! Он предлагает надежное, гибкое и удобное решение для одной из самых болезненных проблем в современной разработке. Попробуйте, и вы поймете, почему так много команд выбирают его.

Скачать SOPS можно на странице релизов.
SOPS является песочным проектом Cloud Native Computing Foundation (CNCF).
