8.1 KiB
Custom advanced audit profiles
-ProfileFile selects an operator-owned JSON file for profiles, plan,
audit-settings (also audit) and configure. Built-in files and legacy baseline
outputs are unchanged. Custom profiles cover advanced Security audit policy and
its precedence prerequisite only. Sysmon is excluded; channel settings, SACL
writes, command-line capture, forwarding and other native settings retain their
separate commands. A matching configuration does not establish Sigma readiness.
./WELA.ps1 profiles -ProfileFile config/custom-audit-profile.example.json
./WELA.ps1 plan -Profile custom-example -ProfileFile config/custom-audit-profile.example.json -Role Client -Build 26100 -PlanPath custom-plan.json
./WELA.ps1 audit-settings -Profile custom-example -ProfileFile C:\Policy\organization.json -PlanPath custom-audit.json
./WELA.ps1 configure -Profile custom-example -ProfileFile C:\Policy\organization.json -DryRun -ResultsPath preview.json
./WELA.ps1 configure -Profile custom-example -ProfileFile C:\Policy\organization.json -BackupPath C:\Policy\new-recovery-directory -ResultsPath result.json
Copy and review the example before configuration. Its placeholder source URL is
not a real standard. The example requests minimum Process Creation Success,
exact Process Termination Success, optional File System Success/Failure, and
preserves Detailed File Share. Exact settings may remove existing auditing;
minimum settings preserve extra enabled flags. File System remains unchanged
unless -IncludeOptional is selected and requires matching object SACLs for useful
events. Every omitted subcategory remains explicitly unchanged or role-inapplicable.
-Profile is mandatory except when listing the file. The selected ID must belong
to that file; WELA does not fall back to a built-in profile or merge definitions.
Built-in IDs cannot be redefined. -Baseline and unrelated command options cannot
be combined with -ProfileFile. Supply both role/build for offline plans or omit
both for native detection. Explicit custom applicability is operator-declared;
it is not a claim that WELA or Microsoft tested that build. Live application still
requires the actual role/build to match and refuses unreadable current state.
File format
Use UTF-8 strict JSON, at most 1 MiB and 20 nesting levels, with:
schemaVersion: 1andkind: "WelaCustomAuditProfiles".catalog: 1–59 references, each containing exact canonicalid(subcategory name),guidandcategory. List every control used anywhere in the file. GUID casing is immaterial; names/category spelling must be exact. The full authoritative catalog supplies supported roles and prerequisites: custom files cannot replace those fields or introduce arbitrary GUIDs.sources: a nonempty object keyed by lowercase source IDs. Each source requires nonemptytitle,versionand an absolute HTTPSurl. URLs are references only; WELA never fetches them. Source identity remains operator-declared.profiles: 1–128 objects with unique lowercase IDs,version,sourceIds,omitted: "unchanged",scope: "advanced-audit-policy-only",appliesTo,controls, androleOverrides. Optionalnoteis text; optionalreferenceOnlyis boolean and prevents configuration when true.
Each applicability range declares roles and integer minBuild/maxBuild within
1–999999. Roles are Client, MemberServer, DomainController and ADCS (a member-server
CA). Combined DC/CA detection remains unsupported. Each controls entry uses a
catalog name and { "mode": ..., "mask": ... }; source IDs, evidence and notes can
also be attached to a control. Role overrides use the same control schema.
| Mode | Mask | Behavior |
|---|---|---|
| exact | Integer 0–3 | Exact required success/failure flags; may remove existing flags |
| minimum | Integer 0–3 | Enable only required flags, preserving additional auditing |
| optional | Integer 0–3 | Preserve unless -IncludeOptional, then apply the exact mask |
| unchanged | Omitted | Preserve current policy |
| not-configured | Omitted | Preserve effective policy; does not remove GPO/MDM configuration |
| not-applicable | Omitted | Skip this control |
Success is 1, Failure is 2, both is 3, neither is 0. Duplicate/case-colliding JSON properties, duplicated IDs/GUIDs, unknown fields, invalid source references, undeclared controls, coercible string/boolean masks and unsupported types are rejected. Input is parsed as data; strings containing script syntax are never executed. Executable hooks and custom command strings are not supported. JavaScript extensions such as single-quoted or unquoted property names are also rejected before duplicate-key checks; they cannot hide a second audit mask.
For canonical identifiers, inspect config/audit_profiles.json or run:
Import-Module ./modules/AuditProfiles.psm1
(Import-WelaAuditProfiles).catalog | Select-Object id, guid, category, roles, prerequisites
Verification and recovery
Strict file validation runs before host reads. An explicitly supplied unsupported
role/build is rejected at that stage; otherwise native detection supplies context.
Plans and results record the exact selected-file SHA-256, canonical-catalog
SHA-256, profile version and declared sources. Output/backup paths cannot equal the
selected input or canonical catalog. No built-in profile file is written.
For custom profiles, -ResultsPath and -PlanPath must name distinct new local
files under existing directories. Existing outputs are preserved, including
hard-link or symlink aliases of an input. Reparse-point directory ancestry is
refused, and final output uses CreateNew rather than overwriting a file created
after the initial check. Choose fresh names for repeated runs. Both successful
and failed configuration results can be written without altering the input;
the result's source fingerprint describes the policy that was assessed.
The shared configuration engine checks file fingerprints and actual role/build before each control, after confirmation/journaling but before each write, and at read-back/final verification. Precedence must be verified before dependent audit writes. Every pre-change journal entry records input provenance. Minimum writes only enable required native flags, and verification accepts compliant supersets. Changed, deleted or unreadable input stops subsequent writes and reports failure; already applied changes remain recorded for recovery. Checks are observations, not atomic protection against a privileged writer replacing files between checks. Keep the policy directory controlled during the operation.
Review before.jsonl and restore only the recorded preceding precedence value/type
and audit flags through your approved recovery process. WELA does not automatically
undo partially applied changes, restore a GPO, or invoke policy refresh. Re-run the
assessment after GPO/MDM refresh to verify effective state.
Tests exercise malformed files, preservation modes, validation ordering, mocked writes, prompt-time file changes and final drift. Windows CI also exercises the actual public Plan, DryRun, Configure and Audit commands on disposable Server 2022/2025 hosts with PowerShell 5.1/7. A fixture-owned custom file selects four canonical controls: minimum and exact masks, an explicit optional control, and Not Configured preservation. Tests compare all 59 masks, typed precedence, source fingerprints, native channels and original journals, then verify exact fixture restoration. Invalid role selection is refused before configuration, and repeated configuration makes no further native change. These are hosted standalone servers classified by the shared profile engine as MemberServer; no domain join or GPO refresh is simulated. Configuration and benign event/backend acceptance on Windows 11, domain-joined servers, DC and AD CS labs remain separate; no clean-install or detection-coverage claim is made.
Issue 185 coverage
Custom audit settings are loaded from a versioned JSON profile instead of requiring script edits. Exact, minimum, preserve, optional, and not-configured semantics are validated before configuration, with profile hashes guarding against drift.