Lesson 3 of 6 · 20 min read

SwiftOnSecurity & Olaf Hartong Baseline Configs — What They Include and Why

Writing a Sysmon config from scratch is a weeks-long exercise. Two community configs — SwiftOnSecurity and sysmon-modular — represent years of accumulated tuning work. Understanding what they choose to log (and what they exclude) teaches you how experienced detection engineers think about signal-to-noise trade-offs.


SwiftOnSecurity: Balanced Permissiveness

The SwiftOnSecurity config follows a philosophy of inclusive logging with targeted exclusions:

Why exclude by image path, not process name?

The SwiftOnSecurity config typically excludes by full image path:

<Image condition="is">C:\Windows\system32\svchost.exe</Image>

Not just:

<Image condition="end with">svchost.exe</Image>

The reason: an attacker can name their malware svchost.exe and drop it in a user-writable path (C:\Users\jdoe\AppData\Local\svchost.exe). A full-path exclude would still log it. An endswith exclude would silently suppress it.


sysmon-modular: ATT&CK-Aligned Modules

Olaf Hartong’s sysmon-modular is organized differently — each XML file targets a specific ATT&CK technique or detection goal:

sysmon-modular/
├── 1_process_creation/           ← Event 1 rules
│   ├── include_attrib_abuse.xml  ← T1564.004 (hidden files via attrib)
│   ├── include_lolbas.xml        ← Living off the land binaries
│   ├── include_powershell.xml    ← PowerShell execution patterns
│   └── exclude_known_good.xml
├── 3_network_connection/         ← Event 3 rules
│   ├── include_suspicious_ports.xml
│   └── exclude_browsers.xml
├── 10_process_access/            ← Event 10 rules
│   ├── include_lsass.xml         ← T1003.001
│   └── include_sam_access.xml    ← T1003.002
├── ...
└── sysmonconfig.xml              ← Merged output

Building a custom config with sysmon-modular

# The repo includes a merge script
python sysmon_merge.py \
  --include 1_process_creation/include_lolbas.xml \
  --include 1_process_creation/include_powershell.xml \
  --include 10_process_access/include_lsass.xml \
  --exclude 3_network_connection/exclude_browsers.xml \
  --output my_sysmonconfig.xml

This approach lets you:

SwiftOnSecurity sysmon-config— GitHub sysmon-modular— GitHub