Перейти до вмісту

Безпека й віддалений доступ

M.A.V.E.N - це local-first панель керування. Вона слухає 127.0.0.1:3000, запускає AI-агентів, які можуть виконувати команди, читає й пише ваші файли та витрачає гроші у платних провайдерів. Ця сторінка пояснює, як вона захищена, що таке PIN і що робити, коли потрібен доступ з іншого пристрою.

Користуєтеся M.A.V.E.N лише на цій машині? Вам нічого робити не потрібно. На 127.0.0.1 / localhost PIN не питають - ні до, ні після будь-якого оновлення. Читайте далі, лише якщо хочете відкривати M.A.V.E.N з іншого пристрою.

Звідки відкриваєте M.A.V.E.N Що відбувається
На тій самій машині - http://127.0.0.1:3000 або http://localhost:3000 Без PIN.
Звідки завгодно ще - ім’я Tailscale, адреса в LAN, hostname зворотного проксі Потрібен PIN. Перший правильний PIN з хоста автоматично додає його до Allowed hosts.

M.A.V.E.N згенерував PIN під час найпершого запуску. Його було надруковано в консоль один раз, і він зберігається в ~/.maven/access-pin (читає лише ваш користувач). Подивитися можна будь-коли: Settings → Security → Reveal.

Встановлення на нову машину

Section titled “Встановлення на нову машину”

У встановленні нічого не змінюється. Після першого npm start (або сервісу автозапуску) ви один раз побачите в консолі / journalctl --user -u maven:

MAVEN access PIN for remote hosts (Tailscale / LAN): K7Q4-M2X9
Kept in /home/you/.maven/access-pin. Loopback needs no PIN.

Відкрийте http://127.0.0.1:3000 і працюйте. Тут PIN у вас не спитають.

Доступ до M.A.V.E.N з іншого пристрою (телефон, ноутбук)

Section titled “Доступ до M.A.V.E.N з іншого пристрою (телефон, ноутбук)”
  1. (Необов’язково) Дозвольте ім’я хоста. Settings → Security → Allowed hosts - додайте ім’я, яке набиратимете на іншому пристрої, наприклад rog.tail1234.ts.net. Це можна пропустити: хост, якого M.A.V.E.N ще не знає, отримує екран розблокування, і правильний PIN сам додає його до списку. Список потрібен, щоб переглядати і прибирати хости.
  2. Відкрийте порт приватно. Tailscale: tailscale serve --bg 3000. Або SSH-тунель: ssh -L 3000:127.0.0.1:3000 you@machine (тунель приходить як localhost, тож йому не потрібні ні список дозволених, ні PIN).
  3. Відкрийте там - http://rog.tail1234.ts.net:3000. Побачите екран Enter access PIN. Введіть PIN із Settings → Security → Reveal (або cat ~/.maven/access-pin). Сесія живе 30 днів.

Ніколи не виставляйте порт 3000 у публічний інтернет - ні з PIN, ні без. Лише Tailscale або тунель. Покрокова інструкція зі скриншотами - Дістаньтеся до M.A.V.E.N з телефона.

  • Generated PIN for remote hosts (типово) - loopback відкритий, будь-який інший хост питає згенерований PIN. Reveal, Copy, Regenerate (перегенерація розлогінює всі віддалені сесії).
  • My own PIN, everywhere - ваш власний PIN (8+ символів), потрібен і на цій машині. Те саме, що MAVEN_ACCESS_PIN=<pin> у .env.local. Зміна розлогінює всі сесії.
  • No PIN anywhere - MAVEN_ACCESS_PIN=off. Лишаються тільки перевірки host/origin. Не радимо, якщо дозволено будь-який хост окрім loopback.
  • Allowed hosts - список MAVEN_ALLOWED_ORIGINS: host[:port] або повний origin, через кому.
  • Daily spend ceiling - MAVEN_DAILY_SPEND_USD (типово 25). Усі платні рушії (зображення, відео, голос, 3D, апскейли) вище стелі відмовляють до місцевої півночі з HTTP 402. 0 = без стелі. Картка показує, скільки витрачено сьогодні.

Рядок статусу вгорі картки каже, чи закрита PIN-ом ця сторінка - відповідь залежить від того, як ви її відкрили. Саму картку описано на сторінці Settings → Security.

  • На loopback PIN не потрібен, бо там він нічого не захищає: будь-який процес на машині і так працює від вашого імені та може прочитати файл із PIN. Атаки, що важливі на loopback, приходять із браузера - шкідлива сторінка з іншого сайту, що звертається до 127.0.0.1:3000, або DNS-rebinding, - і їх зупиняє те, що M.A.V.E.N відмовляє будь-якому Host, за який не відповідає, і будь-якому cross-site запиту. Тому й далі працюють локальні інтеграції (боти Hermes, інструменти OpenMontage, оновлювач, smoke-тести): вони ходять в API з машини, без PIN.
  • Віддаленим хостам PIN потрібен завжди, бо саме там неавтентифікований shell - проблема, а агенти M.A.V.E.N - це shell.
  • Дозволені хости потрібні, щоб rebinding-сторінка не могла стати «сторінкою M.A.V.E.N», просто спрямувавши свій домен на вашу loopback-адресу. Хост не зі списку бачить лише екран розблокування (і 401 на API), доки PIN не введено - а сторінка зловмисника його не знає. При вимкненому гейті PIN не може нічого довести, тому незнайомі хости отримують 421 Misdirected Request.

Що ще працює само (нічого робити не треба)

Section titled “Що ще працює само (нічого робити не треба)”
  • Сесії підписані per-install секретом (~/.maven/session-secret), спливають на сервері та відкликаються при зміні PIN. Форма розблокування - з rate-limit.
  • HTML, SVG і застосунки, які генерують AI-моделі, віддаються у браузерній пісочниці: вони рендеряться і працюють, але не можуть викликати API M.A.V.E.N і читати його cookie.
  • Агенти, яких запускає M.A.V.E.N, отримують лише потрібні їм змінні оточення, а не всі API-ключі з .env.local. Режим дозволів, з яким працює агент, вирішує M.A.V.E.N за застосунком, а не запит.
  • Секрети зберігаються 0600; панель Settings показує лише замасковані значення; URL провайдерів не можна змінювати з UI (перенаправлення витягло б ключ).
  • Платні маршрути - під rate-limit і проходять через стелю витрат; дорогі запуски просять серверне підтвердження.
  • Self-update застосовує рівно той коміт, який оголосив, ставить залежності через npm ci --ignore-scripts і не регенерує lockfile без явної команди.
  • Серверні fetch за вставленими вами URL (R-Forge, N-Forge, D-Forge) відмовляють приватним і loopback-адресам. Задайте MAVEN_ALLOW_PRIVATE_FETCH=1, якщо ви навмисно інгестите сайт у LAN.
  • Навички спільноти проходять обов’язковий шлюз карантин → статичне сканування → пісочниця перед встановленням. Дивіться Навички.
Terminal window
# .env.example - Remote-access gate
MAVEN_ACCESS_PIN= # unset = generated PIN for remote hosts; <pin> = yours, everywhere; off = no gate
MAVEN_ALLOWED_ORIGINS= # host[:port] or origin, comma-separated - everything MAVEN answers for besides loopback
MAVEN_DAILY_SPEND_USD=25 # daily ceiling across paid engines; 0 = none
MAVEN_ALLOW_PRIVATE_FETCH= # 1 = let R-Forge/N-Forge fetch LAN / loopback URLs
MAVEN_CHAT_PERMISSION_MODE= # bypass = let the /chat agents run without permission prompts (autonomous apps are unaffected)
MAVEN_SESSION_SECRET= # optional override for ~/.maven/session-secret (32+ chars)

Файли: ~/.maven/access-pin (згенерований PIN), ~/.maven/session-secret (ключ підпису сесій). Обидва 0600. Видаліть access-pin і перезапустіть - отримаєте новий; або Regenerate.

  • 421 Misdirected Request - гейт вимкнено (MAVEN_ACCESS_PIN=off), а набраного хоста немає в Allowed hosts. Додайте його або увімкніть гейт назад, щоб PIN міг вас впустити.
  • 403 refused: this request came from … - сторінка з іншого сайту (або іншого локального порту) спробувала викликати MAVEN. Можна лише сторінкам самого MAVEN.
  • Замкнуло на самій машині - ви задали власний PIN і забули його: відредагуйте .env.local, приберіть MAVEN_ACCESS_PIN, перезапустіть. Згенерований PIN тоді діє лише для віддалених хостів.
  • «Too many tries» - зачекайте вказані секунди; лімітер зростає експоненційно і скидається при успіху.
  • 402 «daily spend cap reached» - підніміть стелю в Settings → Security або дочекайтеся півночі.
  • Віддалений пристрій було розблоковано, а тепер ні - PIN змінили або перегенерували; введіть новий.
  • Сторінки з віддаленого хоста завантажуються порожніми у dev-режимі - додайте хост до allowedDevOrigins у next.config.ts (дивіться Конфігурацію).