simbiot-harness/docs/KEYS-REGISTRY.md
Simbiot Harness e8f18dd7c0 docs: реестр ключей и секретов хоста (t-260930061207) — пути и описания, без значений
Инвентаризация: .env харнеса, наследие Гермеса (~/.hermes: .env, config.yaml,
auth.json, chain-key.json, telegram_config.yaml), systemd inline-секреты,
/root и /opt .env-файлы (coop, 9router, litellm, deip, jitsi, cal-diy,
chatwoot, documenso, kan, rallly, espocrm, vexa, totem), git-история .env.
Фиксы в рамках тика: 644->600 на 11 файл, бэкапы state.db 600 + umask 077.
Рекомендации: EnvironmentFile для systemd, filter-repo перед push,
Bitwarden Secrets Manager (интеграция уже в конфиге Гермеса, disabled).
2026-09-30 09:05:29 +00:00

81 lines
No EOL
9.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Реестр ключей и секретов хоста (только пути и описания, БЕЗ значений)
Дата: 2026-09-30. Составил: часовой поток Simbiot Harness (t-260930061207-617c69).
Правило: значения секретов в чат/файлы отчётов не выводятся — только пути и назначение.
## 1. Simbiot Harness (активный, владелец: харнес)
| Путь | Что | Права | Бэкап | Ротация |
|---|---|---|---|---|
| `/root/simbiot-harness/.env` | ROUTER_KEY, OPENROUTER_KEY, SIMBIOT_TG_TOKEN, SIMBIOT_TG_ALLOWED, ROUTER/OPENROUTER_BASE_URL | 600 | да (см. §6) | ROUTER_KEY — по политике 9router; TG-токен — при подозрении |
| `/etc/simbiot/dashboard.env` | SIMBIOT_DASH_TOKEN (страница + /api/state, порт 8765 **открыт наружу 0.0.0.0**) | 600 | да | при демобилизации дашборда |
| git-история `/root/simbiot-harness` | `.env` с ROUTER_KEY (коммит 6236044) и SIMBIOT_TG_TOKEN (2f758bb) лежит в истории; убран в e6a99ce | — | n/a | **remote нет** → наружу не утёк; перед любым push: purge истории (`git filter-repo`) или ротация ключей |
## 2. Наследие агента Гермес (живое, сервисы active)
| Путь | Что | Права | Примечание |
|---|---|---|---|
| `/root/.hermes/.env` (+ `.env.bak.tok-5673079687`) | ~30 ключей: TELEGRAM_BOT_TOKEN/TOKEN, OLLAMA_API_KEY, KIE/KIMI_API_KEY, RESEND_API_KEY, X_* (OAuth Twitter, 8 шт: consumer/access/refresh/bearer), MATRIX_ACCESS_TOKEN, SIMPLEX_*, 9ROUTER_CIL_API_KEY, HERMES_CUSTOM_*_API_KEY, 42admin-*, OIDC-токены профиля | 600 | `.env.bak.*` — тот же набор, дубликат ротации токена |
| `/root/.hermes/profiles/coop-group/.env` | TELEGRAM_BOT_TOKEN (групповой бот), KIMI/OLLAMA_API_KEY, 9ROUTER_CIL_API_KEY, HERMES_CUSTOM_ROUTER_CIL_BY_API_KEY | 600 | профиль кооп-чата |
| `/root/.hermes/config.yaml` (+ 8 бэкапов `config.yaml.bak.*`) | api_key у ~10 провайдеров (9router, ollama-cloud, kimi-coding, glm-coding, 9router-remote, 9router-cil…), password_hash, token_analytics | 600 | бэкапы копируют те же ключи |
| `/root/.hermes/auth.json` | credential_pool: kimi-coding, zai, openrouter, custom:9router(-remote/-cil), glm-coding, ollama-cloud, nous (OAuth client_id) | 600 | актуальный пул кредов LLM-провайдеров |
| `/root/.hermes/profiles/coop-group/auth.json` | тот же пул для профиля coop-group | 600 | |
| `/root/.hermes/chain-key.json` | **приватный ключ блокчейна** (address + private_key, кооп 42) | 600 | критично; бэкап обязателен, ротация невозможна без смены адреса |
| `/root/.hermes/harness-attest.json` | аттестационный чек (root/tx/files/bytes/ts) — не секрет | 600 | не бэкапить отдельно |
| `/root/.hermes/telegram_config.yaml` | token TG | 600 | |
| `/etc/systemd/system/hermes-api.service` | **ADAPTER_KEYS inline** (ключ доступа к локальному OpenAI-адаптеру) | 600 (было 644 — исправлено) | см. §5 рекомендация |
| `/root/hermes-api/.key` | ключ адаптера (тот же) | 600 | адаптер слушает только 127.0.0.1:9100 |
| `/root/.hermes/state.db` (+ бэкапы `/root/backups/hermes/state.db.*.bak.zst`, 644, ротация 14) | SQLite агента — внутри сессии/токены в истории | 600 | бэкапы содержат секреты, права нести в 600 |
## 3. Инфраструктура кооператива (/root, /opt)
| Путь | Что | Права | Примечание |
|---|---|---|---|
| `/root/coop/.env` | HETZNER_API_TOKEN, STRIPE_(LIVE/TEST)_KEY, STRIPE_WEBHOOK_SECRET, RESEND_API_KEY, HARNESS_TOKEN, TIME_REPORT_TOKEN, SALARY_CRON_TOKEN, STUDIO_ADMIN_KEY, LIVE_MONITOR_TOKEN, MAGIC_SEND_SECRET, GOOGLE_AI_KEY | 600 | ядро биллинга коопа |
| `/root/rag/.env` | RAG_API_KEY (публичный сервис RAG) | 600 | |
| `/root/litellm/.env` | LITELLM_MASTER_KEY, ZAI/KIMI/OLLAMA_API_KEY ×4, POSTGRES_PASSWORD | 600 | |
| `/root/9router/.env` | JWT_SECRET, INITIAL_PASSWORD, API_KEY_SECRET, MACHINE_ID_SALT, OLLAMA_CLOUD_API_KEY | 600 (было 644 — исправлено) | сервис слушает **0.0.0.0:20128** |
| `/root/deip/.env` | DEIP_ADMIN_TOKEN, STRIPE_* (live+test+webhooks), RESEND_API_KEY, OLLAMA_API_KEY | 600 (было 644) | |
| `/root/jitsi/.env` | JICOFO/JVB/JIGASI XMPP-пароли, JIGASI_TRANSCRIBER_PASSWORD | 600 (было 644) | |
| `/root/cal-diy/.env` | CALCOM_DB_PASSWORD, NEXTAUTH_SECRET, CALENDSO_ENCRYPTION_KEY, SSO42_CLIENT_SECRET | 600 (было 644) | |
| `/root/chatwoot/.env` | POSTGRES/REDIS_PASSWORD, SECRET_KEY_BASE, C42_CLIENT_ID(+secret) | 600 (было 644) | |
| `/opt/documenso/.env` | POSTGRES_PASSWORD, NEXTAUTH_SECRET, NEXT_PRIVATE_ENCRYPTION_KEY ×2, SMTP_PASSWORD, OIDC_CLIENT_SECRET, SIGNING_PASSPHRASE | 600 | |
| `/opt/kan/.env` | POSTGRES_PASSWORD, BETTER_AUTH_SECRET, OIDC_CLIENT_SECRET | 600 | |
| `/opt/rallly/.env` | SECRET_PASSWORD, OIDC_CLIENT_SECRET, SMTP_PWD, POSTGRES_PASSWORD, S3_ACCESS_KEY_ID/SECRET, GARAGE_RPC_SECRET | 600 | |
| `/opt/espocrm/compose.yml` | **inline**: MARIADB_ROOT/USER_PASSWORD, ESPOCRM_ADMIN_PASSWORD (admin: alex), ESPOCRM_DATABASE_PASSWORD | 600 (было 644 — исправлено) | вынести в .env или secrets |
| `/opt/hermes-agent/.env` | OPENROUTER_API_KEY, GLM_API_KEY, TELEGRAM_BOT_TOKEN, KIMI_API_KEY | 600 (было 644) | |
| `/opt/apps/totem-platform/.env` | STRIPE_WEBHOOK_SECRET | 600 (было 644) | |
| `/opt/vexa/.env` | TRANSCRIPTION_SERVICE_TOKEN, пароли/ключи портов сервисов | 600 (было 644) | |
| `/root/docker-compose.openclaw.yml` | OPENCLAW_GATEWAY_PASSWORD **inline в командной строке** | 600 (было 644 — исправлено) | |
| `/root/.config/claude-code/env` | CLAUDE_CODE_OAUTH_TOKEN; router-env: ANTHROPIC_API_KEY (через 9router) | 600 | |
| `/root/.openclaw/credentials/` | telegram-default-allowFrom.json, telegram-pairing.json | 600, dir 700 | |
| `/root/.docker/.token_seed` | seed docker-токенов | 600, dir 700 | |
| `/root/.config/gogcli/` | gog-credentials (OAuth google) | 600 | |
| `~/.ssh` | **пусто** — приватных SSH-ключей пользователя нет | — | |
| `/etc/ssh/ssh_host_*_key` | host-ключи сервера | 600 | бэкапить при DR |
| systemd `simbiot-*.service` | секретов нет (токены в .env/dash-env) | 644 | |
## 4. Отсутствует / не найдено
- `~/.ssh/` — нет ни приватных ключей, ни known_hosts: доступ наружу по SSH не хранится.
- `/root/.git-credentials`, `.netrc`, `.pypirc` — нет.
- `/etc/docker/` — нет registry-секретов (auths пуст).
- Bitwarden-интеграция в `config.yaml` (`secrets.bitwarden`) — **disabled**, пароль-менеджер не подключён.
- crontab `/root/coop/scripts/*` — inline-секретов нет (ключи тянутся из .env coop).
## 5. Рекомендации
1. **Права**: исправлено в этом тике — 11 файлов с 644→600 (espocrm compose, hermes-agent, 9router, deip, jitsi, cal-diy, chatwoot, openclaw, totem-platform, vexa, hermes-api.service). На хосте есть не-root юзер `swarm` (uid 1000, bash) — мир-читаемые секреты были ему доступны.
2. **systemd с inline-секретами** (`hermes-api.service`, openclaw): перенести в `EnvironmentFile=` с правами 600.
3. **git-история харнеса**: `.env` с ROUTER_KEY+SIMBIOT_TG_TOKEN в коммитах 6236044/2f758bb. Репо без remote → утечки не было. Перед push: `git filter-repo --path .env --invert-paths` (или ротация обоих ключей).
4. **Бэкап state.db** (`/root/backups/hermes/`) содержит сессии/креды: chmod 600 на `*.bak.zst` и добавить в скрипт `umask 077`.
5. **Экспозиция**: dashboard 8765 и 9router 20128 слушают 0.0.0.0 — dashboard за токеном (ок), 9router — проверить firewall/привязку, JWT_SECRET и API_KEY_SECRET живут в его .env.
6. **Куда выгрузить копию** (реестр+значения):
- зашифрованный архив возрастом/age: `age -r <public-key> secrets.tar.age` → выгрузить в S3 Garage (уже есть S3_ACCESS_KEY_ID у rallly) или Hetzner Storage Box;
- preferable: поднять Bitwarden Secrets Manager — интеграция уже есть в конфиге Гермеса (`secrets.bitwarden.enabled: false` → true), это даёт центральное хранение + ротацию + TTL;
- критичный минимум для DR: chain-key.json (приватный ключ коопа), coop/.env (Stripe live + Hetzner), .hermes/.env (X OAuth refresh-токены невосстановимы!), hermes-api adapter key.
7. **Ротация**: X_OAUTH2_USER_REFRESH_TOKEN — одноразовый по природе, копию держать обязательно; STRIPE_LIVE_KEY + HETZNER_API_TOKEN — ротация раз в 90 дней; ADAPTER_KEYS — сменить и разнести по файлу (см. п.2).
## 6. Хранение этого реестра
Сам реестр значений не содержит и безопасен в git. Значения секретов в него не заносить.