Аудитория: ИТ-администратор, интегратор. Закрывает вопрос: «источник прислал "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С→ по «зарплата и кадры» / «бухгалтерия государственного» / «документооборот…», не по «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):
- сначала прямой резолв
sys_code → sys_idпоsam.systems(под RLS); - если
sys_codeпуст/неизвестен —recognition.recognize(raw_product)(счётчик
recognizedViaParser в ответе приёма);
- если и распознавание дало
None— запись уходит вskippedUnknownSystem(и проверяется на
Shadow IT).
Что не распозналось как санкционированная система, проверяется classify_shadow_it(raw) на принадлежность к несанкционированному ПО (облака/мессенджеры/коллаборация) → находка в sam.shadow_it_findings (/risks). Парсер при этом не трогает явный K_security_risk санкционированных систем. Подробно — статья 09.
- Реализован тир regex/substring + нормализация — детерминированный, без внешних
зависимостей (только stdlib re).
- Тир NLP-классификатора имён файлов (для совсем «диких» наименований) — отложен как
вне MVP. Сегодня нераспознанное честно уходит в «неизвестно/Shadow IT», а не угадывается.
Если заказчик ставит ПО, которого нет в правилах:
- добавить систему в реестр (
sam.systems) с еёsys_code; - добавить правило в
_RULES(sys_code, токены) и представительное сырьё в_REPRESENTATIVE; - прогнать round-trip-тест распознавания — он должен сойтись.
- Порядок правил решает. Новое общее правило, поставленное выше специфичного, перехватит
совпадение. Специфичное — всегда раньше общего.
- Пустой `raw_product` + неизвестный `sys_code` = пропуск. Если боевой источник не шлёт код
системы, обязательно заполняйте raw_product, иначе запись не привяжется.
- Распознавание ≠ оценка риска. Оно лишь сопоставляет имя; риск/эффективность считаются
отдельно.
Связанные: 04 — Механизм сбора · 09 — Anti-gaming и Shadow IT · 03 — Коннекторы.