Платформа для управления секретами Infisical
Экспериментируя с моделями с Hagging Face наткнулся на информацию о том, что разработчики площадки используют для управления секретами платформу с открытым исходным кодом Infisical - централизованное решение с широким набором возможностей по контролю за конфигурациями, ключами и иными конфиденциальными данными. Ее и развернем локально для проверки предлагаемой функциональности.
📝 Некоторые особенности системы
- Формирование структуры управления с разделением по организациям и проектам.
- Версионирование, откаты и ротация секретов.
- Динамические секреты.
- Синхронизация секретов с другими инструментами, решающими подобную задачу.
- Внутренний центр сертификации (PKI) и управление ключами (KMS).
- Поддержка разнообразных методов аутентификации пользователей.
- Богатый api и наличие sdk для быстрого встраивания в код.
🔨 Установка
🔹 Разворачивать будем self-hosted версию, используя docker. Помимо backend и web ui запускается база postgresql и redis - минимальный набор, которого будет более чем достаточно для небольших команд и организаций.
1
2
3
# забираем compose и .env файлы
wget -O docker-compose.yml https://raw.githubusercontent.com/Infisical/infisical/main/docker-compose.prod.yml
wget -O .env https://raw.githubusercontent.com/Infisical/infisical/main/.env.example
🔹 При публикации в прод нужно сгенерировать собственные ключи доступа, задать пароли и настроить требуемые интеграции со сторонними сервисами. Описание переменных окружения здесь. Для тестового стенда оставим все по умолчанию.
1
2
# запускаем
docker compose up -d
🔹 Идем в приложение на 80 порт (http://localhost), здесь сразу предлагается создать аккаунт администратора. Создаем и попадаем в панель управления.
⚒️ Подготовка
Создадим тестовый проект, пользователя и несколько секретов.
- В панели управления в разделе
Access Controlсоздадим нового пользователя (Add Member), для подтверждения которого будет сформирована ссылка (еслиsmtpнастроен, то приглашение упадет на почту пользователя, иначе просто выведется в окне). Подтверждаем переходом по ссылке. - В этом же разделе на вкладке
Machine Identitiesсоздадим клиента. Запоминаем полученныйClient ID. - Провалившись в созданного клиента в подразделе
Authenticationсоздаем ключ клиентаCreate Client Secretи тоже его запоминаем.- И пользователю и клиенту выдаются права обычного пользователя (
Member). - Пользователь необходим для доступа к панели управления, а клиент для будущих запросов из приложения.
- И пользователю и клиенту выдаются права обычного пользователя (
- В разделе
Secret Managementсоздаем новый проект (Add New Project). - Проваливаемся в проект. В разделе
Access Controlна вкладкеUsersдобавляем созданного ранее пользователя, а на вкладкеMachine Identitiesдобавляем созданного ранее клиента. - В разделе
Secretsсоздаем тестовые секреты. Заметим, что они могут быть распределены по разным окружениям (dev, staging, prod), а также сопровождены тэгами. - Из
Project SettingsкопируемProject ID.- У меня не сработало копирование в буфер кнопкой, поэтому пришлось взять из адресной строки
http://localhost/secret-manager/5c141cf2-8724-4c13-8b64-38061e313860/settings, где5c141cf2-8724-4c13-8b64-38061e313860и есть искомыйProject ID. - Здесь же можно настроить окружение и тэги для секретов.
- У меня не сработало копирование в буфер кнопкой, поэтому пришлось взять из адресной строки
- Подготовительные манипуляции сделали, теперь можно попробовать запросить ключи.
🚀 Получение доступа к секретам с использованием python sdk
🔹 Устанавливаем sdk
1
pip install infisicalsdk
🔹 Записываем в переменные окружения системы полученные Client ID, Client Secret, Project ID
1
2
3
export CLIENT_ID=<my client id>
export CLIENT_SECRET=<my client secret>
export PROJECT_ID=<my project id>
🔹 Обращаемся к Infisical из python скрипта и получаем секреты
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import os
from infisical_sdk import InfisicalSDKClient
# забираем переменные окружения
client_id = os.getenv("CLIENT_ID")
client_secret = os.getenv("CLIENT_SECRET")
project_id = os.getenv("PROJECT_ID")
# инициализация клиента и авторизация
client = InfisicalSDKClient(host="http://localhost")
client.auth.universal_auth.login(client_id=client_id, client_secret=client_secret)
# получаем список всех секретов в dev окружении
secrets = client.secrets.list_secrets(project_id=project_id, environment_slug="dev", secret_path="/")
print(secrets)
# получаем секрет MYAPI_KEY из окружения prod по имени
mysecret = client.secrets.get_secret_by_name(
secret_name="MYAPI_KEY",
project_id=project_id,
environment_slug="prod",
secret_path="/",
)
print(mysecret)
💡 Дополнительно стоит отметить, что система поставляется в том числе в виде cli инструмента, с помощью которого можно как получать и проверять секреты с центрального сервера, генерируя из них переменные окружения или файлы конфигураций, так и анализировать репозитории на утечки секретов по аналогии с уже рассмотренным GitLeaks. Еще одним полезным применением Infisical cli является возможность добавления утилиты прямо в Dockerfile для формирования переменных окружения контейнера в реальном времени, что исключает необходимость прямой передачи секретов.
📌 Решение несложно настраивается, предоставляет широкий набор вариантов интеграции, а в совокупности с целым комплексом решаемых задач станет неплохим подспорьем как для небольшой команды, так и для крупной организации с множеством проектов, где требования контроля и безопасности очень высоки. В качестве примера была рассмотрена одна из наиболее важных функций платформы, отдельного внимания стоят реализации центра сертификации и системы управления ключами.
