simbiot-harness/docs/KEYS-REGISTRY.md
root a964329fdb merge origin/master (32 коммита портального инстанса) + burn-fallback в смерженном aum.py
Разрешены конфликты: isolated_runner (тщательный upstream-вариант killpg-wait), cli.py task-диспетчеризация upstream + guard ValueError, aum.py paths-изоляция + STORE_DB fallback.
Тесты после мерджа: 5 устарели к новой реальности — починены по интентам:
- test_aum 9c: hermetic-мок OPENROUTER_KEY (ключ уехал со старого хоста)
- test_router_env_fallback: патчит paths.env_path (runtime больше не читает _HARNESS_DIR)
- test_submit_title_guard: контракт task list = показ доски (exit 0), а не ERROR
- test_tg_commands: доска задач от тестовой ready-задачи (в прод-копии ready пусто)
- test_instance_isolation: SKIP RAG-контура без вендора /root/rag (хост мигрировал)
Итог: 19/19 зелёные
2026-10-07 11:18:05 +03:00

90 lines
No EOL
12 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**). 02.10 сервис восстановлен: `systemd-run --unit=simbiot-dashboard -p EnvironmentFile=/etc/simbiot/dashboard.env -p Restart=on-failure /root/simbiot-harness/venv/bin/python /root/simbiot-harness/harness/dashboard.py` | 600 | да | при демобилизации дашборда |
| git-история `/root/simbiot-harness` | `.env` убран из трекинга (e6a99ce); **01.10 push в приватный репо https://git.cil.by/symbiot/simbiot-harness (3361b67..d39f60f)**: аудит — `.env` в истории отсутствует (0 коммитов), скан sk-/bot/rsh/Bearer по git log -p --all чист. Утечки не было. | — | n/a | токен Forgejo symbiot (9f29709…) — admin-скоп, ротация при компрометации; в репо не хранить |
**Git-канал харнеса (восстановлен 2026-10-05, e-261004110909-bd70b0):** fetch-токен
в remote-URL (7ea8d11a…) оказался **без скопа `write:repository`** → `git push` = 403.
Push теперь идёт через admin-токен 9f29709… (значение — в git-remote конфиге клона
`/home/hermes/vybirai/.git/config`, в наш репо НЕ копируется): `git remote set-url
--push origin <url с 9f29709…>` — персистентно в `.git/config` (не в трекинге).
Диагностика: `scripts/deploy_channel_probe.py`. Правка: менять только pushurl,
fetch остаётся на узком токене. Деплой лендинга: docs/DEPLOY-LANDING.md.
## 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/coop/.alfa_env` (EnvironmentFile coop-portal.service) | FORGEJO_PULL_TOKEN — scoped read-токен Forgejo (simbiot-agent-pull, read:repository): им simbiot-агенты клонируют /root/simbiot-harness с git.cil.by при деплое (simbiot_harness.py) | 600 | ротация: Forgejo → Settings → Applications → удалить и перевыпустить, обновить .alfa_env, рестарт coop-portal |
| `/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. Значения секретов в него не заносить.