* feat(docs): mirror every docs/ page in all 65 locales Extends the documentation mirrors from the 22-page core set (#13940) to every Markdown page under docs/: 152 sources x 65 locales = 9,880 mirrors (6,208 new), language bars rewritten for the full locale list, state adopted so the blocking drift gate now covers all 152 pages. run-translation.mjs: an oversized block made only of table rows or list items (PROVIDER_REFERENCE.md 244-row table, FREE_TIERS.md 71-item list) is cut at item boundaries and rejoined without a blank line — the single 16-40 KB request outlived the backend socket for verbose scripts. 48 older mirrors whose tables had lost rows were retranslated with --force. * docs(i18n): refresh mirrors for the sources the base changed since the branch cut Section-level retranslation of the 29 docs (and README.md) whose source or mirrors moved on release/v3.8.51 during the run, then state adoption; the drift gate is green again on the merged tree.
14 KiB
CLI Machine-ID Token (Български)
🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇳🇬 ha · 🇮🇱 he · 🇮🇳 hi · 🇭🇷 hr · 🇭🇺 hu · 🇦🇲 hy · 🇮🇩 id · 🇳🇬 ig · 🇮🇹 it · 🇯🇵 ja · 🇬🇪 ka · 🇰🇭 km · 🇮🇳 kn · 🇰🇷 ko · 🇱🇹 lt · 🇱🇻 lv · 🇮🇳 ml · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇲🇲 my · 🇳🇵 ne · 🇳🇱 nl · 🇳🇴 no · 🇮🇳 or · 🇮🇳 pa · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW
Общ преглед
Командите на OmniRoute CLI се удостоверяват пред локалния API за управление чрез
маркер HMAC-SHA256(machine-id, salt), изпращан чрез HTTP заглавката на заявката
x-omniroute-cli-token.
Това позволява на подкомандите на CLI (omniroute status, omniroute providers и др.)
да извикват крайните точки за управление, без да се налага потребителят да предоставя JWT или
парола при всяко извикване.
Как работи
getMachineTokenSync()прочита хардуерния идентификатор на машината чрезnode-machine-id(при неуспех използва празен низ, което деактивира удостоверяването на CLI).- Функцията изчислява
HMAC-SHA256(machine_id, salt)и връща пълния шестнадесетичен дайджест от 64 знака — детерминистичен, необратим маркер, обвързан с тази машина. - CLI изпраща маркера като
x-omniroute-cli-tokenсамо когато разрешената крайна цел е изричен URL за обратна връзка (localhost,127.0.0.0/8или IPv6 за обратна връзка). Заявките, съдържащи маркера, използватredirect: error, така че локално пренасочване да не може да го препрати към друг източник. Отдалечените контексти вместо това използват маркери за достъп с ограничен обхват. Ако извеждането не е възможно, CLI пропуска заглавката, аomniroute doctorсъобщава за неуспеха, вместо да третира празен маркер като валиден. - Сървърът (
src/server/authz/policies/management.ts) преизчислява очаквания маркер със същата сол и го сравнява чрезtimingSafeEqual, за да предотврати извличане въз основа на времето за изпълнение.
Свойства за сигурност
| Свойство | Подробности |
|---|---|
| Само обратна връзка | Приема се само когато довереният от сървъра маркер за локалност на партньора (изведен от реалния TCP адрес на партньора) показва обратна връзка. Контролираната от клиента заглавка Host никога не се счита за надеждна при определяне на локалността. |
| Сравнение за константно време | crypto.timingSafeEqual предотвратява атаки по времето за изпълнение. |
| Необратимост | От резултата на HMAC не може да бъде възстановен идентификаторът на машината. |
Без заобикаляне на защита always |
isAlwaysProtectedPath() се оценява преди проверката на маркера на CLI. /api/shutdown и /api/settings/database винаги изискват JWT. |
| Не може да се експортира | Маркерът никога не се записва на диска или в регистрационните файлове. |
Сол по подразбиране (случайна за всяка инсталация)
Когато OMNIROUTE_CLI_SALT не е зададена, солта е случаен шестнадесетичен низ от 64 знака,
генериран еднократно и запазен в <DATA_DIR>/cli-token-salt.json (режим 0600) —
а не включената в хранилището литерална стойност omniroute-cli-auth-v1. Както getActiveSalt() в
src/lib/machineToken.ts, така и нейното огледално съответствие в bin/cli/utils/cliToken.mjs четат
един и същ файл, така че сървърът и всяко извикване на CLI в тази инсталация достигат до
една и съща стойност; включената в хранилището литерална стойност се използва само като краен резервен вариант, когато все още не може
да бъде установена запазена сол или сол от променлива на средата (например при нова инсталация само на CLI,
преди сървърът да е стартиран за първи път). Това отстранява слабост в старото фиксирано
подразбиране: /etc/machine-id обикновено е достъпен за четене от всички, така че в противен случай всеки локален потребител би могъл
да изведе същия маркер за всяка инсталация, в която никога не е била зададена
OMNIROUTE_CLI_SALT.
Ротация на солта
Задайте OMNIROUTE_CLI_SALT, за да смените извлечения токен без промени в кода — тази стойност
винаги има приоритет пред запазената сол за конкретната инсталация. След ротацията всички CLI
процеси на тази машина автоматично ще използват новия токен. Полезно е след изтичане на информация
от списъка с процеси, което може да е разкрило предишната извлечена стойност.
# Постоянна ротация (добавете към профила на обвивката)
export OMNIROUTE_CLI_SALT="my-secret-salt-2026"
# Проверете дали се използва новият токен
omniroute status
Остарял формат (SHA-256, 32 знака) — все още се приема
Преди горния HMAC формат CLI извличаше своя токен като
SHA-256(machineId + salt).hex[0..32] (префикс от 32 знака) в
bin/cli/utils/cliToken.mjs (getLegacyCliTokenSync в src/lib/machineToken.ts).
За обратна съвместимост сървърът приема и двата формата: проверяващият механизъм изгражда
expectedTokens = [getMachineTokenSync(), getLegacyCliTokenSync()] и сравнява
входящата заглавка с всеки от тях чрез timingSafeEqual
(src/server/authz/policies/management.ts и src/lib/middleware/cliTokenAuth.ts).
Следователно токенът е валиден, ако съвпада или с 64-знаковия HMAC дайджест, или с
32-знаковия остарял SHA-256 префикс.
Изключване: задайте OMNIROUTE_DISABLE_CLI_TOKEN=true (чрез променлива на средата или .env), за да деактивирате изцяло
механизма за CLI токени; тогава всеки достъп изисква изричен API ключ. При хостове с множество потребители
това е препоръчително, тъй като machine-id е за всяко устройство поотделно (а не за всеки потребител) и друг
потребител на същия хост би могъл да изчисли същия токен.
Файлове
| Файл | Предназначение |
|---|---|
src/lib/machineToken.ts |
Извличане на токена (getMachineTokenSync) |
bin/cli/utils/cliToken.mjs |
CLI еквивалент на същото извличане |
<DATA_DIR>/cli-token-salt.json |
Запазена случайна сол за конкретната инсталация |
src/server/authz/headers.ts |
Константа CLI_TOKEN_HEADER |
src/server/authz/policies/management.ts |
Проверка от страна на сървъра |
src/server/authz/routeGuard.ts |
Проверка за loopback хост (isLoopbackHost) |
Вижте също
docs/security/ROUTE_GUARD_TIERS.md— нива на защита на маршрутитеdocs/architecture/AUTHZ_GUIDE.md— пълен процес на оторизация