Перенесены секреты из .env в SM

This commit is contained in:
mi
2026-07-30 19:22:48 +03:00
parent 049c45db5c
commit e24ed9d8ef
58 changed files with 3350 additions and 1054 deletions
+24 -11
View File
@@ -344,7 +344,7 @@ git status --short
- [ ] SBOM/vulnerability scan без unresolved critical/high.
- [ ] Root Compose — единственный production entrypoint.
## 9. Stage 6 — `.env` и secrets
## 9. Stage 6 — несекретный `.env` и runtime secrets
### 9.1. Создание
@@ -355,19 +355,24 @@ cp .env.example .env
chmod 600 .env
```
Генерировать минимум 256-bit:
`.env` содержит только несекретный config и `SECRETS_SOURCE=file|selectel`.
Пароли, токены, access keys, credential-bearing DSN и `*_FILE` пути в нём
запрещены. Секреты выдаёт единый интерфейс:
```bash
openssl rand -hex 32
deployment/secrets/han-secrets run --config .env -- <command>
```
Не выполнять `export SECRET=...` в shared shell history. Использовать editor с restricted permissions или secret manager/secret files.
Launcher устанавливает `HAN_SECRETS_ACTIVE=1`, не выводит значения и может
передать paths-only manifest через `HAN_RUNTIME_SECRET_MANIFEST`. Файлы manifest
должны быть абсолютными, недоступными group/other. Генерацию выполняет secret
manager; не выполнять `export SECRET=...` и не вставлять значения в history.
### 9.2. Обязательные группы
- `APP_ENV`, release/version, log level;
- private PG host/port/database, TLS CA и runtime DSN;
- Redis ACL credentials/URLs DB0/1/2;
- private PG host/port/database и TLS CA в config; runtime DSN в secret backend;
- Redis ACL credentials/URLs DB0/1/2 только в secret backend;
- public web/API/auth URLs;
- Keycloak realm/audience/hostname/bootstrap/provider technical secrets;
- SMS DB URL, парные Keycloak↔SMS tokens, Direct `TOKEN_1`, callback URL и отдельные callback credentials;
@@ -390,9 +395,10 @@ Service token и webhook token — разные secrets.
### 9.3. Validation
Добавить/запустить `scripts/validate-env`:
Запустить `scripts/validate-env` в двух независимых режимах:
- mandatory not empty;
- config: mandatory not empty, `SECRETS_SOURCE`, запрет secret keys/DSN credentials;
- runtime: manifest/files или child environment без печати значений;
- нет `change-me`, example IP/domain, default OTP;
- URLs have correct schemes;
- public URLs HTTPS, internal URLs service DNS;
@@ -409,14 +415,18 @@ Service token и webhook token — разные secrets.
```bash
cd <BACKEND_ROOT>
./scripts/validate-env .env
docker compose config --quiet
sudo systemctl restart han-secrets@production.service
sudo ./scripts/validate-env .env \
--runtime-manifest /run/han-chat/secrets/manifest
sudo deployment/secrets/han-compose config --quiet
```
`docker compose config` может раскрыть resolved secrets; не сохранять/публиковать его stdout.
### Gate 6
- [ ] `.env` mode 0600, отсутствует в git.
- [ ] `.env` отсутствует в git и содержит только несекретный config.
- [ ] Secret launcher и permissions manifest/files проверены.
- [ ] Все placeholder/default secrets отклонены.
- [ ] Paired tokens совпадают.
- [ ] DSN private/TLS; URLs/issuer согласованы.
@@ -1000,10 +1010,13 @@ DB backup включает realm/users/signing keys/provider data. Secret-free r
4. остановить новые claims/send при возможности;
5. переключить image tags на previous digests;
6. не выполнять Alembic downgrade;
7. `docker compose up -d`;
7. `SCHEMA_BACKWARD_COMPATIBLE_CONFIRMED=true deployment/scripts/rollback.sh <PREVIOUS_IMMUTABLE_RELEASE>`;
8. health/smoke/idempotency;
9. проверить outbox/inbox/SMS pending/uncertain/recovery.
Используется текущий runtime secret set и текущий несекретный config. Snapshot
старого `.env` не создаётся и не применяется.
### После backward-incompatible migration
Обычный rollback запрещён. Выбор: