Управление секретами (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} ...
Подкоманды:
set— Сохранить или обновить секрет в хранилище.delete— Удалить секрет из хранилища.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().