Vault Client¶
Модуль vault предоставляет клиент для безопасной работы с HashiCorp Vault - системой для хранения и управления секретами. Основной класс VaultClient инкапсулирует всю логику взаимодействия с Vault API, включая аутентификацию и чтение секретов.
Особенности¶
- Поддержка аутентификации с помощью токена
- Автоматическая обработка KV Secrets Engine v2
- Полностью асинхронный API
- Расширенная обработка ошибок с конкретными типами исключений
- Логирование всех операций
Документация API¶
VaultClient¶
Клиент для работы с HashiCorp Vault - системой для безопасного хранения секретов.
Позволяет получать секреты из Vault с использованием токена аутентификации.
Пример использования
Инициализация клиента¶
vault = VaultClient( addr='http://localhost:8200', # Адрес Vault сервера token_file='/path/to/token' # Файл с токеном доступа )
Получение секрета¶
secret = vault.read_secret('путь/к/секрету')
Примечание
- Для работы требуется настроенный и запущенный сервер Vault
- Токен доступа должен иметь права на чтение запрашиваемых секретов
- По умолчанию используется KV Secrets Engine версии 2
Source code in src/adapters/vault.py
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 | |
__init__(addr: str | None = None, token_file: str | None = None) -> None
¶
Инициализирует клиент Vault с параметрами подключения.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
addr
|
str | None
|
URL сервера Vault. Если не указан, будет прочитан из |
None
|
token_file
|
str | None
|
Путь к файлу с токеном аутентификации Vault. Если не указан, |
None
|
Raises:
| Type | Description |
|---|---|
ValueError
|
Если не указаны параметры addr/token_file и соответствующие |
Source code in src/adapters/vault.py
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | |
get_secret(path: str, key: str | None = None) -> dict[str, Any]
async
¶
Получает секрет из Vault по указанному пути.
Опционально можно передать key - конкретно интересующий ключ по пути
Пример
Получение секрета¶
secret = vault.read_secret('eebook/users/database')
Результат: {'username': 'admin', 'password': 's3cr3t'} # pragma: allowlist secret¶
Использование полученных данных¶
db_user = secret['username'] db_pass = secret['password']
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
path
|
str
|
Путь к секрету в формате 'путь/к/секрету'. Для KV v2 автоматически добавляется префикс 'data/' при необходимости. |
required |
key
|
str | None
|
Название секрета (пр. db_port) |
None
|
Returns:
| Type | Description |
|---|---|
dict[str, Any]
|
Словарь с данными секрета |
Raises:
| Type | Description |
|---|---|
VaultSecretNotFoundError
|
Если секрет не найден по указанному пути |
VaultPermissionError
|
Если недостаточно прав для доступа к секрету |
VaultError
|
При других ошибках при чтении секрета |
Примечания
- Для KV v2 секреты хранятся в формате 'путь/к/секрету', а не в полном пути 'secret/data/путь/к/секрету'
- Метод автоматически обрабатывает версионирование KV v2
Source code in src/adapters/vault.py
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 | |
Примеры использования¶
Инициализация клиента¶
from src.adapters.vault import VaultClient
# Инициализация с явным указанием параметров
vault = VaultClient(
addr='http://localhost:8200', # Адрес сервера Vault
token_file='/path/to/vault/token' # Файл с токеном доступа
)
# Или с использованием переменных окружения
# export VAULT_ADDR='http://localhost:8200'
# export VAULT_TOKEN_FILE='/path/to/vault/token'
vault = VaultClient()
Работа с секретами¶
# Чтение всего секрета
secret = await vault.get_secret('eebook/database')
# Результат: {'username': 'admin', 'password': 's3cr3t'}
# Чтение конкретного ключа из секрета
db_password = await vault.get_secret('eebook/database', key='password')
# Результат: 's3cr3t'
# Обработка ошибок
try:
secret = await vault.get_secret('nonexistent/secret')
except VaultSecretNotFoundError:
print('Секрет не найден')
except VaultPermissionError:
print('Недостаточно прав для доступа к секрету')
except VaultError as e:
print(f'Ошибка Vault: {e}')
Рекомендации по использованию¶
- Безопасность
- Никогда не храните токены в коде или системе контроля версий
- Используйте минимально необходимые права доступа для токенов
-
Регулярно обновляйте токены доступа
-
Обработка ошибок
- Всегда обрабатывайте специфические исключения Vault
- Реализуйте механизм повторных попыток при временных сбоях
-
Логируйте ошибки для последующего аудита
-
Производительность
- Кэшируйте часто используемые секреты на стороне приложения
- Избегайте частых обращений к Vault за одними и теми же данными
-
Используйте пулы соединений для часто используемых клиентов
-
Тестирование
- Используйте моки для тестирования без реального сервера Vault
- Тестируйте различные сценарии ошибок
- Проверяйте обработку отсутствующих или невалидных данных
Обработка ошибок¶
Модуль определяет несколько типов исключений для различных сценариев сбоев:
VaultError: Базовый класс для всех исключений VaultVaultConnectionError: Ошибка подключения к серверу VaultVaultTokenError: Ошибка аутентификации или невалидный токенVaultPermissionError: Недостаточно прав для выполнения операцииVaultSecretNotFoundError: Запрашиваемый секрет не найден
Переменные окружения¶
VAULT_ADDR: URL сервера Vault (например, 'http://localhost:8200')VAULT_TOKEN_FILE: Путь к файлу, содержащему токен аутентификации