92 lines
5.3 KiB
Markdown
92 lines
5.3 KiB
Markdown
# Безопасность
|
||
|
||
`omnichannel-mcp` даёт ассистенту право управлять платформой, поэтому
|
||
безопасность строится в несколько независимых слоёв: конфигурация модуля,
|
||
подтверждения, и ограничения на стороне `config_server`.
|
||
|
||
## Модель угроз
|
||
|
||
- **Ошибочный или злонамеренный вызов управляющего инструмента** (остановить
|
||
прод, залить чужой конфиг).
|
||
- **Утечка секретов** (пароли, токен GitLab) в логи, в контекст модели, в
|
||
репозиторий.
|
||
- **Доступ не туда** (SSRF, подмена хоста стенда).
|
||
- **Чрезмерные привилегии** (учётная запись только для чтения там, где нужен
|
||
мониторинг).
|
||
|
||
## Слои защиты
|
||
|
||
### 1. Учётные данные и секреты
|
||
|
||
- Пароли и токены — только из `${VAR}` окружения или `config.local.json`
|
||
(в `.gitignore`). В репозитории — лишь шаблон.
|
||
- `--check-config` печатает конфиг с маской секретов — можно безопасно проверять
|
||
настройку и выкладывать вывод в тикеты.
|
||
- Секреты не логируются: логи идут в stderr с маскированием, токен GitLab в
|
||
выводе не отражается.
|
||
|
||
### 2. Режим «только чтение»
|
||
|
||
- `read_only: true` (значение по умолчанию) запрещает все изменяющие инструменты.
|
||
- Для наблюдательных агентов поднимайте **отдельный инстанс** с `read_only: true`
|
||
и отдельной read-only учётной записью:
|
||
|
||
```json
|
||
{ "servers": [{ "alias": "prod", "base_url": "http://…",
|
||
"readonly_username": "${OMNI_RO_USER}",
|
||
"readonly_password": "${OMNI_RO_PASSWORD}" }],
|
||
"read_only": true }
|
||
```
|
||
- Если заданы `readonly_*`-креды, read-инструменты ходят именно под ними —
|
||
это least-privilege на стороне модуля.
|
||
|
||
### 3. Подтверждения (`confirm`)
|
||
|
||
Разрушительные операции требуют `confirm="true"`:
|
||
|
||
- `down`, `restore_compose`, `restore_env_version`, `update_front`,
|
||
`download_release`, `cleanup_old_versions`.
|
||
|
||
Это второй слой: даже при включённом `read_only=false` ассистент обязан явно
|
||
подтвердить опасное действие. Дополнительно настройте политику подтверждений
|
||
вашего MCP-клиента (человеческое «да/нет» на управляющие инструменты).
|
||
|
||
### 4. Изоляция сети (`allow_hosts`)
|
||
|
||
Если задан `allow_hosts`, `base_url` любого сервера обязан быть на этих хостах —
|
||
защита от опечаток и подмены адреса.
|
||
|
||
### 5. Файловый jail (`front_roots`)
|
||
|
||
`update_front` принимает только каталоги внутри `front_roots`; при проверке
|
||
разрешаются симлинки и отсекаются побеги (`..`, ссылки наружу). Пусто —
|
||
загрузка фронта запрещена полностью.
|
||
|
||
### 6. Ограничение нагрузки
|
||
|
||
- Таймауты (`timeout_sec`, `upload_timeout_sec`), лимиты вывода
|
||
(`max_output_bytes`) и размера загрузки (`max_upload_bytes`).
|
||
- Семафор мутаций (`max_concurrent_mutations`) предотвращает наложение операций.
|
||
- GET-запросы повторяются при сетевом сбое; **мутации не повторяются** — действие
|
||
не выполнится дважды.
|
||
|
||
## Что модуль НЕ делает
|
||
|
||
- Не работает с агентскими эндпоинтами `config_server`
|
||
(`/api/register`, `/api/tasks/<host>`) — только с пользовательским API.
|
||
- Не хранит состояние и не пишет секреты на диск.
|
||
- Не выполняет код на хостах: все действия выполняет агент `config_server`.
|
||
|
||
## Рекомендации оператору
|
||
|
||
1. Заведите **отдельные учётные записи**: read-only для мониторинга,
|
||
полную — только для деплой-агента.
|
||
2. Для мониторинга запускайте инстанс с `read_only: true`.
|
||
3. Держите секреты в окружении/`config.local.json`, не в `config.json`.
|
||
4. Включите подтверждения управляющих инструментов в MCP-клиенте.
|
||
5. Ограничьте сетевой доступ к `config_server` (VPN/private network); наружу
|
||
порт 5005 не публикуйте.
|
||
6. Об уязвимостях сообщайте в службу безопасности компании (не публикуйте в
|
||
общих трекерах).
|
||
|