Talm v0.17: встроенное шифрование age для управления секретами

Talm v0.17: встроенное шифрование age для управления секретами

Последний релиз Talm, менеджера конфигурации для Talos Linux, представляет мощную новую возможность: встроенное шифрование с помощью инструмента шифрования age. Это улучшение позволяет безопасно хранить конфиденциальные конфигурационные файлы, такие как secrets.yaml, talosconfig и kubeconfig, в Git-репозиториях с соблюдением лучших практик безопасности.

Почему шифрование age?

Управление секретами в Git-репозиториях всегда было непростой задачей. Хотя хранение конфигурационных файлов в системе контроля версий удобно для GitOps-процессов, конфиденциальные данные, такие как API-ключи, сертификаты и учётные данные кластера, никогда не должны попадать в репозиторий в открытом виде. Традиционные решения, такие как git-crypt или внешние системы управления секретами, добавляют сложность и зависимости.

Talm v0.17 решает эту проблему, интегрируя шифрование age непосредственно в рабочий процесс. Age — это современный, простой и безопасный инструмент шифрования файлов, использующий передовую криптографию. Он спроектирован так, чтобы быть:

  • Простым: прост в использовании с минимальной настройкой
  • Безопасным: использует современные алгоритмы шифрования (X25519, ChaCha20Poly1305)
  • Быстрым: эффективное шифрование и расшифровка
  • Совместимым: без проблем работает с существующими Git-процессами

SOPS-подобный формат для зашифрованных значений

Talm использует SOPS-подобный формат для зашифрованных значений, что делает его знакомым для пользователей, работавших с Mozilla SOPS. В зашифрованных YAML-файлах шифруются только значения, а ключи остаются читаемыми. Это позволяет легко понять структуру конфигурационных файлов, даже когда они зашифрованы.

Вот пример того, как выглядят зашифрованные значения:

machine:
  token: ENC[AGE,data:Tr7o=]
  ca:
    crt: ENC[AGE,data:VGVzdA==]

Формат ENC[AGE,data:...] чётко указывает, какие значения зашифрованы, при этом структура YAML остаётся неизменной и понятной для человека.

Начало работы с шифрованием

Первоначальная настройка

При первом запуске talm init Talm автоматически генерирует ключ шифрования (talm.key), если он ещё не существует. Этот ключ используется для всех операций шифрования и расшифровки:

talm init -p cozystack

Эта команда:

  1. Сгенерирует secrets.yaml с секретами вашего кластера
  2. Создаст talosconfig для доступа к кластеру
  3. Сгенерирует talm.key (если он не существует) для шифрования
  4. Автоматически зашифрует secrets.yaml в secrets.encrypted.yaml
  5. Зашифрует talosconfig в talosconfig.encrypted
  6. Обновит .gitignore, чтобы исключить файлы в открытом виде

Формат ключа шифрования

Файл talm.key соответствует стандартному формату age keygen, что делает его совместимым с другими инструментами на основе age:

# created: 2025-01-17T15:18:42+01:00
# public key: age1uqwfv7lq6a23wslgpjqkpj8mnp6dmycwd97wmz4n6grtr7g2853sl0yjdr
AGE-SECRET-KEY-103PEFSPAV83H6GXECWZJ9CXCXJ3YRY64Y5PE75XWY2S97VAR84AQQ678AU

Этот формат включает метаданные о времени создания ключа и публичный ключ, который может использоваться для обмена зашифрованными файлами с участниками команды (хотя эта возможность запланирована на будущие релизы).

Шифрование и расшифровка файлов

Шифрование файлов

Чтобы зашифровать конфиденциальные файлы, используйте флаг --encrypt (или -e):

talm init -e

Эта команда:

  • Зашифрует secrets.yamlsecrets.encrypted.yaml
  • Зашифрует talosconfigtalosconfig.encrypted
  • Зашифрует kubeconfigkubeconfig.encrypted (если он существует)

Команда выводит подробную информацию о том, какие файлы шифруются:

Encrypting secrets.yaml -> secrets.encrypted.yaml
Encrypting talosconfig -> talosconfig.encrypted
Encrypting kubeconfig -> kubeconfig.encrypted
Encrypted 3 file(s).

Расшифровка файлов

Чтобы расшифровать зашифрованные файлы обратно в открытый вид, используйте флаг --decrypt (или -d):

talm init -d

Это расшифрует все зашифрованные файлы:

  • secrets.encrypted.yamlsecrets.yaml
  • talosconfig.encryptedtalosconfig
  • kubeconfig.encryptedkubeconfig

Идемпотентное шифрование: обновляются только изменённые значения

Одна из самых мощных возможностей шифрования в Talm — его идемпотентное поведение. Когда вы запускаете talm init -e несколько раз, система интеллектуально сравнивает значения в открытом виде с их зашифрованными аналогами и повторно шифрует только те значения, которые действительно изменились.

Это означает:

  • Неизменённые значения сохраняют свою существующую зашифрованную форму
  • Изменённые значения повторно шифруются с учётом актуального открытого текста
  • Новые ключи шифруются автоматически
  • Зашифрованный файл изменяется только при необходимости

Такое идемпотентное поведение гарантирует, что:

  1. Git-диффы остаются минимальными и содержательными
  2. Вы можете безопасно запускать команды шифрования несколько раз
  3. Только реальные изменения приводят к обновлениям в системе контроля версий

Автоматическое управление .gitignore

Talm автоматически управляет вашим файлом .gitignore, чтобы конфиденциальные файлы никогда не были случайно закоммичены:

  • secrets.yaml — секреты в открытом виде (никогда не коммитьте)
  • talosconfig — конфигурация Talos в открытом виде (никогда не коммитьте)
  • kubeconfig — конфигурация Kubernetes в открытом виде (никогда не коммитьте)
  • talm.key — ваш ключ шифрования (никогда не коммитьте)

Зашифрованные версии (*.encrypted.yaml, *.encrypted) предназначены для коммита в ваш репозиторий, поскольку их безопасно хранить в системе контроля версий.

Лучшие практики безопасности

Создавайте резервную копию ключа шифрования

После того как talm init создаст новый talm.key, вы увидите предупреждение о безопасности:

┌──────────────────────────────────────────────────────────────────────────────┐
│  Security Information                                                        │
├──────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│  Sensitive files (secrets.yaml, talosconfig, talm.key) have been added to    │
│  .gitignore and will not be tracked by git.                                  │
│                                                                              │
│  Important: Please make a backup of your talm.key file.                      │
│                                                                              │
│  The talm.key file is required to decrypt secrets.encrypted.yaml. Without it, │
│  you won't be able to decrypt your encrypted secrets.                         │
│                                                                              │
│  Key location: talm.key                                                      │
│                                                                              │
│  Recommended: Store the backup in a secure location (password manager,        │
│  encrypted storage, or other secure backup solution).                        │
│                                                                              │
└──────────────────────────────────────────────────────────────────────────────┘

Всегда создавайте резервную копию файла talm.key! Без него вы не сможете расшифровать свои секреты. Храните его в безопасном месте, например:

  • В менеджере паролей
  • В зашифрованном хранилище (например, на зашифрованном USB-накопителе)
  • В надёжном решении для резервного копирования

Права доступа к файлам

Talm автоматически устанавливает безопасные права доступа к файлам:

  • secrets.yaml, talosconfig и kubeconfig создаются с правами chmod 600 (чтение/запись только для владельца)
  • Это гарантирует, что только владелец файла может читать эти конфиденциальные файлы

Пример рабочего процесса

Вот типичный рабочий процесс управления секретами с Talm v0.17:

  1. Инициализируйте новый проект:

    talm init -p cozystack
    

    Это создаёт все необходимые файлы и автоматически их шифрует.

  2. Внесите изменения в секреты:

    # Отредактируйте kubeconfig
    vim kubeconfig
    
  3. Повторно зашифруйте после изменений:

    talm init -e
    

    Будут повторно зашифрованы только изменённые значения.

  4. Закоммитьте зашифрованные файлы в Git:

    git add secrets.encrypted.yaml talosconfig.encrypted kubeconfig.encrypted
    git commit -m "Update encrypted secrets"
    
  5. На новой машине расшифруйте файлы:

    # Сначала скопируйте talm.key на новую машину!
    talm init -d
    

Интеграция с существующими рабочими процессами

Шифрование в Talm без проблем интегрируется с существующими GitOps-процессами:

  • CI/CD-конвейеры могут расшифровывать файлы с помощью talm init -d, если у них есть доступ к talm.key
  • Командная работа упрощается: зашифрованными файлами можно обмениваться через Git, а ключ передаётся безопасно по другим каналам
  • Журналы аудита сохраняются: все изменения зашифрованных файлов отслеживаются в истории Git

Что дальше?

Возможность шифрования в Talm v0.17 обеспечивает прочную основу для безопасного управления секретами. Будущие релизы могут включать:

  • Поддержку нескольких получателей (участники команды смогут расшифровывать своими собственными ключами)
  • Интеграцию с аппаратными модулями безопасности (HSM)
  • Возможности автоматической ротации ключей
  • Интеграцию с внешними системами управления ключами

Заключение

Встроенное шифрование age в Talm v0.17 значительно упрощает управление конфиденциальными конфигурационными файлами в Git-репозиториях с соблюдением лучших практик безопасности. Идемпотентное поведение шифрования, автоматическое управление .gitignore и SOPS-подобный формат создают бесшовный опыт для команд, внедряющих GitOps-процессы с Talos Linux.

Управляете ли вы одним кластером или несколькими окружениями, возможности шифрования Talm помогают поддерживать безопасность, не жертвуя удобством управления конфигурацией в системе контроля версий.

Начало работы

  • GitHub: github.com/cozystack/talm
  • Документация: см. README для подробных примеров использования
  • Сообщество: присоединяйтесь к чату в Telegram, чтобы обсудить Talm и получить помощь

Благодарности

Talm разрабатывается в рамках проекта Cozystack и распространяется под лицензией Apache 2.0. Мы приветствуем вклад и отзывы от сообщества!