Панель
Вход и выставление наружу
Три способа войти, что каждый из них защищает, и почему в четвёртой конфигурации Unruin не стартует.
Панель умеет запускать копирование, убирать хранилища, снимать метки занятости и переписывать вашу конфигурацию. Всё, что дотягивается до порта, умеет это тоже. Эта страница — о том, чтобы «всё, что дотягивается» совпало с тем, что вы имели в виду.
Три способа войти
Какой из них включён, решает исключительно окружение; GET /api/authmode
сообщает, какой именно, и панель показывает соответствующий экран.
| Режим | Включается | Что вы видите | Чем защищено |
|---|---|---|---|
none |
ничего не задано, слушает loopback | сразу панель | сетью — до порта дотягивается только эта машина |
login |
UNRUIN_AUTH_PASSWORD (и по желанию UNRUIN_AUTH_USER) |
форма с именем и паролем | подписанная кука сессии (HMAC) |
token |
только UNRUIN_API_TOKEN |
одно поле для ключа | Authorization: Bearer <token> на каждом запросе |
Если заданы и пароль, и ключ, людям достаётся форма входа, а ключ продолжает
работать для программ — моста MCP и ваших собственных скриптов. Пароль без имени
даёт пользователя admin.
Кука сессии — это HMAC, выведенный из самого имени и пароля, поэтому отдельного секрета заводить не надо, а смена пароля обесценивает все существующие сессии — именно то, чего от неё и ждут.
В режиме ключа он хранится в браузере (localStorage) после того, как
проверен на сервере, и уходит заголовком Bearer. «Забыть ключ» в шапке его
стирает. Если ключ перестал действовать посреди сеанса, панель его забывает и
возвращает на экран входа с объяснением — не браузерное окно и не замёрзшая
панель со вчерашними данными.
Ключ надо брать откуда-то, где действительно случайно:
openssl rand -hex 32
Конфигурация, в которой Unruin отказывается стартовать
UNRUIN_LISTEN не на loopback и ни одного настроенного доступа — это значит
раздавать запуск заданий, уборку, снятие меток и запись конфигурации всякому, кто
до порта дотянется маршрутом. Unruin не предупреждает об этом и не продолжает. Он
выходит:
refusing to start: UNRUIN_LISTEN=0.0.0.0:8080 is non-loopback but no auth is set
— set UNRUIN_AUTH_PASSWORD (login) or UNRUIN_API_TOKEN, bind to 127.0.0.1, or
set UNRUIN_INSECURE=1 to override
UNRUIN_INSECURE=1 — осознанный отказ от этой проверки, и существует он ровно
для одного случая: закрытый сегмент сети, где вы решили, что границей служит сама
сеть. Правку конфигурации он обратно не включает.
Что открывает каждый уровень
| чтение и запуск | правка конфигурации | |
|---|---|---|
| loopback, без доступа | да | да |
| с доступом (ключ или пароль) | да | да |
не loopback, без доступа, UNRUIN_INSECURE=1 |
да | нет |
любое из перечисленного с UNRUIN_READONLY=1 |
да | нет |
Правка — самая опасная точка продукта: она переписывает файл, который решает, что
вообще копируется. Поэтому на непроверяемом публичном адресе её нет никогда, даже
под UNRUIN_INSECURE.
Как выставить наружу по-человечески
Unruin не терминирует TLS. Привяжите его к loopback и поставьте перед ним обратный прокси:
ports:
- "127.0.0.1:8080:8080" # только loopback хоста
environment:
UNRUIN_LISTEN: "0.0.0.0:8080" # внутри контейнера
UNRUIN_API_TOKEN: "${UNRUIN_API_TOKEN}"
Контейнер слушает на всех своих интерфейсах; настоящая граница — привязка порта на хосте. Дальше сертификатом занимается Caddy, nginx или что у вас уже работает.
Место, на котором спотыкаются: публикация порта в Docker — это не loopback с
точки зрения Unruin. Внутри контейнера адрес привязки 0.0.0.0, поэтому
Unruin считает его публичным и требует доступа. И это правильный ответ:
публикацию можно поменять на 0.0.0.0 со стороны хоста, а Unruin об этом даже не
узнает.
Если прокси заводить не хочется — пробрасывайте порт по SSH, когда он нужен:
ssh -N -L 8080:127.0.0.1:8080 you@your-host
Для парка машин с одним оператором это совершенно достойный боевой ответ.
Доступ для программ
Всё, что делает панель, — это JSON API под /api/, и тот же ключ его открывает:
curl -fsS -H "Authorization: Bearer $UNRUIN_API_TOKEN" \
http://127.0.0.1:8080/api/health
/api/health — то, чем проверяет живость контейнер: он сообщает число заданий,
сколько из них зелёных, годно ли хранилище секретов и разрешена ли правка.
Сервер MCP — клиент этого же API, своей привилегированной
логики у него нет. Помощник, ведущий Unruin, проходит ту же проверку, ту же
атомарную запись и тот же вход, что и человек в браузере. Ему нужны
UNRUIN_API_URL и UNRUIN_API_TOKEN.
Что не защищено
- Учётных записей нет. Один пароль или один ключ, один оператор. Если нужен доступ по людям и запись о том, кто что запускал, — это не тот продукт.
- Ключ предъявительский. Всякий, у кого он есть, — это вы, пока вы его не смените. Он живёт в окружении процесса и в браузере того, кто его вставил.
UNRUIN_MASTER_PASSPHRASE— не пароль от панели. Она открывает хранилище секретов и стоит дороже: см. секреты.