Агент
rmm-agent.exe е програма на Go, която работи като Windows услугата
RMMAgent (LocalSystem). Изходен код: entrosity-axis-agent/, като
транспортът, изпълнителят на задачи, хранилището за тайни, журналирането,
обвивката на услугата и механизмът за обновяване се споделят с конектора в
entrosity-shared-go/agentkit.
Инсталиране
MSI пакетът (entrosity-axis-agent/installer/Package.wxs, WiX v4) инсталира
услугата и регистрира агента в една стъпка:
msiexec /i rmm-agent.msi /qn ENROLLMENT_TOKEN=<token> SERVER_URL=<url>
| Свойство | Значение |
|---|---|
ENROLLMENT_TOKEN | Токен за регистриране на агента (скрит от журналите). |
SERVER_URL | Публичният URL адрес на сървъра. |
Неуспешното регистриране връща инсталацията обратно. Без тези свойства
услугата изчаква, докато се изпълни rmm-agent.exe enroll. Надгражданията
използват WiX MajorUpgrade, а връщането към по-стари версии е разрешено
(връщането към предишната версия (rollback) при самообновяване се нуждае от
това).
Команден ред
rmm-agent <command> [flags]
run run the agent (foreground, or as a service under the SCM)
--server URL --token T enroll first if not enrolled yet
enroll enroll this machine: --server URL --token T [--force]
inventory collect the inventory and print it: [--json] [--delta]
status show enrollment state
install install the Windows service
uninstall remove the Windows service
version print the version
RMM_DATA_DIR задава друга директория за данни. inventory работи и без
сървър, което е полезно при разработка на колектори.
Файлове
%ProgramData%\RMM\
agent.dat DPAPI-encrypted (machine scope) {agent_id, agent_key, server_url}
config.json last config from the server
state.json pending / in-progress job ids (+ detection metadata) for crash recovery
logons.json sign-outs not yet delivered to the server (at most 256)
cache\ downloaded packages by SHA-256 (LRU, 2 GiB cap, .verified marker)
update\ self-update MSIs, update.ps1, result.json
logs\agent.log rotating log
logs\remote-helper.log remote desktop capture helper (emptied above 5 MiB)
logs\user-notice.log restart/shutdown notices shown to users
Предупрежденията и грешките се записват и в журнала на събитията Application
(източник RMMAgent).
Поведение
| Какво | Кога |
|---|---|
| Сигнал за активност (heartbeat) (процесор, памет, дискове, влязъл потребител, време на работа, чакащо рестартиране, температура на процесора) | На всеки 60 s |
| Пълна инвентаризация | При стартиране и на всеки 24 h |
| Делта инвентаризация (софтуер, дискове, услуги) | На всеки 4 h |
| Повторно свързване | Експоненциално нарастващо изчакване 1 s → 5 min с 20 % случайно отклонение (jitter) |
| Резервно HTTP допитване (polling) | След 10 неуспешни опита за WebSocket, на всеки 5 min, докато опитите за WebSocket продължават във фонов режим |
Сървърът може да промени интервалите с config.update.
Колектори на инвентарни данни
Система (ОС, хардуер, последно стартиране, потребител), софтуер (регистър,
за машината и за отделните потребители; winget идентификаторите се добавят,
когато winget е наличен), дискове, мрежови адаптери, услуги, актуализации на
Windows и локални потребители. Колектор, който е неуспешен, се отчита в
errors[] и неговият раздел остава непроменен на сървъра.
Задачи
inventory, install_package, uninstall_package, run_script,
reboot, shutdown, update_agent, winget_search, remote_desktop.
Задачите се изпълняват една по една, с изключение на remote_desktop,
която има собствена опашка, за да не блокира прозорец за съгласие, чакащ
отговор, другите задачи. Преди изпълнение агентът записва задачата в
state.json; ако се срине или рестартира, при стартиране отчита всяка
незавършена задача (успешна, ако правилото за откриване показва желаното
състояние, в противен случай agent_restarted).
Подробности: Протокол.
Възможности
Агентът обявява в своето hello възможностите winget (когато winget е
наличен), run_as_user (Windows) и remote_desktop (Windows). Агенти преди
0.5 отговарят с run_as_unsupported на задачи, изпълнявани като потребител;
сървърът отказва сесии за отдалечен работен плот на агенти без
remote_desktop (remote_unsupported).
Влизания
На всеки 10 секунди агентът изброява сесиите в Windows
(WTSEnumerateSessions, като пропуска сесия 0 и сесиите без потребител) и
идентифицира всяко влизане по идентификатор на сесията и време на влизане.
Изпраща session.report при всяка промяна, при всяко (повторно) свързване и
поне на всеки 15 минути. Изходите, които не е успял да достави, се пазят в
logons.json и се изпращат със следващия отчет. Влизанията през Remote
Desktop съдържат името или адреса на клиента. Вижте
Влизания.
Температура на процесора
Всеки сигнал за активност съдържа най-горещата термична зона в °C
(закръглена до 0,1), прочетена чрез броячите за производителност на Windows
(\Thermal Zone Information(*)\Temperature, същите ACPI данни като
MSAcpi_ThermalZoneTemperature в WMI) с една заявка, държана отворена през
целия живот на агента, така че не се стартира процес при всеки сигнал.
Неправдоподобните стойности (0 K, извън -40..150 °C) се отхвърлят; без
използваем сензор, което е често при виртуални машини, сигналът за активност
е без температура и агентът опитва отново броячите след един час.
Известия до потребителите
Преди рестартиране или изключване (действия с устройство и политики за
рестартиране на пакети) агентът показва на всеки влязъл потребител известие
в дизайна на продукта: стартира rmm-agent.exe notice --kind=<restart|shutdown> --deadline=<unix seconds> --message=<text> във всяка активна сесия (SYSTEM токенът се
премества в сесията, както при помощната програма за отдалечен работен
плот), веднага след като shutdown.exe е приел рестартирането. Известието
отброява времето до крайния срок, затваря се с Dismiss и се затваря само
10 минути след крайния срок. Известие, което не може да бъде показано, се
записва в журнала и никога не проваля задачата. То заменя обикновения
прозорец на msg.exe от по-ранните агенти. notice е вътрешна команда и не
е посочена в текста за употреба.
Отдалечен работен плот
Задача remote_desktop (Отдалечен работен плот)
се обработва така:
- Съгласие. Когато задачата го изисква и в конзолната сесия има влязъл
потребител, услугата стартира
rmm-agent.exe remote-consent --viewer=<technician> --mode=<mode> --timeout=60в тази сесия (със същия токен и работен плот като помощната програма по-долу). Тя показва прозореца Remote support request (дизайн на Entrosity, фокус върху Decline, Allow, обратно броене) и отговаря с изходен код:20разрешено,21отказано,22изтекло време. Всичко различно от20, включително срив, проваля задачата сremote_declined; прозорец за съгласие, който изобщо не може да бъде стартиран, даваremote_unavailable. Заключена сесия се отказва веднага (потребителят не може да отговори).remote-consentе вътрешна команда и не е посочена в текста за употреба. - Помощна програма. Услугата (LocalSystem, сесия 0) не вижда работния
плот, затова стартира
rmm-agent.exe remote-helper --mode=<mode> --viewer=<technician> --banner=<true|false>в активната конзолна сесия (или в първата активна сесия) наwinsta0\default, с копие на собствения си SYSTEM токен, преместено в тази сесия. Работата като SYSTEM позволява на помощната програма да следва входния работен плот: екраните за влизане и заключване и подканите на UAC се прихващат и могат да се управляват. Помощната програма комуникира с услугата през стандартния си вход и изход (4 байта дължина, 1 байт вид, полезен товар) и не наследява други дескриптори; тя записва журнал вlogs\remote-helper.logв директорията за данни (изпразва се, когато надхвърли 5 MiB).remote-helperе вътрешна команда и не е посочена в текста за употреба. - Поток. Услугата отваря
wss://<server>/api/agent/v1/remote/<session_id>със своя ключ на агента и препредава данните между помощната програма и сървъра. Задачата завършва успешно (remote session started) и потокът продължава, докато някоя от страните не го затвори; тогава помощната програма се спира. Неуспехите преди този момент саremote_unavailable.
Помощната програма поддържа DPI за всеки монитор поотделно и прихваща екрана
с GDI (BitBlt на композирания работен плот, с изрисуван курсор) с до 15
кадъра в секунда, като изпраща променените плочки 64×64 като JPEG. Входът
използва SendInput: абсолютни координати на показалеца върху целия
виртуален работен плот, клавиши по скан код (така се прилага клавиатурната
подредба на устройството) и въведен текст като Unicode. Сесиите само за
преглед игнорират входа и в помощната програма.
Освен ако задачата не задава hide_banner (само за администратори;
--banner=false), помощната програма показва на потребителя и лента в стила
на портала (лого, зелена точка, 4000 the user ended the session.
Грешките при прихващане, докато Windows превключва работните плотове (екран
за заключване, UAC, Ctrl+Alt+Del), се повтарят с нарастващо изчакване; само
15 s непрекъснати неуспехи прекратяват сесията. Когато конзолната сесия се
смени (изход, бързо превключване на потребители, RDP поема конзолата),
помощната програма завършва с код 10 и услугата стартира нова в новата сесия
върху същия поток, най-много 5 пъти в минута; нов влязъл потребител бива
попитан отново за съгласие, когато сесията го изисква. Всяко друго завършване
на помощната програма затваря потока с 4004.
Едно устройство има само една сесия в даден момент: нова сесия спира предишната.
Бутонът Ctrl+Alt+Del извиква SendSAS, което Windows позволява само
когато политиката Disable or enable software Secure Attention Sequence
(HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System,
SoftwareSASGeneration) е зададена на Services (1) или Services and Ease
of Access applications (3). В противен случай техникът вижда грешка;
задайте политиката чрез Group Policy там, където е необходима. Агентът
първо проверява политиката и съобщава Ctrl+Alt+Del is blocked by policy,
когато тя не е зададена.
Компилации за разработка на macOS и Linux
Агентът се компилира и работи на macOS и Linux за целите на разработката:
go run ./agent/cmd/rmm-agent run --server http://localhost:8080 --token <token>
Колекторите отчитат обобщение-заглушка (stub), а идентификационните данни се
съхраняват некриптирани в ~/.rmm-agent (може да се промени с
RMM_DATA_DIR).