env-master
machine identity · envelope-шифрование · аудит каждого чтения

Секреты, которые сервисы забирают сами

Ни SCP по серверам, ни переменных в настройках CI, ни копии в чужом менеджере паролей. При старте сервис сам получает значения по доверенной machine identity — а каждое чтение остаётся в журнале.

billing-api / production
import { EnvMasterClient } from "@env-master/sdk";

const em = new EnvMasterClient({
  baseUrl: process.env.ENVMASTER_URL,
  project: "billing-api",
  environment: "production",
});

await em.loginMachine({
  clientId: process.env.ENVMASTER_CLIENT_ID,
  clientSecret: process.env.ENVMASTER_CLIENT_SECRET,
});

const password = await em.get("DB_PASSWORD");

production

4 ключа
DB_PASSWORD
••••••••••••
PAYMENT_TOKEN
••••••••••••
LOG_LEVELdebug
MACHINE_ONLY_KEYrestricted

Переменные видны сразу, секреты — по явному запросу с записью в аудит, а restricted не показывается человеку вовсе.

Три шага, и деплой перестаёт возить секреты

01

Заведите окружение

Проект, окружения dev/staging/prod и записи в них — переменные видны, секреты скрыты до явного запроса.

02

Выдайте сервису identity

Machine identity привязана к окружению и, если нужно, к набору ключей. Секрет показывается один раз — дальше только его хэш.

03

Уберите .env из деплоя

SDK забирает значения при старте и держит их в памяти процесса. Ротация перестаёт быть событием: сервис читает актуальное значение сам.

Что внутри

Мы защищаем периметр и честно говорим, где он проходит: в покое хранится только шифртекст, но живой процесс сервера видит значения в момент обработки. Слова «zero-knowledge» здесь не будет.

Доставка по identity

Сервис аутентифицируется сам — client credentials или одноразовый enrollment-токен. Повторный обмен токена означает утечку, поэтому он не просто отклоняется, а поднимает тревогу.

Envelope-шифрование

Значение под data key окружения, data key под корневым ключом. Машине ключ выдаётся обёрнутым x25519 под её identity — расшифровка идёт на клиенте.

Ротация без простоя

create → set → test → finish. Новое значение становится текущим только после успешной проверки, до этого лежит под меткой pending и переживает падение.

Аудит каждого чтения

Два потока — изменения и доступы, связанные хеш-цепочкой. В журнал попадают имена ключей и HMAC значения, но никогда само значение.

Скоуп до набора ключей

Identity ограничивается проектом, окружением и списком ключей: сервису биллинга можно выдать DB_*, а не всё окружение целиком.

Мобильный клиент

Лента аудита, тревоги и подтверждения с телефона: доступ к проду подтверждается там, где вы есть, а не там, где открыт ноутбук.

Первый сервис заберёт свои секреты сегодня

Регистрация, проект, ключи — и identity для первого сервиса. Бесплатный план не урезан по безопасности: шифрование, ротация и аудит работают с первой минуты.