Sysmon Configuration Management

Athena manages the Microsoft Sysmon configuration on your Windows endpoints. It shows which machines run Sysmon and which configuration each one has loaded. You can keep named, versioned configurations, build and validate rules in an editor, and deploy a revision to the fleet. A machine that runs a different configuration is flagged as drifted. Optionally, a Compliance rule keeps checking every machine and re-applies the configuration automatically. Everything runs on your server, so it works the same on an air-gapped network.

Athena manages the configuration, not the Sysmon install

Athena works with endpoints where the Sysmon service is already installed. It finds Sysmon through its Windows service (Sysmon64 or Sysmon). Then it loads configurations with Sysmon's own sysmon -c command. Machines without Sysmon appear as Not installed, and deploys skip them. Linux agents, and Windows agents too old to support Sysmon reporting, appear as Unsupported.

Sysmon management is a separately licensed module. If your license does not include it, the screens below are hidden. See Separately licensed modules.

Where Sysmon appears#

Sysmon has three permissions:

See Roles & Permissions and Policies: who can see and change what.

How status is reported#

Each Windows agent reports its Sysmon state: whether Sysmon is installed, its version and schema version, the path of the loaded config file, and the SHA-256 hash of the loaded configuration. The server asks for a report:

The last report from each agent is saved in the database, so the status survives a server restart.

Agent states

Athena compares each agent's loaded hash with the hash of the revision that agent was last deployed. It does not compare against a fleet-wide value. So machines targeted with different configurations are each judged against their own revision.

StateMeaning
In syncThe loaded configuration's hash matches the revision this agent was deployed. This is the only proof that a configuration was applied.
DriftSysmon runs a configuration different from the revision this agent was deployed.
Not managed by AthenaA configuration is loaded, but Athena never deployed one to this agent ("Running a config Athena didn't deploy"). The strip and widget count these as not managed.
No configSysmon is installed but has no configuration loaded.
Not installedThe agent reported that Sysmon is not installed.
ErrorThe agent could not read Sysmon's state.
UnsupportedThe agent cannot report on Sysmon (a Linux agent, or an older Windows agent).
UnknownNo report received yet.

Offline is not a state. It is an extra marker: an agent with Sysmon installed that is not connected right now counts as Offline in the strip and filters, and its row keeps its last known state.

Status strip and agents table

The top of the Sysmon tab shows a strip of counts: agents targeted, in sync, drifted, no config, not managed, error, not installed, unknown and offline. On the right is the most recently deployed revision (active: <configuration> · rev N). Agents targeted is the number of machines a deploy would reach right now: Sysmon installed and connected.

The Agents table lists every reporting machine with its Hostname, Sysmon version, Schema, Loaded config path (hover it to see the hash), State, Expected rev and Last report time. Use Filter by hostname and the state chips (All, each state, Offline) to narrow it down. The table shows 50 rows per page, with Previous and Next buttons.

Configurations and revisions#

Athena keeps Sysmon XML as named configurations, and each configuration has numbered revisions (rev 1, rev 2, …). Every load (upload, paste or blank) starts a new configuration at rev 1. Each save from the rule editor adds the next revision to the configuration you are editing. Every revision is stored byte for byte, and its SHA-256 is exactly the hash Sysmon reports once that configuration is loaded. That is how drift detection works.

The Configurations list on the Sysmon tab shows, for each configuration: its name, an Active badge if it holds the most recently deployed revision, the latest revision number, how many agents it is deployed to, and when it was last changed. The actions are:

Adding a configuration

Use the Upload a Sysmon config (.xml) control on the tab, or click New configuration to open /policies/sysmon/new, which has three options:

Optionally enter a Configuration name. If you leave it empty, the configuration is named after the file. Athena refuses a file that is:

A file that passes these checks but has schema validation errors is still stored. It is marked invalid, and you can open it in the editor to fix it, but you cannot build or deploy it until the errors are fixed. Deploying a configuration that Sysmon would reject would fail, and the machines would keep their old rules.

No internet access needed

Athena never fetches configurations from the internet. To start from a community configuration (for example SwiftOnSecurity, Olaf Hartong or Neo23x0), download the .xml on a connected machine, bring it across, and upload it. It works the same on an air-gapped install.

Schema ceiling

Every Sysmon version supports schemas up to a certain version. A configuration that declares a newer schema than a machine's Sysmon supports is rejected there. The apply fails, and that machine silently keeps its old rules. Athena calculates a schema ceiling for the target from the lowest Sysmon version installed in it. When a loaded file declares a schema above the ceiling, the New configuration screen warns you and says how many agents would reject it. Then you can choose Downgrade to <ceiling> and open, which saves a copy that declares the ceiling as a new revision. You can also leave those agents out of the deploy target.

The rule editor#

Open in editor opens a revision at /policies/sysmon/editor/<id>. The editor has these parts:

The toolbar has a Target picker (All Sysmon agents, any collection, or any tag), with the number of agents for each. It also has these buttons:

You must save before you deploy, because a deploy always sends the saved revision. A revision that is not UTF-8 or UTF-16 cannot be opened in the editor, but it can still be deployed as stored.

Deploying a revision#

Deploy on the Sysmon tab sends the revision to every connected agent that has Sysmon installed. From the editor or the API you can narrow the target to a collection or a tag. Athena:

  1. refuses the deploy if the revision has validation errors, or if no connected agent in the target has Sysmon installed ("No connected agent has Sysmon installed - nothing to deploy to.");
  2. builds the revision's deployment package, if it has none yet;
  3. starts a normal deployment named Sysmon · <configuration> · rev N, which you can follow under Active Deployments and Deployment History. On each agent it runs sysmon -c with the revision's file. If Sysmon rejects the file, it exits with a non-zero code and that agent's step fails;
  4. records this revision as what each targeted agent should run. Agents outside the target keep their previous expectation;
  5. asks the targeted agents to report again after 30 seconds and after 2 minutes.

The confirmation reads "… is deploying to N agent(s). It counts as applied only when those agents report In sync." A successful deployment step alone does not prove the configuration was loaded. Only In sync proves it.

Continuous enforcement (Compliance)#

A deploy is a one-time action. To keep checking the fleet afterwards, turn on Enforce for a configuration. Athena then creates a Compliance baseline named Sysmon · <configuration> (#<id>), with one Windows rule … loaded, and assigns it. On each evaluation the rule runs sysmon -c on the machine and passes only if the loaded configuration's SHA-256 matches the configuration's latest deployed revision. It fails, with a warning saying why, when Sysmon is not installed, has no configuration loaded, runs another configuration, or cannot be run.

Results appear like those of any other baseline. See Compliance & Baselines and Compliance Evaluation.

Filter fields, reports and scheduling#

Filter fields

The Sysmon state of each agent is available as filter fields. You can use them in dynamic collections, tagging rules, monitors and reports. For example, Module.sysmon.State equals Drift builds a collection of drifted machines.

LabelField pathType
Sysmon InstalledModule.sysmon.InstalledBoolean
Sysmon StateModule.sysmon.StateOne of Unknown, Unsupported, Error, NotInstalled, NoConfig, NoActiveRevision (Not managed by Athena), InSync, Drift
Sysmon VersionModule.sysmon.VersionVersion
Sysmon Schema VersionModule.sysmon.SchemaVersionVersion
Sysmon Config HashModule.sysmon.ConfigHashString (SHA-256, hex)
Sysmon Expected RevisionModule.sysmon.ExpectedRevisionNumber (global revision id)

Report data source

Reports can use the Sysmon Agents data source, with these columns: Hostname, Sysmon Version, Schema Version, State, Config Hash, Expected Revision, Expected Configuration and Last Report.

Scheduled status checks

Scheduled Jobs include a Sysmon Status Check action ("Re-check Sysmon status on all agents"). It asks every connected agent to report, like the Refresh button does.

Audit trail#

Sysmon actions are recorded in the Audit Log with the user who performed them:

Event typeShown asRecorded when
SysmonConfigUploadedSysmon Config UploadedA configuration revision is stored (upload, paste, blank or editor save).
SysmonConfigDeployedSysmon Config DeployedA revision is deployed. Includes the number of agents and the deployment execution; the new value is the revision's SHA-256.
SysmonConfigurationRenamedSysmon Configuration RenamedA configuration is renamed.
SysmonEnforcementEnabledSysmon Enforcement EnabledEnforcement is turned on. Records the revision, hash, target, interval and auto-fix setting.
SysmonEnforcementChangedSysmon Enforcement ChangedThe enforced revision, target, interval or auto-fix setting changes, including when the rule follows a new deploy.
SysmonEnforcementDisabledSysmon Enforcement DisabledEnforcement is turned off, or switched off because it could not be set up or could not follow a deploy (the reason is included).

REST API#

You can script everything the Sysmon tab does. All endpoints are under /api/modules/sysmon. Every endpoint needs sysmon.view, and every POST, PUT, PATCH and DELETE also needs sysmon.manage. Responses use the standard Athena envelope (success, data, message). A refused request returns 400, with validation errors listed. An unknown revision or configuration returns 404. Wherever a target is accepted, it is all (the default), collection:<id> or tag:<name>.

Method & pathPurpose
GET /statusEach agent's state plus the strip counts.
POST /status/refreshAsks every connected agent to report now. data = how many were asked.
GET /configurationsEvery configuration with its latest revision, revision count and deployed-to agent count.
GET /configurations/{id}One configuration with all its revisions.
PATCH /configurations/{id}Rename. Body: {"name": "…"}.
GET /configurations/{id}/enforcementEnforcement settings (defaults if never set).
PUT /configurations/{id}/enforcementTurn enforcement on or off. Body: {"enabled": true, "autoRemediate": false, "target": "all", "intervalMinutes": 60}. target is all or collection:<id>; target and intervalMinutes keep their last value if you omit them.
GET /revisionsAll revisions and the active revision id.
POST /revisionsUpload a file as rev 1 of a new configuration (multipart field file, optional form field configurationName).
POST /revisions/pasteStore pasted XML. Body: {"xml": "…", "name": …, "note": …, "configurationName": …}.
POST /revisions/blankA new blank configuration. Body: {"schemaVersion": …, "target": …, "name": …, "configurationName": …}. If you omit schemaVersion, the target's ceiling is used.
GET /revisions/{id}A revision with its parsed rules and validation result.
GET /revisions/{id}/content, GET /revisions/{id}/exportDownload the revision's XML exactly as stored.
POST /revisions/{id}/validate?target=…Validate against the target's schema.
POST /revisions/{id}/packageBuild the revision's deployment package (refused if invalid).
POST /revisions/{id}/deploy?target=…Deploy to the connected Sysmon agents in the target. data has the deployment executionId and targetCount.
GET /targetsTarget choices (all, each collection, each tag) with agent counts.
GET /ceiling?target=…&revisionId=…The target's schema ceiling. With revisionId, also shows who is below that revision's schema and who is in sync.
GET /manifest?schema=…The event types, fields, operators and config elements available at a schema version.

For example, to deploy revision 12 to one collection:

curl -k -X POST -H "Authorization: Bearer <token>" \
  "https://<server>:8443/api/modules/sysmon/revisions/12/deploy?target=collection:<collection-id>"

The 12 in the path is the revision's global id (the #id shown in the revision list), not its rev N number within the configuration.

Server configuration#

Set these in appsettings.json or as environment variables (use __ for :). See Configuration.

SettingDefaultPurpose
Modules:Sysmon:StatusIntervalMinutes5How often every connected agent is asked for its Sysmon state. Values of 0 or below fall back to 5.
Modules:Sysmon:StoragePath<Storage:DataRoot>/modules/sysmonWhere configuration revision files are stored. If Storage:DataRoot is not set, the default is Athena/modules/sysmon under the system's common application data folder. Include this folder in your backups. See Data Directories & Backup.

Troubleshooting#

SymptomWhat to check
Deployment succeeded but the agent shows DriftSysmon kept its old configuration. Check the deployment step output for the machine in Deployment History. The most common cause is a schema newer than the machine's Sysmon supports (see Schema ceiling). Then click Refresh to get a fresh report.
"No connected agent has Sysmon installed"No agent in the target is both connected and reporting Sysmon installed. Check the agents table filters (Not installed, Offline, Unknown) and click Refresh.
Many agents show Not managed by AthenaThey run a configuration that Athena never deployed to them. Deploy a revision to take them under management.
Deploy refused with validation errorsOpen the revision in the editor, fix the listed errors, then Save & build package and deploy the new revision.
Enforce switch turns itself offThe configuration was never deployed, the revision is over 1 MB, or the Compliance baseline could not be created or updated. The message on the tab names the cause, and so does the SysmonEnforcementDisabled audit entry.
Agent tab says "not connected, so it cannot report now"A refresh only reaches connected agents. The agent reports again automatically when it reconnects.