6.5 KiB
Runbook безопасности production-секретов
Этот документ описывает действия оператора, которые нельзя выполнять автоматически из репозитория. Он не содержит и не должен содержать значения секретов, паролей, токенов, cookie или строк подключения.
Обязательные Kubernetes Secrets
Production-манифесты только ссылаются на заранее созданные объекты:
| Secret | Обязательные ключи | Потребитель |
|---|---|---|
app-secret |
JWT_SECRET, POSTGRES_USER, POSTGRES_PASSWORD |
Backend |
tenants-secret |
tenants.json |
Backend, файл /config/tenants.json |
otel-postgres-secret |
MAGISTR_DB_ENDPOINT, MAGISTR_DB_USERNAME, MAGISTR_DB_PASSWORD, MAGISTR_DB_NAME, N8N_DB_ENDPOINT, N8N_DB_USERNAME, N8N_DB_PASSWORD, N8N_DB_NAME |
OTel Collector |
gitea-registry |
стандартный ключ Docker registry | Kubernetes image pull |
Предпочтительный источник — External Secrets, SOPS/Sealed Secrets либо корпоративный secret manager. Kubernetes Secret, созданный вручную, допустим как переходный вариант, если в кластере включено шифрование etcd и значения никогда не сохраняются в Git.
Для переходного создания из защищённых файлов на рабочей станции оператора:
kubectl create namespace magistr --dry-run=client -o yaml | kubectl apply -f -
kubectl -n magistr create secret generic app-secret \
--from-env-file=/secure/path/app-secret.env \
--dry-run=client -o yaml | kubectl apply -f -
kubectl -n magistr create secret generic tenants-secret \
--from-file=tenants.json=/secure/path/tenants.json \
--dry-run=client -o yaml | kubectl apply -f -
kubectl -n magistr create secret generic otel-postgres-secret \
--from-env-file=/secure/path/otel-postgres-secret.env \
--dry-run=client -o yaml | kubectl apply -f -
Не перенаправляйте YAML из этих команд в файл и не используйте kubectl get secret -o yaml в логах CI/CD.
Порядок ротации
- Зафиксировать владельца, область и версию каждого скомпрометированного значения в закрытой системе управления инцидентами.
- Создать новые значения средствами secret manager. JWT-ключ должен быть криптографически случайным и содержать не менее 32 байт.
- Сначала сменить пароли в каждой tenant-БД, затем атомарно обновить соответствующую версию
tenants-secret. - Обновить OTel credentials и
otel-postgres-secret, после чего перезапустить только collector и проверить поступление метрик. - Обновить
JWT_SECRETвapp-secretи выполнить контролируемый rollout backend. Смена ключа немедленно аннулирует ранее выданные access JWT. - Если политика инцидента требует завершить все пользовательские сессии, очистить
auth_refresh_tokensотдельно в каждой tenant-БД через утверждённую DBA-процедуру. Эта операция не должна затрагивать пользователей или демонстрационные данные. - Проверить readiness, вход, refresh, logout и доступ каждого tenant. Только после этого отозвать предыдущие версии DB/OTel credentials в secret manager.
- Хранить предыдущую версию секрета только в защищённом менеджере на период согласованного rollback window; не создавать резервные YAML-файлы.
Команда ../k8s/deploy.sh проверяет наличие объектов и обязательных ключей, но намеренно не читает и не выводит их значения.
Очистка истории
Переписывание истории и force-push выполняются только после отдельного согласования со всеми владельцами клонов и CI/CD:
-
Создать закрытый mirror-клон и резервную копию refs.
-
Подготовить вне репозитория файл замен для
git filter-repo; не помещать исходные или новые значения в аргументы shell, issue или CI-логи. -
Запустить в mirror-клоне:
git filter-repo --replace-text /secure/path/replacements.txt --force -
Выполнить secret scan переписанной истории и проверить теги/ветви.
-
В согласованное окно выполнить force-push, инвалидировать старые CI caches/artifacts и потребовать повторное клонирование.
-
Отдельно проверить историю репозитория, которому принадлежат файлы
../k8s/: эта директория не входит в Git-корень Magistr.
Переписывание истории не заменяет ротацию: опубликованные значения считаются скомпрометированными даже после удаления из Git.
Проверка после rollout
bash ../k8s/deploy.sh status
kubectl rollout status deployment/backend -n magistr --timeout=300s
kubectl rollout status deployment/otel-collector-db -n magistr --timeout=180s
Дополнительно оператор должен проверить audit-события secret manager, шифрование etcd, минимальные RBAC-права и отсутствие значений секретов в логах, событиях pod и артефактах CI.