Безпека й віддалений доступ
M.A.V.E.N - це local-first панель керування. Вона слухає 127.0.0.1:3000, запускає AI-агентів,
які можуть виконувати команди, читає й пише ваші файли та витрачає гроші у платних
провайдерів. Ця сторінка пояснює, як вона захищена, що таке PIN і що робити,
коли потрібен доступ з іншого пристрою.
Коротко
Section titled “Коротко”Користуєтеся M.A.V.E.N лише на цій машині? Вам нічого робити не потрібно. На
127.0.0.1/localhostPIN не питають - ні до, ні після будь-якого оновлення. Читайте далі, лише якщо хочете відкривати 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-M2X9Kept 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 з іншого пристрою (телефон, ноутбук)”- (Необов’язково) Дозвольте ім’я хоста. Settings → Security → Allowed hosts - додайте
ім’я, яке набиратимете на іншому пристрої, наприклад
rog.tail1234.ts.net. Це можна пропустити: хост, якого M.A.V.E.N ще не знає, отримує екран розблокування, і правильний PIN сам додає його до списку. Список потрібен, щоб переглядати і прибирати хости. - Відкрийте порт приватно. Tailscale:
tailscale serve --bg 3000. Або SSH-тунель:ssh -L 3000:127.0.0.1:3000 you@machine(тунель приходить якlocalhost, тож йому не потрібні ні список дозволених, ні PIN). - Відкрийте там -
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 з телефона.
Settings → Security
Section titled “Settings → Security”- 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.
Чому так
Section titled “Чому так”- На 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. - Навички спільноти проходять обов’язковий шлюз карантин → статичне сканування → пісочниця перед встановленням. Дивіться Навички.
Довідник змінних
Section titled “Довідник змінних”# .env.example - Remote-access gateMAVEN_ACCESS_PIN= # unset = generated PIN for remote hosts; <pin> = yours, everywhere; off = no gateMAVEN_ALLOWED_ORIGINS= # host[:port] or origin, comma-separated - everything MAVEN answers for besides loopbackMAVEN_DAILY_SPEND_USD=25 # daily ceiling across paid engines; 0 = noneMAVEN_ALLOW_PRIVATE_FETCH= # 1 = let R-Forge/N-Forge fetch LAN / loopback URLsMAVEN_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.
Якщо щось не так
Section titled “Якщо щось не так”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(дивіться Конфігурацію).