Как работал с секретами

Ответ

В моей практике работа с секретами строилась на принципе "секреты — это данные в движении, а не в покое", с использованием HashiCorp Vault в качестве центрального хранилища.

1. Хранение и управление:

  • Все секреты (пароли БД, TLS-сертификаты, API-ключи) хранились в Vault с включенным аудитом всех операций чтения.
  • Использовались динамические секреты для БД PostgreSQL: Vault по запросу создавал пользователя с паролем, действительным 1 час, что сводило риск утечки к минимуму.

2. Интеграция в CI/CD и runtime:

  • В CI/CD (GitLab): Для доступа к Vault использовался JWT-токен, который GitLab CI генерировал для каждого джоба. Скрипт получал временный токен Vault и выгружал секреты в переменные окружения пайплайна.
  • В Kubernetes: Использовался Vault Agent Injector (sidecar). Аннотации в манифесте Pod указывали, какие секреты нужны, и Injector автоматически монтировал их в контейнер как файлы в tmpfs или обновлял переменные окружения.
    apiVersion: v1
    kind: Pod
    metadata:
    annotations:
    vault.hashicorp.com/agent-inject: "true"
    vault.hashicorp.com/role: "app-role"
    vault.hashicorp.com/agent-inject-secret-db-creds: "database/creds/app-role"
    spec:
    containers:
    - name: app
    image: myapp:latest

3. Ротация и аварийные процедуры:

  • Критические секреты (например, root-сертификаты) имели настроенную автоматическую ротацию в Vault.
  • У нас были четкие runbook'и на случай компрометации, которые включали немедленную ревокацию всех токенов определенного типа и генерацию новых секретов через Vault.

Ответ 18+ 🔞

Слушай, история с секретами — это вообще отдельный вид искусства, почти как разминировать бомбу в темноте. Одно неверное движение, и будет вам хиросима и никаких сраков. Раньше, бывало, пихали пароли прямо в код, как последние распиздяи, а потом охуевали, когда всё накрывалось медным тазом.

Так вот, моя философия была простая: секрет должен жить, двигаться, а не лежать мёртвым грузом в конфиге. Всё крутилось вокруг HashiCorp Vault, это наша святая святых, наш цифровой сейф с кучей замков.

1. Где всё лежало и как управлялось:

  • Всё, от пароля к базе до какого-нибудь левого API-ключа, — всё летело в Vault. И главное — аудит включён на всё, кто что прочитал, записал или даже посмотрел косо — всё в логах. Доверия, блядь, ноль, даже к себе.
  • Самый кайф — это динамические секреты для PostgreSQL. Представь: приложению нужен доступ к базе. Оно стучится в Vault, а Vault ему: «Хорошо, чувак, держи временного юзера с паролем на один час». Час прошёл — пользователь сгорает. Утечка? Да похуй, этот пароль уже мусор. Это жёстко, но эффективно.

2. Как это всё впихивали в процессы:

  • В CI/CD (GitLab): Тут была хитрая схема. Каждый джоб в пайплайне получал от GitLab свой JWT-токен. Наш скрипт брал этот токен, шёл с ним в Vault и говорил: «Видишь? Я свой, дай мне временный доступ». Vault выдавал токен на пять минут, и скрипт выгружал нужные секреты прямо в переменные окружения джоба. Никаких статических ключей в настройках GitLab — красота.
  • В Kubernetes: Тут вообще магия происходила через Vault Agent Injector. Это такой sidecar-контейнер. Ты в манифесте Pod'а просто пишешь аннотации: «Мне вот такой секрет нужен». А этот инжектор, как хитрая жопа, всё подтягивает сам и подсовывает твоему основному контейнеру — либо как файл в оперативке (tmpfs), либо прямо в переменные окружения подменяет. Гениально и не надо ничего руками таскать.
apiVersion: v1
kind: Pod
metadata:
  annotations:
    vault.hashicorp.com/agent-inject: "true"
    vault.hashicorp.com/role: "app-role"
    vault.hashicorp.com/agent-inject-secret-db-creds: "database/creds/app-role"
spec:
  containers:
  - name: app
    image: myapp:latest

3. Что делать, когда всё идёт по пизде:

  • Критические штуки, вроде корневых сертификатов, умели сами обновляться по расписанию внутри Vault. Не надо было бегать с криком «ротируйте всё!».
  • Но самое главное — у нас были чёткие инструкции (runbook'и) на случай, если что-то всё же уплыло. Подозрение, блядь, чувствую — сразу в бой. По сценарию: мгновенно отзываем все токены такого-то типа в Vault (всё, они стали куском говна), потом через него же генерируем новые секреты и раскатываем на все сервисы. Паника? Нет, просто рабочий день. Волнение, ебать, было только первые два раза, потом привыкаешь.

В общем, подход «секреты в движении» — это не просто красивые слова. Это когда ты перестаёшь бздеть от каждого чиха в логах и спишь чуть спокойнее. Ну, относительно спокойнее, в нашей-то профессии.