Перейти к содержанию

Управление секретами (chutils secrets)

Команда chutils secrets позволяет безопасно сохранять и удалять API-ключи, пароли и другие чувствительные данные в системном хранилище учетных записей ОС (Windows Credential Manager, macOS Keychain, Linux Secret Service).

Благодаря этому вы можете исключить хранение секретов в открытом виде в исходном коде или конфигурационных файлах.

[!IMPORTANT] Начиная с версии 3.0.0, библиотека keyring является опциональной зависимостью. Если она не установлена, команды chutils secrets скрываются из вывода --help, а при их прямом вызове выводится ошибка: Missing optional dependency: please install chutils[keyring] to use this command. Для использования команд управления секретами установите зависимость с помощью: bash pip install "chutils[secrets]"


Синтаксис

chutils secrets [-h] {set,delete,get} ...

Подкоманды:

  1. set — Сохранить или обновить секрет в хранилище.
  2. delete — Удалить секрет из хранилища.
  3. get — Получить значение секрета из хранилища.

secrets set

Записывает зашифрованный секрет под определенным ключом для вашего приложения.

Синтаксис подкоманды:

chutils secrets set [-h] [-s SERVICE] key value

Аргументы и опции:

Параметр Альтернатива Описание Обязательный
key positional Имя ключа секрета (например, DATABASE_PASSWORD, STRIPE_API_KEY). Да
value positional Текстовое значение секрета. Да
-s --service Имя сервиса/приложения. Если не указано, берется значение Secrets.service_name из config.yml. Нет

Примеры использования:

Сохранение пароля базы данных для дефолтного сервиса:

chutils secrets set DB_PASSWORD "My_Super_Secret_Pass_123"

Вывод в консоль:

 [OK]  Секрет 'DB_PASSWORD' успешно сохранен в системном хранилище.

Сохранение приватного ключа API для конкретного приложения my_payment_gateway:

chutils secrets set STRIPE_KEY "sk_test_51Nz..." --service my_payment_gateway

secrets delete

Удаляет секретный ключ из системного хранилища.

Синтаксис подкоманды:

chutils secrets delete [-h] [-s SERVICE] key

Аргументы и опции:

Параметр Альтернатива Описание Обязательный
key positional Имя ключа для удаления. Да
-s --service Имя сервиса. Должно совпадать с тем, которое использовалось при сохранении секрета. Нет

Примеры использования:

Удаление секрета:

chutils secrets delete DB_PASSWORD

Вывод в консоль:

 [OK]  Секрет 'DB_PASSWORD' успешно удален.

Попытка удаления несуществующего секрета или с неправильным именем сервиса:

chutils secrets delete INVALID_KEY --service wrong_app

Вывод в консоль (красным):

Error: Не удалось удалить секрет 'INVALID_KEY' или он не существовал.
Совет: Проверьте правильность ключа и имени сервиса.

secrets get

Получает значение секрета из системного хранилища.

Синтаксис подкоманды:

chutils secrets get [-h] [-s SERVICE] [--fallback FALLBACK] [--required] key

Аргументы и опции:

Параметр Альтернатива Описание Обязательный
key positional Имя ключа секрета (например, DB_PASSWORD, STRIPE_KEY). Да
-s --service Имя сервиса/приложения. Если не указано, берется значение Secrets.service_name из config.yml. Нет
--fallback none Значение по умолчанию, возвращаемое если секрет не найден. Нет
--required none Требовать наличие секрета (вызовет ошибку, если секрет не найден). Нет

Примеры использования:

Получение существующего секрета:

chutils secrets get DB_PASSWORD

Вывод в консоль:

My_Super_Secret_Pass_123

Получение отсутствующего секрета с fallback значением:

chutils secrets get STRIPE_KEY --fallback "default_key"

Вывод в консоль:

default_key

Получение обязательного секрета, которого нет в хранилище:

chutils secrets get MISSING_KEY --required

Вывод в консоль (красным с ошибкой):

Error: Ошибка менеджера секретов: Secret 'MISSING_KEY' not found in the service 'Chutils_default_service'

Безопасность и интеграция

Записанные через CLI секреты автоматически считываются в коде приложения с помощью класса SecretManager:

from chutils.secret_manager import SecretManager

# Программа автоматически найдет ключ в Keychain / Credential Manager
sm = SecretManager(service_name="my_app")
api_key = sm.get_secret("STRIPE_KEY")

[!IMPORTANT] При использовании SecretManager все секреты автоматически маскируются (скрываются) в логах приложения, созданных через setup_logger().