Skip to content

[adaxes] Add new integration for Softerra Adaxes operation logs#18947

Open
c3dn wants to merge 6 commits into
elastic:mainfrom
c3dn:community/adaxes-integration-v0.1.0
Open

[adaxes] Add new integration for Softerra Adaxes operation logs#18947
c3dn wants to merge 6 commits into
elastic:mainfrom
c3dn:community/adaxes-integration-v0.1.0

Conversation

@c3dn
Copy link
Copy Markdown

@c3dn c3dn commented May 11, 2026

What

Adds a community integration that ingests Softerra Adaxes operation logs over syslog (UDP/TCP) into the logs-adaxes.operations data stream.

  • UDP and TCP inputs (default port 9514).
  • Ingest pipeline strips the tagless RFC3164 header Adaxes emits, decodes PRI into log.syslog.facility/severity, then parses the pipe-delimited operation body — both real shapes (<initiator>|<operation>|<result> and <operation>|<result>) plus two customised-template fallbacks.
  • Initiator field Name (N) (email) is sub-parsed into user.name, user.email, adaxes.initiator.sequence.
  • Severity 3 + non-Success body → event.outcome=failure with adaxes.result.reason populated. Captures denied deletes, password-reset access-denied, etc.
  • event.action derived for ~20 Adaxes verbs (user lifecycle, password ops, group membership, PowerShell, mailbox, notification, report, scheduled task).
  • ECS-aligned: user.name/email, source.address, observer.*, fingerprinted event.id (SHA-256) for dedup, event.original preserved.

Why

Adaxes is widely deployed for AD administration and its service log is the audit trail of every directory change. Today operators roll their own Logstash/grok; this ships a turnkey ECS-aligned data stream so failed privileged operations are detectable in Kibana / Elastic Security out of the box.

How to test

elastic-package stack up -d -v --version 9.4.0
elastic-package install -C packages/adaxes
# Fleet UI: add "Softerra Adaxes" → enable UDP input on 0.0.0.0:9514
logger -n <agent-host> -P 9514 -d -t Adaxes \
  "Administrator (Administrator@adaxes.local)|Update user 'alice (adaxes.local\\AdaxesLab)' - set 'Office' to 'HQ-3'|Success"
# Kibana → Discover: data_stream.dataset : "adaxes.operations"

# Offline pipeline regression (38 events):
elastic-package test pipeline -C packages/adaxes

Validation

  • elastic-package check clean.
  • elastic-package test pipeline — 38 events: 15 anonymized real production samples (varied verbs, scheduled-task initiators, German + English descriptions, success and access-denied), 7 fresh samples from a live Adaxes 2026.1 lab install, plus synthetic coverage of customised templates and raw <PRI>-prefixed lines.
  • End-to-end validated against a real Softerra Adaxes 2026.1 install on Windows Server 2022. Wire bytes from Adaxes' own UDP socket land in logs-adaxes.operations-default with every field correctly populated — including the failure path (built-in-account deletion attempt → event.outcome=failure, adaxes.result.reason="Cannot perform this operation on built-in accounts").

Checklist

  • Reviewed tips for building integrations
  • All data streams collect logs
  • changelog.yml entry added
  • kibana.version: ^9.3.3
  • elastic-package check + elastic-package test pipeline pass locally
  • CODEOWNERS entry added (/packages/adaxes @c3dn)
  • Every ingest processor has a tag; pipeline has top-level on_failure
  • Dashboards / Kibana Discover screenshot — follow-up PR

Initial release. Receives Softerra Adaxes operation logs over syslog
(UDP/TCP) and parses them into ECS-aligned events under the
logs-adaxes.operations data stream.

The integration:
- UDP and TCP inputs (default port 9514; Adaxes default is 514, remap
  externally where needed).
- ES ingest pipeline strips the tagless RFC3164 header that Adaxes
  emits, decodes PRI into log.syslog.facility/severity, then parses the
  pipe-delimited operation body. Both real-Adaxes shapes are handled:
  3-field <initiator>|<operation>|<result> and 2-field
  <operation>|<result> (system-initiated). Customised log templates
  using "Operation:/Target:/Initiator:/Initiator Host:/Result:" labels
  or "Initiator=...|Operation=...|Target=...|Result=..." are also
  matched as lower-priority patterns.
- Initiator field "Name (N) (email)" sub-parsed into user.name,
  user.email, and adaxes.initiator.sequence.
- Severity 3 + non-Success result text is mapped to event.outcome=
  failure with the message captured into adaxes.result.reason; this
  correctly tags failed privileged operations (denied delete, password
  reset access-denied, etc.).
- event.action derivation covers the documented Adaxes operation
  vocabulary: object_created/deleted/modified/disabled/enabled/
  unlocked/moved/renamed/copied, password_reset/changed,
  membership_added/removed, powershell_executed, mailbox_created,
  notification_sent, custom_command_executed, scheduled_task_executed,
  report_requested/generated/delivered/document_created/
  overview_built, request_approved/denied, authentication.
- Maps to ECS user.name/email, source.address (from customised
  template), observer.{vendor,product,type}; fingerprints event.id
  (SHA-256 over @timestamp / description / target / initiator) for
  dedup.
- Preserves the raw payload under event.original.

Pipeline test fixture covers 38 events: 15 anonymized real production
samples (varied verbs, scheduled-task initiators, German and English
descriptions, success and access-denied), 7 fresh samples from a
live Adaxes 2026.1 lab install (create with property list, multi-prop
update, multi-member group add, fail-on-built-in-account-delete,
build report overview), plus synthetic coverage of customised
templates and raw <PRI>-prefixed lines.

End-to-end validated against a real Softerra Adaxes 2026.1 trial
install on Windows Server 2022. Wire bytes from Adaxes' own UDP socket
land in logs-adaxes.operations-default with every field correctly
populated, including the failure path (event.outcome=failure with
adaxes.result.reason set from the Adaxes-emitted error message).

The changelog link will be updated to this PR's URL once the PR
number is assigned.
@cla-checker-service
Copy link
Copy Markdown

cla-checker-service Bot commented May 11, 2026

❌ Author of the following commits did not sign a Contributor Agreement:
, , , , , c503b82

Please, read and sign the above mentioned agreement if you want to contribute to this project

@elastic-vault-github-plugin-prod
Copy link
Copy Markdown

Reviewers

Buildkite won't run for external contributors automatically; you need to add a comment:

  • /test : will kick off a build in Buildkite.

NOTE: https://github.com/elastic/integrations/blob/main/.buildkite/pull-requests.json contains all those details.

c3dn pushed a commit to c3dn/integrations that referenced this pull request May 11, 2026
@c3dn c3dn force-pushed the community/adaxes-integration-v0.1.0 branch from b52dfb1 to bf0edb0 Compare May 11, 2026 20:22
@c3dn c3dn marked this pull request as ready for review May 11, 2026 20:35
@c3dn c3dn requested a review from a team as a code owner May 11, 2026 20:35
c3dn and others added 2 commits May 11, 2026 23:34
Clarifies community status and disclaims affiliation with Softerra Ltd.
per nominative fair use convention.
The initiator sub-parser anchored the name capture at the first '(' via
[^(]+?, so display names containing parens — e.g.
"Bob Smith (disabled) (bob@corp.com)" or "John (IT) (1) (john@example.com)" —
failed silently: adaxes.initiator.name kept the raw string but user.name,
user.email, and adaxes.initiator.sequence were not populated.

Switching to .+? lets the trailing ')$' anchor backtrack across inner
parens and still latch onto the final email parens. Baseline patterns
(UserB (2) (userb@example.com), Administrator (admin@adaxes.local))
parse identically; paren-in-name variants now parse correctly.
@andrewkroh andrewkroh added needs CLA User must sign the Elastic Contributor License before review. New Integration Issue or pull request for creating a new integration package. documentation Improvements or additions to documentation. Applied to PRs that modify *.md files. labels May 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation. Applied to PRs that modify *.md files. needs CLA User must sign the Elastic Contributor License before review. New Integration Issue or pull request for creating a new integration package.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants