Перейти к основному содержимому
Certified-сборкаТребуется пакет advanced logging.

SIEM

SIEM — Security Information and Event Management (управление информацией и событиями безопасности). SIEM собирает журналы с многих устройств в одно хранилище. Вы ищете в нём инциденты, пробелы политики и инвентарь.

NVM for Windows пишет активность Node.js в NVM for Windows/Operational. Отправьте этот канал в SIEM, чтобы видеть, какие версии Node.js работают в организации, кто их ставил или удалял, и когда правило firewall или malware блокировало пакет. Advanced Logging добавляет EventName и JSON Payload. Используйте эти поля, когда запрос должен назвать событие, а не разбирать свободный текст.

Это руководство показывает, как собрать канал, затем даёт стартовые запросы.

См. Коды ошибок для каждого значения NVM####. NVM4312 — это EventData.Code == 4312. Уберите префикс NVM.

Сбор этого журнала​

ЭлементЗначение
КаналNVM for Windows/Operational
ProviderNVM for Windows
GUID provider{4c0f8d8e-2d6b-4f93-9f0f-3f0d7b4e2d11}

Certified MSI регистрирует этот provider и включает канал. Направьте сборщик на этот канал. Не собирайте только журнал Windows Application. Предупреждения Application, например NVM4101, — отдельный поток.

Большинство событий EventName / Payload требуют дополнение Advanced Logging. Без этой лицензии классические события всё равно содержат Code. В них нет EventName и Payload.

Исключение: nodejs.executed (Event ID 120) пишется при включённом log_executions. Community Builds и Certified Builds. Лицензия Advanced Logging не нужна. Certified Builds так же пишут package_manager.executed.

Как запрашивать​

НужноФильтр
Структурированный info, warning или errorEvent ID 120, 121 или 122
Код NVMCode (только число)
Именованное событие жизненного цикла или аудитаEventName, затем разберите Payload как JSON
Каждый запуск node.exeEvent ID 120 nodejs.executed, когда включён log_executions. Event 200 не используется

Payload — строка JSON. Code — отдельный UInt32. Не ищите номер NVM внутри Payload. Code равен 0, когда событие не является условием NVM####.

Сборщики по-разному разворачивают EventData. Если поле из примера отсутствует, используйте имена, которые создала ваша платформа.

Microsoft SentinelSplunkElasticEvent Viewer
КаналEventLogChannelwinlog.channelимя журнала
Event IDEventIDEventCodewinlog.event_idEventID
Имя событияEventData.EventNameEventData.EventNamewinlog.event_data.EventNameData[@Name='EventName']
PayloadEventData.PayloadEventData.Payloadwinlog.event_data.PayloadData[@Name='Payload']
CodeEventData.CodeEventData.Codewinlog.event_data.CodeData[@Name='Code']
ComputerComputerComputerwinlog.computer_name—
Event
| where EventLog == "NVM for Windows/Operational"
| where EventData.Code == 4312

Версии Node.js в работе​

Event ID 120 nodejs.executed пишет каждый запуск shim, когда включён log_executions. Payload.NodeVersion — версия. Event ID 200 не используется.

Event
| where EventLog == "NVM for Windows/Operational"
| where EventID == 120
| where EventData.EventName == "nodejs.executed"
| extend Payload = parse_json(tostring(EventData.Payload))
| summarize Launches = count() by tostring(Payload.NodeVersion), Computer
| order by Launches desc

Число узлов для того же события:

Event
| where EventLog == "NVM for Windows/Operational"
| where EventID == 120
| where EventData.EventName == "nodejs.executed"
| extend Payload = parse_json(tostring(EventData.Payload))
| summarize Launches = dcount(Computer) by tostring(EventData.EventName)

Кто установил версию Node.js​

Event
| where EventLog == "NVM for Windows/Operational"
| where EventID == 120
| where EventData.EventName == "nvm.system.changed"
| extend Payload = parse_json(tostring(EventData.Payload))
| where Payload.Action == "install"
| where Payload.Outcome == "Succeeded"
| summarize Installs = count() by tostring(Payload.NodeVersion), tostring(Payload.User), tostring(Payload.hostname)

Кто установил Node.js 20​

Event
| where EventLog == "NVM for Windows/Operational"
| where EventID == 120
| extend Payload = parse_json(tostring(EventData.Payload))
| where EventData.EventName == "nvm.system.changed"
| where Payload.Action == "install"
| where Payload.Outcome == "Succeeded"
| where tostring(Payload.NodeVersion) startswith "20."
| summarize People = dcount(tostring(Payload.User))

Смените 20. на другую major-версию или на EOL-линейку из вашей политики. Событие само EOL не помечает.

Кто удалил версию Node.js​

Event
| where EventLog == "NVM for Windows/Operational"
| where EventID == 120
| where EventData.EventName == "nvm.system.changed"
| extend Payload = parse_json(tostring(EventData.Payload))
| where Payload.Action == "uninstall"
| where Payload.Outcome == "Succeeded"
| summarize Uninstalls = count() by tostring(Payload.NodeVersion), tostring(Payload.User), tostring(Payload.hostname)

Какая версия стала по умолчанию​

Event
| where EventLog == "NVM for Windows/Operational"
| where EventID == 120
| where EventData.EventName == "nvm.version.activated"
| extend Payload = parse_json(tostring(EventData.Payload))
| summarize Activations = count() by tostring(Payload.version), tostring(Payload.user), tostring(Payload.hostname)

Установки пакетного менеджера: разрешено или запрещено​

Certified Builds пишут package_manager.install, когда межсетевой экран модулей разрешает или запрещает установку. NVM4408 — разрешение. NVM4403 — запрет. Блок malware это событие не пишет. Используйте NVM4602.

Event
| where EventLog == "NVM for Windows/Operational"
| where EventID in (120, 122)
| where EventData.EventName == "package_manager.install"
| summarize Events = count() by Computer, EventData.Code

Блоки malware​

Event
| where EventLog == "NVM for Windows/Operational"
| where EventID == 120
| where EventData.Code == 4602
| where EventData.EventName == "malware.package_blocked"
| summarize Blocks = count() by Computer

Смотрите Payload для имени пакета, версии если известна, команды, source и reason.

Сбои проверки целостности​

Отказ Authenticode / trust — NVM4301. Несовпадение FileVersion node.exe с папкой — NVM4314.

Event
| where EventLog == "NVM for Windows/Operational"
| where EventData.Code in (4301, 4314)
| summarize Failures = count() by Computer, EventID, EventData.EventName, EventData.Code

Блоки version firewall​

Отказ Governance VersionAllowList / VersionBlockList — NVM4411.

Event
| where EventLog == "NVM for Windows/Operational"
| where EventData.Code == 4411
| where EventData.EventName == "node.security.version_firewall_blocked"
| summarize Blocks = count() by Computer

Блоки lifecycle-скриптов​

HKLM BlockPackageManagerLifecycleScripts пишет NVM4412 (package_manager.lifecycle_scripts_blocked) на Certified Builds с Advanced Logging, когда proxy переписывает install-команду (install, ci, add, update, rebuild и похожие; npx с пакетом; голый yarn). npm --version и npm run не пишут. Lock на эти команды всё равно действует. Это аудит, не сбой install. Community не пишет это событие. Смотрите Payload.command, Payload.verb и Payload.action.

Event
| where EventLog == "NVM for Windows/Operational"
| where EventData.Code == 4412
| where EventData.EventName == "package_manager.lifecycle_scripts_blocked"
| summarize Locks = count() by Computer, tostring(EventData.EventName)

Изменения конфигурации​

Event
| where EventLog == "NVM for Windows/Operational"
| where EventID == 120
| where EventData.EventName == "nvm.configuration.changed"
| extend Payload = parse_json(tostring(EventData.Payload))
| summarize Changes = count() by tostring(Payload.Configuration), tostring(Payload.User), tostring(Payload.hostname)

Шаблоны Event ID​

Windows Event ID — шаблон. Это не номер NVM.

Event IDИсточникПоля
100nvm.exe infoSource, Message, Code
101nvm.exe warningSource, Message, Code
102nvm.exe errorSource, Message, Code
120структурированный infoSource, EventName, Payload, Code
121структурированный warningSource, EventName, Payload, Code
122структурированный errorSource, EventName, Payload, Code
200не используетсяОстаток манифеста. Журнал запусков — Event ID 120 nodejs.executed.
210shim infoSource, Message, Code
211shim warningSource, Message, Code
212shim errorSource, Message, Code

Event ID 200 не используется. Журнал запусков — Event ID 120.

События безопасности от shim содержат user, sid, hostname, parent_process, parent_pid, project_name и project_path, когда процесс может их получить. Пустое значение — unknown.

Имена событий с Code 0​

Запрашивайте их по EventName.

EventNameЧто записывает
nvm.system.changedУстановка, удаление и похожие результаты жизненного цикла. Payload: Action, NodeVersion, Outcome, User, sid, hostname, correlation_id.
nvm.configuration.changedИзменение настройки. Payload: Configuration, Value, Old, Outcome.
nvm.version.activatedСменилась активная версия Node.js. Payload: version, previous_version, user, hostname.
nodejs.executedЗапуск node, когда LogExecutions = 1. Источник node-shim. Если allow-флаги были переданы, добавлены или удалены, payload содержит permission_allow.supplied, permission_allow.applied и permission_allow.removed.
package_manager.executedЗапуск npm, yarn, pnpm или похожего на Certified Build, когда LogExecutions = 1. Источник proxy.

Имена событий с кодом NVM​

Сопоставьте Code с номером в Кодах ошибок.

EventNameCodeИсточник
verify_key.open_failed4312nvm.exe на Certified Build. Community Build пишет Event ID 102 с тем же кодом.
node.security.verification_failed4301node-shim или proxy
node.security.activation_blocked4302 или 4305nvm.exe использует 4302. Proxy использует 4305.
node.security.cache_state_changed4303node-shim или proxy
node.security.full_verification_recovered4304node-shim или proxy
node.security.version_mismatch4314node-shim или proxy. PE FileVersion не совпадает с папкой установки.
node.security.version_firewall_blocked4411node-shim или proxy. Governance VersionAllowList / VersionBlockList отклонил версию.
package_manager.lifecycle_scripts_blocked4412proxy. Только Advanced Logging. HKLM lock lifecycle-скриптов на install-команде.
network.deadline_exceeded4501nvm.exe или sync.exe
malware.definitions_updated4601sync.exe. Только Advanced Logging.
malware.package_blocked4602Shim. Только Advanced Logging.
firewall.elevation_required4404nvm.exe
firewall.invalid_rule4405nvm.exe
firewall.untrusted_module_changed4406nvm.exe или proxy
firewall.policy_mutated4410nvm.exe
firewall.policy_mutate_failed4410nvm.exe
package_manager.install4403 или 4408proxy на Certified Build. 4403 — запрет. 4408 — разрешение.