Документация

К списку статей
10. Распознавание ПО: как сырое имя превращается в систему реестра

Аудитория: ИТ-администратор, интегратор. Закрывает вопрос: «источник прислал "winword.exe" — откуда продукт знает, что это MS Office?». Сценарий: боевой источник шлёт сырые имена процессов/продуктов вместо наших кодов систем.


Короткий ответ

Реальные источники (KSC, syslog/evtx, 1С) отдают сырые наименования — «winword.exe», «CorelDRAW Graphics Suite X7», «1С:Зарплата и кадры, ред. 3», — а не наш внутренний sys_code. Recognition Parser приводит сырое имя к каноническому коду системы. Если приёму пришёл пустой/неизвестный sys_code, он вызывает распознаватель как фолбэк; что не распозналось как санкционированная система, проверяется на принадлежность к теневому ИТ.


Зачем это нужно

Без распознавания администратору пришлось бы вручную сопоставлять каждое имя процесса с системой. Источников много, имена «грязные» (версии, издания, регистр, .exe). Парсер снимает эту работу: источник может слать что угодно человекочитаемое — продукт сам поймёт, какая это система реестра (или что это вообще не наша система).

Как работает (два шага)

1. Нормализацияnormalize(raw):

  • нижний регистр, ё → е, срез .exe, схлопывание пунктуации/пробелов.
  • версии/годы/издания не вырезаются — сопоставление идёт по устойчивому токену-подстроке.
"CorelDRAW Graphics Suite X7"  →  "coreldraw graphics suite x7"
"winword.exe"                  →  "winword"
"1С:Зарплата и кадры, ред. 3"  →  "1с зарплата и кадры ред 3"

2. Сопоставление по правиламrecognize(raw) → sys_code | None:

  • упорядоченный список правил (sys_code, токены); первое совпадение по подстроке выигрывает.
  • порядок важен: специфичные варианты раньше общих. Семейства различаются уникальным

токеном, а не общим брендом:

  • → по «зарплата и кадры» / «бухгалтерия государственного» / «документооборот…», не по «1с»;
  • Р7-Офис → три издания по «десктоп» / «сервер базов» / «профессиональн»;
  • СЭД «Дело» отделена от «единая платформа сэд».
"winword"                      →  MS_OFFICE
"coreldraw graphics suite x7"  →  CORELDRAW
"1с зарплата и кадры ред 3"    →  1C_ZUP
"какой-то неизвестный софт"    →  None
Гарантия-близнец (почему это надёжно)

Для каждой системы есть представительное сырьё (representative_raw(code)), и выполняется инвариант round-trip: representative_raw(code) → recognize → тот же code. Это держит Static == Http == Ingested: телеметрия-фикстура несёт те же «сырые» строки, и при приёме через распознавание они возвращаются в тот же sys_id, что засеян напрямую. Проверяется приёмочным round-trip-тестом распознавания.

Где включается в приёме

Приём (ingest_activity, см. статью 04):

  1. сначала прямой резолв sys_code → sys_id по sam.systems (под RLS);
  2. если sys_code пуст/неизвестен — recognition.recognize(raw_product) (счётчик

recognizedViaParser в ответе приёма);

  1. если и распознавание дало None — запись уходит в skippedUnknownSystem (и проверяется на

Shadow IT).

Связь с Shadow IT

Что не распозналось как санкционированная система, проверяется classify_shadow_it(raw) на принадлежность к несанкционированному ПО (облака/мессенджеры/коллаборация) → находка в sam.shadow_it_findings (/risks). Парсер при этом не трогает явный K_security_risk санкционированных систем. Подробно — статья 09.

Границы (что пока не делает)
  • Реализован тир regex/substring + нормализация — детерминированный, без внешних

зависимостей (только stdlib re).

  • Тир NLP-классификатора имён файлов (для совсем «диких» наименований) — отложен как

вне MVP. Сегодня нераспознанное честно уходит в «неизвестно/Shadow IT», а не угадывается.

Как расширить под боевой источник

Если заказчик ставит ПО, которого нет в правилах:

  1. добавить систему в реестр (sam.systems) с её sys_code;
  2. добавить правило в _RULES (sys_code, токены) и представительное сырьё в _REPRESENTATIVE;
  3. прогнать round-trip-тест распознавания — он должен сойтись.
Грабли
  • Порядок правил решает. Новое общее правило, поставленное выше специфичного, перехватит

совпадение. Специфичное — всегда раньше общего.

  • Пустой `raw_product` + неизвестный `sys_code` = пропуск. Если боевой источник не шлёт код

системы, обязательно заполняйте raw_product, иначе запись не привяжется.

  • Распознавание ≠ оценка риска. Оно лишь сопоставляет имя; риск/эффективность считаются

отдельно.


Связанные: 04 — Механизм сбора · 09 — Anti-gaming и Shadow IT · 03 — Коннекторы.