Пост

Платформа для управления секретами 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), здесь сразу предлагается создать аккаунт администратора. Создаем и попадаем в панель управления.

⚒️ Подготовка

Создадим тестовый проект, пользователя и несколько секретов.

  1. В панели управления в разделе Access Control создадим нового пользователя (Add Member), для подтверждения которого будет сформирована ссылка (если smtp настроен, то приглашение упадет на почту пользователя, иначе просто выведется в окне). Подтверждаем переходом по ссылке.
  2. В этом же разделе на вкладке Machine Identities создадим клиента. Запоминаем полученный Client ID.
  3. Провалившись в созданного клиента в подразделе Authentication создаем ключ клиента Create Client Secret и тоже его запоминаем.
    • И пользователю и клиенту выдаются права обычного пользователя (Member).
    • Пользователь необходим для доступа к панели управления, а клиент для будущих запросов из приложения.
  4. В разделе Secret Management создаем новый проект (Add New Project).
  5. Проваливаемся в проект. В разделе Access Control на вкладке Users добавляем созданного ранее пользователя, а на вкладке Machine Identities добавляем созданного ранее клиента.
  6. В разделе Secrets создаем тестовые секреты. Заметим, что они могут быть распределены по разным окружениям (dev, staging, prod), а также сопровождены тэгами.
  7. Из Project Settings копируем Project ID.
    • У меня не сработало копирование в буфер кнопкой, поэтому пришлось взять из адресной строки http://localhost/secret-manager/5c141cf2-8724-4c13-8b64-38061e313860/settings, где 5c141cf2-8724-4c13-8b64-38061e313860 и есть искомый Project ID.
    • Здесь же можно настроить окружение и тэги для секретов.
  8. Подготовительные манипуляции сделали, теперь можно попробовать запросить ключи.

🚀 Получение доступа к секретам с использованием 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 для формирования переменных окружения контейнера в реальном времени, что исключает необходимость прямой передачи секретов.

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

Больше полезной информации в Telegram-канале