Перенесены секреты из .env в SM
This commit is contained in:
@@ -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 запрещён. Выбор:
|
||||
|
||||
Reference in New Issue
Block a user