Сигурност
Докладване на уязвимост
Моля, не отваряйте публичен issue. Използвайте функцията на GitHub за поверително докладване на уязвимости в хранилището (repository) (Security → Report a vulnerability), като посочите засегнатата версия, описание, стъпки за възпроизвеждане и очакваното въздействие.
| Потвърждение за получаване | до 3 работни дни |
| Първоначална оценка | до 10 работни дни |
| Корекция за критични и високи проблеми | целеви срок до 30 дни |
Тествайте само срещу инсталации, които притежавате. Поддържа се последното минорно издание от серията 1.x; корекциите по сигурността се пускат като patch версии.
В обхвата: бекендът, порталът, агентът, конекторът за обекта,
инсталаторите, веригата за самообновяване и файловете за продукционно
разгръщане в deploy/.
Извън обхвата: находки, които изискват вече компрометирана Windows машина
с права на локален администратор (агентът по замисъл работи като SYSTEM),
администратор на тенанта, който атакува собствения си тенант, обемни атаки
за отказ на услуга и изход от скенери без доказано въздействие.
Модел на заплахите
Разглеждани нападатели:
- потребител от един тенант, който иска данни или контрол в друг тенант;
- по-ниска роля (наблюдател, техник), която иска повече от това, което ролята дава;
- всеки в интернет, който може да достигне до портала, крайните точки за агенти и конектори и хоста за файлове;
- обикновен потребител на Windows на управляван компютър, който иска да получи SYSTEM чрез агента;
- някой, който се сдобие с копие на базата данни, резервно копие, файл с журнал или URL адрес.
Доверени по замисъл: агентът работи като SYSTEM и изпълнява това, което сървърът изпраща; мениджърите на пакети и авторите на скриптове в даден тенант могат да изпълняват произволен код на устройствата на този тенант; глобалният администратор контролира всичко.
Механизми за сигурност
| Област | Механизъм |
|---|---|
| Мрежа | Агентите и конекторите се свързват само навън; ключовете за всяка инсталация се съхраняват като хешове; токените за регистриране имат срок на валидност и ограничение на използванията. |
| Изолация на тенантите | Проверки в приложението плюс защита на ниво ред (row-level security) в PostgreSQL със съставни външни ключове по тенант (Мултитенантност); fuzz тест за достъп между тенанти. |
| Авторизация | Всеки маршрут има изрично правило за достъп; тест с RBAC матрица покрива всеки маршрут × извикващ. |
| Пароли, двуфакторна автентикация, сесии | Само в Entrosity Hub: argon2id; 12–256 знака; често срещаните пароли се отказват; заключване и ограничения при влизане; TOTP с 10 кода за възстановяване; ротираща се бисквитка на сесията с откриване на повторна употреба (по-долу). Базата данни на Axis не съдържа идентификационни данни. |
| Влизане | Axis приема само продуктови токени EdDSA, подписани с ключ от набора ключове на Hub, издадени от RMM_PLATFORM_URL за аудитория rmm, без предназначение (purpose) (допуск за часовника 30 s). Ролите идват от копието на данните на Hub в Axis, никога от токена; сесиите, прекратени в Hub, се отказват; състоянието на потребителя се проверява отново на всеки 30 s. Чувствителните действия (изтриване на токени за регистриране) изискват step-up токен с валидност две минути, обвързан с потребителя и сесията и използваем веднъж на която и да е реплика; Hub го издава срещу паролата и бисквитката на сесията (същата CSRF защита като при продуктовите токени, ограничение на честотата на заявките като при влизане). |
| Тайни в покой | AES-256-GCM с RMM_MASTER_KEY (идентификаторът на ключа се съхранява за ротация): AD пароли, push токени, имейли в опашката. Hub шифрова своите TOTP seed стойности и имейли с PLATFORM_MASTER_KEY. |
| Потоци от събития | 60-секундни токени за поток, обвързани с тенанта (HS256, RMM_JWT_SECRET); продуктовите токени никога не са в URL адреси. |
| WebSocket | Надгражданията (upgrade), започнати от браузър (със заглавка Origin), се отказват. |
| Качвания | Браузър → обектно хранилище с предварително подписан (presigned) PUT; размерът и SHA-256 се проверяват при финализиране; съхраняват се като application/octet-stream; хостът за файлове изпраща sandbox CSP. |
| Изтегляния | Предварително подписани връзки с валидност един час, генерирани при доставяне; агентите проверяват SHA-256, преди да изпълнят каквото и да е; конекторът проверява изпратения чрез push MSI пакет. |
| Самообновяване | Изданията се подписват с Ed25519 при публикуване; проверяват се спрямо публичния ключ, вграден в компилацията; неподписаните компилации отказват обновявания; връщане към предишната версия (rollback) чрез watchdog. |
| Инжектиране на команди | Параметрите на скриптовете пристигат като променливи на средата и JSON файл, никога не се интерполират; метасимволите на cmd се отказват в параметрите за cmd и в аргументите за деинсталиране; деинсталирането по име използва само записи в регистъра за цялата машина; аргументите на shutdown.exe никога не минават през обвивка. |
| Отмяна | Извеждането от експлоатация, изтриването на конектор или спирането на тенант затваря връзките и изчиства кешираните ключове на всяка реплика. |
| Заглавия | HSTS, строг CSP, DENY за вграждане във frame, nosniff, политики Referrer и Permissions. |
| Одит | Всяко променящо извикване и всяко създаване на задача се записва в одитния журнал в същата транзакция; за ролята на приложението журналът позволява само добавяне; тайните се редактират. |
| Журнали | Тайните и подписите на предварително подписаните URL адреси се редактират. |
Влизане чрез Entrosity Hub
Entrosity Hub съхранява идентификационните данни, а Axis не съхранява такива: той проверява токените и чете ролите от своето копие на данните на Hub.
| Риск | Механизъм |
|---|---|
| Откраднат продуктов токен | Пет минути, обвързан с аудитория (безполезен срещу Hub или друг продукт), прекратените сесии се отказват след следващото изтегляне. |
| Роли в токените | Няма: понижаване или премахване се прилага при следващото изтегляне плюс 30 s кеш, независимо какво пише в токена. |
| Използване на бисквитката от друг сайт | SameSite=Strict плюс проверка за същия произход (Sec-Fetch-Site / Origin) на всеки маршрут с бисквитка, защото hub., files. и старите хостове manage. и portal. са един и същ сайт. |
| Ключове за подписване | Ed25519 (PLATFORM_JWT_SIGNING_KEY), ротират се чрез _OLD, докато и двата са публикувани; Axis изтегля наново набора ключове при непознат kid най-много веднъж в минута и запазва последния валиден набор. |
| Вътрешен API | Отделен слушател, към който Caddy никога не маршрутизира (пътят се отказва и на ръба на мрежата), bearer токени за всеки продукт, сравнявани за константно време. |
| Чувствителни действия | Step-up токени: две минути, обвързани с потребителя и сесията, еднократна употреба във всички реплики на Axis. |
| Закъснение при отмяна | Деактивирането на потребител, премахването на роля или излизането достига до Axis в рамките на интервала на синхронизация (30 s) плюс кеша на principal обектите (30 s). |
| Семантика на копието | Потребителите, липсващи в snapshot, се маркират като изтрити, а организациите – като спрени; нищо не се изтрива окончателно, така че данните и авторството оцеляват при грешка в платформата. |
Верига на доставки
- Всеки push и pull request изпълнява govulncheck, gosec,
pnpm audit, gitleaks и сканиране с Trivy на продукционните образи (.github/workflows/security.yml), плюс седмично изпълнение. - Изданията се блокират при отстраними HIGH/CRITICAL находки в образите,
качват се в
ghcr.ioи се публикуват със SPDX SBOM. - Зависимостите са фиксирани (
go.sum,pnpm-lock.yaml, digest стойности на образите,deploy/caddy/go.sum) и се обновяват от Dependabot. - Образите работят без root права (distroless
nonrootбекенд; Caddy с uid 10001).
Пълният преглед с доказателства и препратки към файлове е в Преглед на сигурността (1.0).