Безопасность
Модель безопасности
Описывает Piomio 0.2.15Изменить страницу
Piomio хранит твои разговоры, ключи и работу агентов на твоём собственном компьютере или сервере. Здесь описано, какие стены стоят между его частями, что добавляет каждый вид установки и где проходят границы. Что агенты могут делать без спроса, рассказано в разделе Подтверждения и автомод.
Чат и пульт безопасности
Хаб обслуживает два отдельных сайта:
- чат: веб-интерфейс, страницы плагинов и API, через который работают приложения;
- пульт безопасности: подтверждения, хранилище (vault), правила, журнал аудита, пароль и passkey.
У пульта своя cookie для входа и строгая политика безопасности содержимого (CSP): там выполняются только его собственные скрипты, а frame-ancestors 'none' не даёт ни одной странице встроить его в рамку. После входа каждый запрос должен прийти с собственного адреса пульта и нести его CSRF-токен. Код плагинов в пульте не выполняется никогда, так что страница плагина в чате не может ничего там прочитать или нажать. Вход в пульт отдельный, а сессия заканчивается после 30 минут бездействия. Открыть его можно из Настройки → Пульт безопасности. Ссылка для доступа отовсюду его не открывает.
Порты:
| Установка | Чат | Пульт | Телефоны | Прокси исходящих соединений |
|---|---|---|---|---|
| Приложение для компьютера | 41780 | 41781 | 41782 | 41789 |
| Установка на сервер | 8080 | 8081 | 8082 | 8089 |
Чат и пульт слушают только сам компьютер (127.0.0.1), если не поменять PIOMIO_HOST. Порт для телефонов слушает все адреса, чтобы телефон мог прийти по Wi-Fi: он говорит по HTTPS с собственным сертификатом хаба, а его API требует токен привязанного телефона. PIOMIO_DEVICES=0 закрывает этот порт. Прокси исходящих соединений слушает только 127.0.0.1. См. Настройки и переменные окружения.
Вход
- Один пароль для чата и пульта, не короче 8 символов; хранится как хеш Argon2id. Первый задаётся с одноразовым кодом настройки (см. Первый запуск).
- Сессия чата живёт 30 дней, сессия пульта заканчивается после 30 минут бездействия.
- Passkey: в пульте Аккаунт → Passkey → Добавить passkey. Один и тот же работает для обоих сайтов. Нужен HTTPS или
localhostи имя хоста, а не IP-адрес. Через ссылку доступа отовсюду — только пароль. - После 10 неверных паролей с одного адреса за 15 минут этому адресу придётся подождать. Через ссылку 30 неудач со всех адресов за час приостанавливают вход через ссылку на час; собственный адрес компьютера продолжает работать. Каждая неудача попадает в журнал аудита.
- Приложение для компьютера само впускает своё окно по одноразовым билетам, которые передаёт по каналу, доступному только ему.
- Сменить пароль в Аккаунт → Пароль завершает все сессии. Так же действует команда
reset-password— на случай, если пароль потерян.
Хранилище (vault)
Хранилище держит пароли, API-ключи, токены и личные данные.
- Секретные поля каждой записи шифруются XChaCha20-Poly1305 под случайным ключом данных. Сам ключ данных зашифрован ключом, который выводится из пароля хранилища через Argon2id. Названия, типы и области доступа остаются читаемыми, поэтому список виден и в запечатанном хранилище.
- Модели видят только
vault://id. Хаб подставляет значение там, где оно нужно: браузер вводит логин на своём сайте, плагин получает свой ключ. - Секретные значения от 6 символов, а также их формы в base64 и URL-кодировке заменяются на
[redacted: vault://id]в результатах инструментов для моделей, в сообщениях в каналы вроде Telegram, в логах плагинов и в журнале аудита. Исключение — запись, у которой ты включил Разрешить модели читать значение (это для безобидных данных вроде адреса доставки). - Пароль хранилища не восстановить. Сменить пароль vault перешифровывает только ключ данных, сами записи не трогаются.
Секреты в чате
- Когда агенту нужен ключ, он показывает карточку с защищённым полем и кнопкой Сохранить в хранилище. Значение уходит прямо в хранилище, ассистент узнаёт только
vault://id. Карточка входа просит логин и пароль для одного сайта: браузер вводит их там, ассистент их не видит. - Токен, вставленный прямо в сообщение, распознаётся и переезжает в хранилище до того, как сообщение сохранится или дойдёт до модели; в сообщении остаётся ссылка. Так происходит с форматами, которые объявляют плагины, и с известными (Anthropic, OpenAI, OpenRouter, xAI, Groq, GitHub, GitLab, Slack, Google API, боевые ключи Stripe, Hugging Face, Notion). Если хранилище заперто, токен вырезается и нигде не сохраняется.
- Токены Claude из
claude setup-tokenвырезаются и не хранятся никогда: Claude Code входит на каждом компьютере сам (см. Мозги и вход). - Из чата можно создать или открыть хранилище. Читать записи, запечатывать его и менять, кому что доступно, можно только в пульте.
Кому достаётся запись
У каждой записи в пульте есть Область доступа: Домены (где можно подставить логин; пусто — домен из адреса записи), Плагины (для логина пусто значит «никому»), Агенты и Инструменты. Плагин получает запись, только если она названа в его правах (их видно при установке) или ты выдал её в Аккаунт → Плагины и их права, и при этом область записи пускает этот плагин, агента и сайт. Обращения, разрешённые и отклонённые, пишутся в журнал аудита, как и каждый просмотр значения в пульте.
Запечатано после перезапуска
Ключ данных живёт только в памяти. После перезапуска хранилище запечатано, пока ты его не откроешь — в чате или в пульте. Чтобы оно открывалось само:
- отметь Открывать автоматически после перезапуска (пароль хранится на этом сервере), когда создаёшь или открываешь его в чате: пароль ляжет в файл
vault.passphraseв папке данных, который может читать только пользователь хаба; - или укажи в
PIOMIO_VAULT_PASSPHRASE_FILEфайл с паролем.
В обоих случаях кто может прочитать этот файл, тот может открыть хранилище. Запечатать в пульте сразу стирает ключ из памяти. Реплика хаба на другом компьютере (см. Машины и другие компьютеры) получает ключ данных от открытой реплики только после твоего «да» на карточке и никогда не пишет его на диск.
Песочница в каждом виде установки
Приложение для компьютера
Хаб, плагины и мозги работают от твоего имени, в твоей домашней папке, поэтому каждый CLI пользуется входом, который у тебя уже есть. На macOS собственные команды и файлы CLI-мозгов держатся в песочнице: Seatbelt у Claude Code, своя у Codex с профилем от хаба, а Kimi Code спрашивает хаб перед каждой командой и изменением. Твои учётные данные и данные хаба закрыты для Claude Code и Codex и отклоняются в командах любого мозга. На Windows песочницы вокруг мозгов пока нет: в задаче их команды и изменения файлов выполняются от твоего имени без вопросов. Подробнее — в разделе Подтверждения и автомод.
Установка на сервер
Запущенный от root, install.sh создаёт пользователя piomio без sudo и ставит всё для него; запущенный от обычного пользователя — ставит для этого пользователя. Всё работает от него одного, а на Linux песочницы вокруг мозгов нет, так что их команды в задачах выполняются без карточек. Не давай этому пользователю доступа к тому, что ему не нужно. См. На Linux-сервере.
В любой установке мозг в диалоге только смотрит: команды и изменения файлов уходят в задачи.
Сетевой фильтр
Мозги и плагины выходят в сеть через прокси исходящих соединений хаба, у каждого свой список разрешённых адресов:
- Мозги: адреса своих провайдеров и их входа (Anthropic, Claude, OpenAI, ChatGPT, Kimi), Google API, OpenRouter, npm, PyPI, GitHub и несколько адресов, куда сами CLI отправляют отчёты об ошибках и использовании. Добавить можно в Настройки → Общие → Интеллект → Дополнительные разрешённые хосты (
brainEgressAllow). - Плагины: адреса из их прав, которые видно при установке и в пульте в Аккаунт → Плагины и их права. MCP-сервер, который ты добавил сам, может ходить на любой публичный адрес, если в его настройке нет
network. - Частные адреса (домашняя сеть, loopback, link-local, диапазон Tailscale
100.64.0.0/10) закрыты для всех, если хост не указан вegressPrivateAllow. Поля для этой настройки пока нет, она задаётся черезPATCH /api/settings. - Прокси разрешает имя один раз и подключается ровно к этому адресу, так что ответ DNS не подменить в промежутке. Отказы пишутся в журнал аудита.
Из чата агенты эти списки поменять не могут.
Другие компьютеры
- Компьютер подключается по одноразовому приглашению, которое действует час. Он создаёт ключ Ed25519; хаб хранит его открытую часть и проверяет ею компьютер при каждом подключении.
- Команда или запись файла там — внешнее действие, поэтому работают твои подтверждения и правила. А ещё собственная политика того компьютера,
~/.piomio-node/policy.json, которую правит только его владелец: какие папки (по умолчанию~/piomio-workspace), можно ли вообще запускать команды (по умолчанию нельзя) и какие, какие мозги. Согласиться должны обе стороны. - Машины → Отключить отзывает его ключ. См. Машины и другие компьютеры.
Телефоны
- QR-код или ссылка несут одноразовый код и отпечаток сертификата хаба; приложение закрепляет этот сертификат.
- Телефон создаёт ключ в своём Secure Enclave. «Да» из собственного списка подтверждений в приложении подписывается этим ключом после Face ID.
- Хаб выдаёт телефону токен один раз и хранит только его хеш.
- Устройства → Отключить: телефон сразу теряет доступ, а его открытые соединения закрываются. См. Приложение для iPhone.
Журнал аудита
В него попадают каждый вызов инструмента (параметры в сокращении, начало результата), каждое решение политики, подтверждения и то, как на них ответили, решения автомода, собственные запросы мозгов, изменения правил, обращения к хранилищу, входы и неудачные попытки, изменения настроек и отклонённые сетевые запросы. Секретные значения вырезаются.
Записи связаны в цепочку хешей: каждая включает хеш предыдущей, поэтому изменённая или удалённая запись рвёт цепочку с этого места. Проверить:
- в пульте: Аудит → Проверить целостность;
- при установке на сервер:
piomio audit-verifyпослеsudo -iu piomio; из исходников:node packages/core/src/cli.ts audit-verify. Если цепочка порвана, команда завершается с кодом 2.
Журнал хранится в базе самого хаба. Цепочка показывает подделку, но не помешает тому, кто управляет компьютером, заменить журнал целиком.
Что уходит с твоих машин
- Мозги. То, над чем работает агент, уходит провайдеру его мозга через официальный CLI, по твоему собственному тарифу: Anthropic у Claude Code, OpenAI у Codex, Moonshot у Kimi Code. Туда же идут проверки автомода. Каждый CLI входит на своём компьютере сам; Piomio никогда не берёт и не хранит их токены. Если включить
PIOMIO_API_KEYS, данные получают и провайдеры API, чьи ключи ты добавишь. - Composio. Приложения, подключённые через него, помечены значком с его именем. Вход и каждый запрос идут через облако Composio: оно хранит ключи этих приложений и видит, что агент читает и отправляет.
- Tailscale. Ссылка для доступа отовсюду работает на собственном узле Tailscale хаба в твоей сети tailnet. Логи узла Piomio в Tailscale не отправляет. См. Доступ отовсюду.
- Что ты подключаешь сам. Telegram, Google, сайты, которые открывает браузер агентов, сервис распознавания речи, если ты его настроил, GitHub, когда хаб ищет обновления.
Собственных данных об использовании хаб никуда не отправляет.
Резервные копии и хранилище
Команда backup копирует базу хаба, хранилище (по-прежнему зашифрованное), агентов, навыки, команды и плагины с их данными: при установке на сервер — piomio backup, из исходников — node packages/core/src/cli.ts backup. Файл с паролем для автооткрытия она не копирует, так что хранилище из копии открывается только паролем хранилища. Без него не откроет никто, включая Piomio: храни пароль в менеджере паролей.