Содержание статьи
- Установка
- Ожидание: типы событий
- Настройка
- Эксперименты
- Создание процесса — Event ID 1
- Изменение временной метки файла — Event ID 2
- Сетевое соединение — Event ID 3
- Изменение Sysmon — Event ID 4
- Процесс завершен — Event ID 5
- Пустышки Event ID 6–8
- Образ загружен — Event ID 7
- Создание удаленного потока — Event ID 8
- Прямое чтение с диска — Event ID 9
- Получен доступ к процессу — Event ID 10
- Создание файла — Event ID 11
- Пустышки — Event ID 12–15
- Изменение конфигурации Sysmon — Event ID 16
- Пустышки — Event ID 17–22
- Файл удален с сохранением копии — Event ID 23
- Финальные пустоты — Event ID 24–29, 255
- Эксперименты с обогащением конфигов
- Немного про eBPF
- Выводы
Мы часто настраиваем аудит в Linux (auditd, eBPF) — и сами, и вместе с коллегами. Потом приходят джуны, и выясняется, что им... сложно. Ну ладно, подумали мы. Немного изврата — и хотя бы базовое логирование в Linux всегда можно настроить, почти без затрат.
Основная цель статьи — рассказать об инструменте, показать его возможности и пополнить копилку знаний «Хакера» еще одной занятной технологией, о которой в комьюнити безопасников пока мало говорят.
Установка
С установкой мудрить не нужно: официальная инструкция проста и понятна — всего четыре команды, и все готово.
Да и ребуты не нужны. Чтобы запустить службу, выполняем sysmon .
Можно проверить, что по умолчанию уже фиксируются какие‑то XML‑подобные логи: sudo . В некоторых дистрибутивах их можно увидеть через journalctl . Ну и не забудь убедиться, что служба вообще запустилась: systemctl .
Окей, health check прошел. Базовые команды похожи на винду (есть хороший гайд по ним). Введем sysmon и увидим минимальную справку.
В целом на этом обзор можно было бы и закончить, но мы будем дотошны и последовательны. Зачем нам инструмент, который нельзя пощупать?!
Ожидание: типы событий
Давай посмотрим, какие события может ловить Sysmon for Linux по сравнению с его виндовым собратом. Очевидно, что виндовый может все.
| Event ID | Название | Встретишь в Linux | Примечание |
|---|---|---|---|
| 1 | Создание процесса | + | |
| 2 | Изменение временных меток файла | – | |
| 3 | Сетевое соединение | + | TCP + UDP |
| 4 | Изменено состояние службы Sysmon | + | |
| 5 | Процесс завершен | + | |
| 6 | Драйвер загружен | – | |
| 7 | Образ загружен | – | |
| 8 | Создание удаленного потока | – | Использует процедуру из Win32 API |
| 9 | Прямое чтение | + | |
| 10 | Доступ к процессу | + | |
| 11 | Файл создан | + | Частично опирается на WinAPI |
| 12 | Создание/удаление объекта в реестре | – | Ну какой тебе реестр! |
| 13 | Установлено значение параметра реестра | – | — |
| 14 | Переименование объекта реестра | – | — |
| 15 | Создан файловый поток | – | |
| 16 | Изменение конфигурации Sysmon | + | |
| 17 | Именованный канал создан | – | |
| 18 | Подключение к именованному каналу | – | |
| 19 | WMI-фильтр | – | Создан, изменен, удален (WMI в Linux нет) |
| 20 | Потребитель WMI | – | Создан, изменен, удален |
| 21 | Фильтр WMI связан с потребителем | – | — |
| 22 | DNS-запрос | – | Основан на обращениях к dnsapi.dll |
| 23 | Файл удален с созданием копии | + | |
| 24 | Обновлен буфер обмена | – | Работает для текста |
| 25 | Изменен образ процесса | – | |
| 26 | Файл удален | – | WinAPI |
| 27 | Блокировка исполняемого файла | – | Опирается на WinAPI |
| 28 | Блокировка поблочного удаления файла | – | Опирается на WinAPI |
| 29 | Исполняемый файл удален | – | |
| 255 | Ошибка | – |
Да, инструмент ограниченный, но иногда и не нужно большего — главное, чтобы быстро!
Если чуть серьезнее, то большая часть возможностей Sysmon завязана на проприетарные виндовые фичи — WinAPI, WMI, особенности NTFS, которых в Linux, очевидно, мало или они вовсе отсутствуют, как, например, реестр.
В сухом остатке мы должны увидеть хорошо структурированные базовые события: создание и завершение процесса, сетевые соединения, создание и удаление файлов, прямое чтение с диска, получение доступа к процессу. Есть собственный аудит (изменение конфигурации Sysmon).
Настройка
Что ж, давай настроим инструмент, научим его логировать что‑то полезное и проверим Sysmon for Linux в действии.
Настройка делается через загрузку конфигурации. По умолчанию никаких правил нет — в основном пишутся события создания и завершения процесса. Исправим это. Конфигурацию в общем случае можно загрузить как виндовую (обобщенную — понятно, что фильтры работать не будут), так и созданную специально для Linux. Для эксперимента скачаем конфиг для всех ивентов и посмотрим, на что он способен.
almost_all_hunt-naked.xml
<Sysmon schemaversion="4.81"> <HashAlgorithms>*</HashAlgorithms> <DnsLookup>True</DnsLookup> <EventFiltering> <!--Event ID 1: Process creation--> <ProcessCreate onmatch="exclude"></ProcessCreate> <!--Event ID 2: A process changed a file creation time--> <FileCreateTime onmatch="exclude"></FileCreateTime> <!--Event ID 3: Network connection--> <NetworkConnect onmatch="exclude"></NetworkConnect> <!--Event ID 5: Process terminated--> <ProcessTerminate onmatch="exclude"></ProcessTerminate> <!--Event ID 6: Driver loaded--> <DriverLoad onmatch="exclude"></DriverLoad> <!--Event ID 7: Image loaded--> <ImageLoad onmatch="exclude"></ImageLoad> <!--Event ID 8: CreateRemoteThread--> <CreateRemoteThread onmatch="exclude"></CreateRemoteThread> <!--Event ID 9: RawAccessRead--> <RawAccessRead onmatch="exclude"></RawAccessRead> <!--Event ID 10: ProcessAccess--> <ProcessAccess onmatch="exclude"></ProcessAccess> <!--Event ID 11: FileCreate--> <FileCreate onmatch="exclude"></FileCreate> <!--Event ID 12: RegistryEvent (Object create and delete)--> <!--Event ID 13: RegistryEvent (Value Set)--> <!--Event ID 14: RegistryEvent (Key and Value Rename)--> <RegistryEvent onmatch="exclude"></RegistryEvent> <!--Event ID 15: FileCreateStreamHash--> <FileCreateStreamHash onmatch="exclude"></FileCreateStreamHash> <!--Event ID 16: ServiceConfigurationChange--> <!--Event ID 17: PipeEvent (Pipe Created)--> <!--Event ID 18: PipeEvent (Pipe Connected)--> <PipeEvent onmatch="exclude"></PipeEvent> <!--Event ID 19: WmiEvent (WmiEventFilter activity detected)--> <!--Event ID 20: WmiEvent (WmiEventConsumer activity detected)--> <!--Event ID 21: WmiEvent (WmiEventConsumerToFilter activity detected)--> <WmiEvent onmatch="exclude"></WmiEvent> <!--Event ID 22: DNSEvent (DNS query)--> <DnsQuery onmatch="exclude"></DnsQuery> <!--Event ID 23: FileDelete (A file delete was detected)--> <FileDelete onmatch="exclude"></FileDelete> <!--Event ID 24: ClipboardChange (New content in the clipboard)--> <ClipboardChange onmatch="exclude"></ClipboardChange> <!--Event ID 25: ProcessTampering--> <ProcessTampering onmatch="exclude"></ProcessTampering> <!--Event ID 26: FileDeleteDetected--> <FileDeleteDetected onmatch="exclude"></FileDeleteDetected> </EventFiltering></Sysmon>Применим этот конфиг.
sysmon -c almost_all_hunt-naked.xml
Проверить, что правила загрузились, можно командой sysmon .
Эксперименты
В винде для проверки можно использовать SysmonSimulator, чтобы сгенерировать все типы событий и убедиться, что они пишутся в логи. В Linux нам такой приблуды не завезли, поэтому все руками.
В чистом XML-представлении вывод выглядел бы вот так:
Sep 06 11:46:02 PADMIN sysmon[2602]: <Event><System><Provider Name="Linux-Sysmon" Guid="{ff032593-a8d3-4f13-b0d6-01fc615a0f97}"/><EventID>1</EventID><Version>5</Version><Level>4</Level><Task>1</Task><Opcode>0</Opcode><Keywords>0x8000000000000000</Keywords><TimeCreated SystemTime="2025-09-06T08:46:02.829056000Z"/><EventRecordID>2288796</EventRecordID><Correlation/><Execution ProcessID="2602" ThreadID="2602"/><Channel>Linux-Sysmon/Operational</Channel><Computer>PADMIN</Computer><Security UserId="0"/></System><EventData><Data Name="RuleName">-</Data><Data Name="UtcTime">2025-09-06 08:46:06.529</Data><Data Name="ProcessGuid">{218d9a1a-f4ce-68bb-7db7-d9e08a550000}</Data><Data Name="ProcessId">3235</Data><Data Name="Image">/usr/bin/systemctl</Data><Data Name="FileVersion">-</Data><Data Name="Description">-</Data><Data Name="Product">-</Data><Data Name="Company">-</Data><Data Name="OriginalFileName">-</Data><Data Name="CommandLine">systemctl status sysmon</Data><Data Name="CurrentDirectory">/root</Data><Data Name="User">root</Data><Data Name="LogonGuid">{218d9a1a-0000-0000-0000-000000000000}</Data><Data Name="LogonId">0</Data><Data Name="TerminalSessionId">4294967295</Data><Data Name="IntegrityLevel">no level</Data><Data Name="Hashes">SHA256=c3f60225cf89f20c2f870fd738a6452da820eff730a7e5f05ae03fde1aaa876a</Data><Data Name="ParentProcessGuid">{00000000-0000-0000-0000-000000000000}</Data><Data Name="ParentProcessId">2095</Data><Data Name="ParentImage">-</Data><Data Name="ParentCommandLine">-</Data><Data Name="ParentUser">-</Data></EventData></Event>
Но лучше почистить его:
sudo tail -f /var/log/syslog | sudo /opt/sysmon/sysmonLogView
Эта команда оставит только важную информацию о событии.
Event SYSMONEVENT_CREATE_PROCESS
RuleName: -
UtcTime: 2025-09-06 08:46:06.529
ProcessGuid: {218d9a1a-f4ce-68bb-7db7-d9e08a550000}
ProcessId: 3235
Image: /usr/bin/systemctl
FileVersion: -
Description: -
Product: -
Company: -
OriginalFileName: -
CommandLine: systemctl status sysmon
CurrentDirectory: /root
User: root
LogonGuid: {218d9a1a-0000-0000-0000-000000000000}
LogonId: 0
TerminalSessionId: 4294967295
IntegrityLevel: no level
Hashes: SHA256=c3f60225cf89f20c2f870fd738a6452da820eff730a7e5f05ae03fde1aaa876a
ParentProcessGuid: {00000000-0000-0000-0000-000000000000}
ParentProcessId: 2095
ParentImage: -
ParentCommandLine: -
ParentUser: -
У утилиты SysmonLogView есть несколько полезных ключей.
# Отображать только sysmon Event ID 1sysmonLogView -e 1
# Отображать только Event ID 2–5sysmonLogView -r 2,5
# Отобразить события во временном интервалеsysmonLogView -t 2025-09-09 00:00,2025-09-09 15:00
# Фильтр событий по значению поля (но у нас очень часто выводило ошибки парсинга, на заметку)sysmonLogView -f Image=/usr/bin/systemctl
Для экспериментов мы будем использовать фильтрацию такого вида:
sudo tail -f /var/log/syslog | sudo /opt/sysmon/sysmonLogView -e 1
Посмотрим, как Sysmon себя покажет.
Создание процесса — Event ID 1
Запустим прослушку порта командой nc и выведем сгенерированное событие.
Event SYSMONEVENT_CREATE_PROCESS
RuleName: -
UtcTime: 2025-04-01 16:35:43.668
ProcessGuid: {218d9a1a-15df-67ec-7979-350909560000}
ProcessId: 9345
Image: /usr/bin/nc.openbsd
FileVersion: -
Description: -
Product: -
Company: -
OriginalFileName: -
CommandLine: nc -l 9999
CurrentDirectory: /root/
User: root
LogonGuid: {218d9a1a-0000-0000-0000-000000000000}
LogonId: 0
TerminalSessionId: 4294967295
IntegrityLevel: no level
Hashes: SHA1=4d82414a45e1559c6b06b675bb416c7a6b570430,MD5=aaade8e2a921e9ac40178a263ebb67e3,SHA256=2a6fac3d98e090468962ef18003cb8b89fbffa7219917ca12567d5e42b156948
ParentProcessGuid: {00000000-0000-0000-0000-000000000000}
ParentProcessId: 1555
ParentImage: -
ParentCommandLine: -
ParentUser: -
В событии есть метка времени (сразу в UTC, что немного мешает хантингу при работе на хосте), PID процесса, командная строка, директория, пользователь, хеши (чего в auditd не увидеть) и PID родителя. В целом информации не так много (вот бы сразу брать имя родительского процесса, например), зато все структурировано.
Из интересного: команда history не залогировалась, что печально.
Изменение временной метки файла — Event ID 2
Попробуем изменить временную метку файла:
echo > fileName.txt && touch -a -m -t 201512180130.09 fileName.txt
И на всякий случай еще так:
echo > future_file && touch -d 3333120102 future_file
Sysmon ничего не зафиксировал. Предсказуемо, но по‑своему обидно.
Сетевое соединение — Event ID 3
Сделаем простейший запрос:
curl -v https://google.com
И посмотрим результат:
Event SYSMONEVENT_NETWORK_CONNECT
RuleName: -
UtcTime: 2025-04-01 16:39:30.522
ProcessGuid: {218d9a1a-16c2-67ec-8dbe-804b34560000}
ProcessId: 9521
Image: /usr/bin/curl
User: root
Protocol: tcp
Initiated: true
SourceIsIpv6: false
SourceIp: 192.168.135.3
SourceHostname: -
SourcePort: 32796
SourcePortName: -
DestinationIsIpv6: false
DestinationIp: 74.125.71.100
DestinationHostname: -
DestinationPort: 443
DestinationPortName: -
В логах много сетевых соединений, включая локальные — их мы попробуем отфильтровать на следующем этапе эксперимента. Видим бинарник, IP-адреса источника и назначения и их порты. Из минусов — командную строку все равно придется искать в связанном событии создания процесса. В auditd, например, событие запуска процесса и сетевого подключения формируется под одним идентификатором аудита.
Также для ряда событий процесс (Image) получал имя <, что печально для подсистемы аудита — толку от таких логов мало.
Изменение Sysmon — Event ID 4
Закосим под дурачка и попробуем нагло включить и отключить автостарт службы Sysmon:
systemctl enable sysmon
systemctl disable sysmon
Нет реакции. Ладно, попробуем просто менять конфигурацию через sysmon .
Event SYSMONEVENT_SERVICE_STATE_CHANGE
UtcTime: 2025-04-03 16:45:26.270
State: Started
Version: 1.3.5
SchemaVersion: 4.81
В итоге установка и удаление сервиса через sysmon и sysmon детектируется, но манипуляции со службой через systemctl, увы, нет.
Процесс завершен — Event ID 5
Теперь прервем запущенный ранее процесс — просто жмем Ctrl-C в окне с nc .
Event SYSMONEVENT_PROCESS_TERMINATE
RuleName: -
UtcTime: 2025-04-01 16:37:02.636
ProcessGuid: {218d9a1a-15df-67ec-7979-350909560000}
ProcessId: 9345
Image: /usr/bin/nc.openbsd
User: root
Мы получили имя бинарника и PID убитого процесса. Немного, но честная работа.
Пустышки Event ID 6–8
Эти типы событий в Linux (загрузка драйвера, загрузка образа и создание удаленного потока) работают иначе, чем в родной для Sysmon Windows, поэтому и не детектируются. В Linux обычно драйвер — это модуль ядра, который можно загружать и выгружать. Список модулей и загрузку и выгрузку любого из них можно получить, например, так:
# Драйвер загружен — Event ID 6lsmod
modbrobe -rv snd_seq_dummy
modbrobe snd_seq_dummy
rmod snd_seq_dummy
Образ загружен — Event ID 7
Загрузка образа в терминологии Windows — это подгрузка дополнительных библиотек процессом.
Создание удаленного потока — Event ID 8
Этот тип события отвечает за выявление попыток process injection через WinAPI. Во всех трех случаях — предсказуемо никакой реакции от Sysmon.
Прямое чтение с диска — Event ID 9
С этим уже интереснее. Прямое чтение с блочных устройств в обход программных изоляций — одна из популярных техник злоумышленников. Посмотрим, какие диски у нас есть, через lsblk и попробуем прочитать первый попавшийся через open /.
Event SYSMONEVENT_RAWACCESS_READ
RuleName: -
UtcTime: 2025-04-03 17:23:05.024
ProcessGuid: {218d9a1a-c3f9-67ee-211f-58d5a0550000}
ProcessId: 14447
Image: /usr/bin/lynx
Device: /dev/sda
User: -
И куда же без старой доброй dd:
dd if=/dev/sda | hexdump -CEvent SYSMONEVENT_RAWACCESS_READ
RuleName: -
UtcTime: 2025-04-03 18:19:15.760
ProcessGuid: {218d9a1a-d123-67ee-210e-2a1c73550000}
ProcessId: 25942
Image: /usr/bin/dd
Device: /dev/sda
User: -
Опять же без события создания процесса мы фиксируем только факт прямого обращения к диску, но без привязки к какой‑либо конкретике.
Получен доступ к процессу — Event ID 10
Самый простой способ проверить это — запустить трассировку, например так: strace .
Event SYSMONEVENT_ACCESS_PROCESS
RuleName: -
UtcTime: 2025-04-03 17:33:33.500
SourceProcessGUID: {218d9a1a-c66d-67ee-5d11-1e7eb4550000}
SourceProcessId: 17313
SourceThreadId: 17313
SourceImage: /usr/bin/strace
TargetProcessGUID: {00000000-0000-0000-0000-000000000000}
TargetProcessId: 16412
TargetImage: -
GrantedAccess: 0x0
CallTrace: -
SourceUser: -
TargetUser: -
Event SYSMONEVENT_ACCESS_PROCESS
RuleName: -
UtcTime: 2025-04-03 17:33:33.502
SourceProcessGUID: {218d9a1a-c66d-67ee-5d11-1e7eb4550000}
SourceProcessId: 17313
SourceThreadId: 17313
SourceImage: /usr/bin/strace
TargetProcessGUID: {218d9a1a-c66d-67ee-b1c4-df6db4550000}
TargetProcessId: 16414
TargetImage: /usr/bin/cat
GrantedAccess: 0x0
CallTrace: -
SourceUser: root
TargetUser: root
В зарегистрированных событиях видно, что процесс strace действительно подключался к cat: факт есть, но что именно происходило — неясно. Также этот тип не детектировал создание дампов памяти процессов, например procdump .
Создание файла — Event ID 11
С отслеживанием создания файлов Sysmon справляется. Делаем touch , результат:
Event SYSMONEVENT_FILE_CREATE
RuleName: -
UtcTime: 2025-04-03 17:36:36.721
ProcessGuid: {218d9a1a-c724-67ee-5180-63511f560000}
ProcessId: 17446
Image: /usr/bin/touch
TargetFilename: /root/xakep
CreationUtcTime: 2025-04-03 17:36:36.721
User: -
В целом — приемлемо. Но почему не отмечается root-пользователь, непонятно. При работе от любого другого пользователя юзер определяется корректно.
Пустышки — Event ID 12–15
Для событий 12–15 (создание или удаление объекта в реестре — 12, изменение значения параметра реестра — 13, переименование объекта реестра — 14 и создание файлового потока — 15) Sysmon в Linux ничего не задетектит: в системе нет реестра, а используется файловая система (ext, XFS и прочие), отличная от журналируемой NTFS.
Поэтому едем дальше.
Изменение конфигурации Sysmon — Event ID 16
Попробуем очистить настройки через sysmon :
Event SYSMONEVENT_SERVICE_CONFIGURATION_CHANGE
UtcTime: 2025-04-03 17:44:09.505
Configuration: -
ConfigurationFileHash: -
И установить новые.
Sysmon -i /home/alex/almost_all_hunt-naked.xml
Event SYSMONEVENT_SERVICE_CONFIGURATION_CHANGE
UtcTime: 2025-04-03 17:45:18.987
Configuration: /home/alex/almost_all_hunt-naked.xml
ConfigurationFileHash: -
Хотя сброс на параметры по умолчанию и не был явно отмечен, по событиям создания процессов мы все еще можем понять примерный контекст изменений.
Пустышки — Event ID 17–22
Здесь у нас очередной набор пустышек. Создание именованного канала (Event ID 17) можно воспроизвести командами mknod или mkfifo . Попробуем к ним подключиться (Event ID 18):
echo 'SYSMONS DUCKS' > test_pipe &
cat test_pipe
Шум леса, сверчки, шелест травы.
Для событий, связанных с WMI (Event ID 19, 20, 21), предсказуемо ничего не будет из‑за проприетарности технологии (ну нет WMI в Linux).
Большие надежды мы возлагали на Event ID 22 — DNS-запросы: такие артефакты очень полезны при расследовании киберинцидентов. Но реальность полна разочарований: вместо этого в логе — лишь nslookup , ping , curl .
Звенящая пустота, но мы продолжаем двигаться дальше.
Файл удален с сохранением копии — Event ID 23
Просто удалим файл: rm .
Event SYSMONEVENT_FILE_DELETE
RuleName: -
UtcTime: 2025-04-03 17:58:35.876
ProcessGuid: {218d9a1a-cc4b-67ee-41ea-1e3619560000}
ProcessId: 23224
User: -
Image: /usr/bin/rm
TargetFilename: /root/MSTIC-Sysmon/linux/filed
Hashes: -
IsExecutable: -
Archived: -
Что интересно, событие 26, которое называется «Удаление файла», как раз не регистрируется. Но факт удаления зафиксирован — это обнадеживает.
Финальные пустоты — Event ID 24–29, 255
Попробуем обратиться к буферу обмена (Event ID 24) — предсказуемо не фиксируется (clip, echo ).
Изменение образа процесса (Event ID 25). В Linux у нас не получилось это воспроизвести (попробуй заменить запущенный процесс на лету, ага).
И удаление файла (Event ID 26) — через touch — фиксируется в событии 23, но почему‑то не в 26.
В актуальных сборках для Windows у Sysmon есть события 27 (блокировка исполняемого файла), 28 (блокировка поблочного удаления файла), 29 (исполняемый файл удален). Но это касается только PE-файлов в Windows.
Ошибок (код 255) мы тоже не получали во время испытаний.
Возможности оценили. Установка и первичная настройка выглядят просто, но, может, есть что‑то покруче? Давай попробуем подсунуть конфигурации с наворотами — фильтрацией событий и обогащением, хотя бы по техникам матрицы ATT&CK.
Эксперименты с обогащением конфигов
Ссылки на некоторые конфиги для Linux можно найти в статье «Применение утилиты Sysmon для повышения уровня кибербезопасности» Руслана Рахметова.
Некоторые приемы и фрагменты конфигурации можешь подсмотреть в статье Hunting for Persistence in Linux и шпаргалке.
Для развлечения установим «продвинутую конфигу» из MSTIC и посмотрим, как изменится формат вывода.
sysmon -c main.xml
После этого количество генерируемых ивентов резко упало — из‑за кучи фильтров. А команда crontab отвечает так:
Event SYSMONEVENT_CREATE_PROCESS
RuleName: TechniqueID=T1053.003,TechniqueName=Scheduled Task/Job: Cron
UtcTime: 2025-09-07 13:38:53.801
ProcessGuid: {30ec4589-8aed-68bd-f152-268a64550000}
ProcessId: 65293
Image: /usr/bin/crontab
FileVersion: -
Description: -
Product: -
Company: -
OriginalFileName: -
CommandLine: crontab
CurrentDirectory: /home/alex
User: root
LogonGuid: {30ec4589-0000-0000-0000-000000000000}
LogonId: 0
TerminalSessionId: 4294967295
IntegrityLevel: no level
Hashes: SHA256=11651a4bd5c9605dac9df09bcb1ce16e40e740558766081a784e16db0098c042
ParentProcessGuid: {00000000-0000-0000-0000-000000000000}
ParentProcessId: 22706
ParentImage: -
ParentCommandLine: -
ParentUser: -
Event SYSMONEVENT_FILE_CREATE
RuleName: TechniqueID=T1053.003,TechniqueName=Scheduled Task/Job: Cron
UtcTime: 2025-09-07 13:38:53.821
ProcessGuid: {30ec4589-8aed-68bd-f152-268a64550000}
ProcessId: 65293
Image: /usr/bin/crontab
TargetFilename: /var/spool/cron/crontabs/tmp.l2DA8v
CreationUtcTime: 2025-09-07 13:38:53.821
User: -
Теперь у нас есть поле RuleName, которое позволяет быстрее атрибутировать активность. Но все же, хоть прошлая конфигурация и была избыточной (логировала все и писала в громоздком Windows-формате), там сохранялось много полезных событий для расследования. Откатим настройки на дефолтные: sysmon .
Чтобы не заспамить событиями сетевого взаимодействия, можно отфильтровать локальные обращения — для этого достаточно вставить в конфиг такой блок:
<!--Event ID 3: Network connection--> <RuleGroup name="" groupRelation="or"> <NetworkConnect onmatch="exclude"> <SourceIp>127.0.0.1</SourceIp> <DestinationIp>127.0.0.1</DestinationIp> <DestinationIp>127.0.1.1</DestinationIp> </NetworkConnect> </RuleGroup>Хотя потенциально это может привести к потере части локальных соединений (привет, Docker и туннели!), в типичных случаях этого достаточно, чтобы не засорять аудит. В качестве домашнего задания можешь по аналогии отфильтровать локальные IPv6-адреса (но мы читеры и просто вставили в код выше строчку вида <).
Немного про eBPF
Как ты понял, Sysmon for Linux основан на eBPF. Если тебе интересны детали реализации eBPF в Sysmon, можно взглянуть на исходный код — там перечислены, например, основные системные вызовы, которые используются для формирования записи события в Sysmon. В частности, для создания процесса — execve, execveat; создания файла — creat; открытия файла — open, openat; удаления файла — unlink, unlinkat; TCP‑соединений — accept, accept4; доступа к процессу — ptrace; UDP‑соединений — recvfrom, recvmsg, recvmmsg, read; закрытия файлового дескриптора — close.
Этот список системных вызовов ты можешь взять за основу, чтобы реализовывать правила для auditd или Tetragon.
Выводы
С одной стороны, приятно, что можно быстро собрать базированную базу: просто поставить пакет и использовать один конфиг. С другой — инструмент по пути миграции между операционками потерял значительную часть своей полезности.
Чтобы выжать из Sysmon максимум, в конфиге нужно найти баланс: либо тонуть в куче мусорных событий, либо отфильтровать почти всю активность, создавая правила для почти каждой известной утилиты — и системной, и той, что может пригодиться в качестве GTFOBins. Суперконфига (как для Windows) в Linux пока не видно, да и вряд ли он появится. Дадим еще пару ссылок на разные конфиги для Sysmon под Linux:
- Sysmon Modular — набор модульных конфигов Sysmon;
- Sysmon Config от ion-storm — расширенные правила;
- Sysmon Config от SwiftOnSecurity — классический базовый набор;
- MSTIC Sysmon для Linux — официальные конфиги Microsoft.
В итоге фиксируется довольно мало информации, и качество тоже не очень; из плюсов — все в понятном виде, минимальный набор пригодных для расследования событий, есть хеши. Но на этом, пожалуй, и все. Так что как игрушка и потенциальная жертва форков — почему нет. Но мы никогда не видели, чтобы кто‑то использовал Sysmon for Linux иначе, чем как упражнение. Но кто знает, это может и измениться.
