Преминете към основното съдържание

Агент

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 (Отдалечен работен плот) се обработва така:

  1. Съгласие. Когато задачата го изисква и в конзолната сесия има влязъл потребител, услугата стартира 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 е вътрешна команда и не е посочена в текста за употреба.
  2. Помощна програма. Услугата (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 е вътрешна команда и не е посочена в текста за употреба.
  3. Поток. Услугата отваря 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), помощната програма показва на потребителя и лента в стила на портала (лого, зелена точка, is controlling your screen или viewing и червен бутон End session) в собствена нишка на обикновения работен плот. End session кара помощната програма да завърши с код 11, а услугата затваря потока с 4000 the user ended the session.

Грешките при прихващане, докато Windows превключва работните плотове (екран за заключване, UAC, Ctrl+Alt+Del), се повтарят с нарастващо изчакване; само 15 s непрекъснати неуспехи прекратяват сесията. Когато конзолната сесия се смени (изход, бързо превключване на потребители, RDP поема конзолата), помощната програма завършва с код 10 и услугата стартира нова в новата сесия върху същия поток, най-много 5 пъти в минута; нов влязъл потребител бива попитан отново за съгласие, когато сесията го изисква. Всяко друго завършване на помощната програма затваря потока с 4004.

Едно устройство има само една сесия в даден момент: нова сесия спира предишната.

Ctrl+Alt+Del

Бутонът 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).