You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Part of:#2696 · Needs first:#2697 (click-through to the Log Explorer and the value/count table) Related:#1977 (parsers and rules for this integration, owned by the detection team)
Goal
Ship a built-in IBM AIX dashboard that shows, at a glance, how much IBM AIX is sending, whether it is still sending, and what kinds of events they are. The heart of it is the list of IBM AIX logs grouped by programs (widget W7): click one and the Log Explorer opens on exactly those logs.
Where the data comes from
Integration (catalog name)
AIX
Data type
ibm-aix
How the logs arrive
AIX syslogd forwards its messages (UDP or TCP 7016) to the UTMStack forwarder, adding the prefix 'Message forwarded from :' that the parser relies on.
The IP address of the machine that sent the syslog line, normally the AIX server (or a relay). Proof: collectors/forwarder/collector/syslog/handler.go resolveRemoteAddr (lines 21-33) and readLoop (line 79); listener.go lines 264-266 for UDP; 127.0.0.1 becomes the forwarder's host name. The AIX host name the parser extracts (from.host) is not stored (see parserIssues), so the IP is the only host identity.
Grouped by
log.eventType (programs)
Why log.eventType: AIX syslog has no event ID. The syslog tag, meaning the program name in front of '[pid]:' or ':' (sshd, sudo, cron, Oracle Audit), is the closest 'what kind of event' field: few values, readable, and it separates SSH, sudo, scheduled jobs and Oracle audit records. It exists on forwarded lines whose message starts with a tag; other lines have none, so W7/W8 filter on exists. Two risks could not be verified because the grok engine is not in the snapshot: the typo on line 49 may stop the step that every later field depends on, and if grok patterns are not anchored at the start, the last grok (lines 478-488) would overwrite log.eventType with the host name.
Typical values: sshd, sudo, su, cron, Oracle Audit
Widgets
Standard layout from the parent issue; rows W2, W3 and W9 onward are specific to this integration.
#
Title
Shown as
Query
Why
W1
Total logs
number
logs: count
How many AIX syslog messages arrived in the selected time range.
W2
Sudo commands
number
logs: count; filter origin.command exists
Privileged commands run with sudo; the parser only fills origin.command from sudo lines.
W3
Connections from remote IPs
number
logs: count; filter origin.ip exists
Messages that name a source IP and port, mostly SSH logins, failures and disconnects.
W4
Alerts
number
alerts: count
Alerts raised by the 10 shipped AIX rules (dataType ibm-aix).
W5
Log volume over time
area chart
logs: count over time
Shows gaps (a server stopped forwarding) and bursts.
W6
Logs by AIX host
bar chart
logs: top 10 values of dataSource
dataSource is the sending server's IP; the parsed host name is not stored.
W7
Top programs
value and count table
logs: top 25 values of log.eventType; filter log.eventType exists
The main list: which programs log (sshd, sudo, cron, Oracle Audit); click one to see its messages.
W8
Programs over time (top 5)
line chart
logs: count over time, one line per value of log.eventType (top 5); filter log.eventType exists
Spots a program that suddenly gets loud, such as an sshd burst during a password attack.
W9
Top sudo commands
value and count table
logs: top 10 values of origin.command; filter origin.command exists
Commands are long text, so a two-column table reads better than bars.
W10
Top source IPs
bar chart
logs: top 10 values of origin.ip; filter origin.ip exists
Who connects to the AIX servers most (SSH brute force stands out).
W12a
Source countries
bar chart
logs: top 10 values of origin.geolocation.country; filter origin.geolocation.country exists
AIX servers are usually internal, so any public source country deserves a look.
W12b
Logs by syslog priority code
bar chart
logs: top 10 values of log.priority; filter log.priority exists
The one field every AIX line gets, even when the rest of the parsing fails; codes are explained in the caveats.
The newest messages with program, user, source IP, command and text.
Fields used and where they come from
log.eventType: Program (syslog tag) that wrote the message. Examples: sshd, sudo, Oracle Audit. Source: grok lines 177-186 ('{{.data}}[' when log.msgAll matches '\w+[[0-9]+]:'), '[' trimmed lines 191-195; grok lines 461-467 ('{{.word}}(:)'), ':' trimmed lines 494-499
origin.command: Command run through sudo (text after COMMAND=), or the text of a '(command continued)' line. Examples: /usr/bin/ls -la /home/app, /usr/sbin/shutdown -r now. Source: grok lines 132-139 (COMMAND=) and 144-155 ((command continued))
origin.ip: Source IPv4 address from messages of the form '... from port ' (mostly sshd). Examples: 10.0.0.5, 203.0.113.40. Source: grok lines 394-407 and 409-422 on log.msg (where regexMatch 'from(.+)port')
origin.geolocation.country: Country of a public origin.ip. Examples: Brazil. Source: dynamic step lines 556-561; plugins/geolocation/geolocate.go skips private ranges
origin.user: User name, but unreliable: on sudo lines it ends up as the run-as user (USER=), not the person who ran sudo, and it may keep a trailing space. Shown only in the table. Examples: root. Source: grok lines 68-77 (sudo caller), overwritten by lines 118-127 (USER=); grok lines 409-422 ('from user ')
log.priority: Syslog priority number (facility x 8 + level). Present on every line, even when nothing else parses. Examples: 38 (auth.info), 86 (authpriv.info), 13 (user.notice), 30 (daemon.info), 78 (cron.info). Source: grok lines 20-28 ('<{{.data}}>'), '<' and '>' trimmed lines 33-42
log.msg: Message text after the 'Message forwarded from :' prefix. Examples: sshd[4321]: Accepted password for admin from 10.0.0.5 port 51234 ssh2. Source: grok lines 469-473 (greedy copy of log.msgAll, runs last and overwrites earlier values)
actionResult: 'success' or 'failed' from the RETURNCODE of an Oracle audit record forwarded through AIX syslog. Empty for normal AIX messages. Not used in widgets. Examples: success, failed. Source: grok lines 322-333 (log.returnCode), add steps lines 542-553
dataSource: Sender IP of the syslog line (the AIX server). Examples: 10.0.30.5. Source: collectors/forwarder/collector/syslog/handler.go lines 21-33 and 79; listener.go lines 264-266
Watch out for
Everything except log.priority and log.deviceTime depends on the 'Message forwarded from :' prefix (grok lines 47-56). Logs sent without it (for example through rsyslog on AIX) keep only raw, priority and time.
Everything that comes from log.msgAll (program, user, command, source IP, Oracle audit fields) also depends on the grok step that contains the line 49 typo. If the engine rejects that step, only W1, W4, W5, W6, W12b, W13, W14 and W15 show data. Test with one real AIX message after fixing line 49.
log.eventType could be overwritten with the AIX host name by the last grok (lines 478-488) if the grok engine does not anchor patterns at the start of the text. The engine is not in the snapshot, so this could not be checked.
No 'top users' widget: origin.user on sudo lines holds the run-as user (usually root), not the person who ran sudo, and the user in 'Accepted password for from ...' is not captured at all.
origin.ip only comes from messages shaped '... from port '; IPv6 addresses are not matched.
W2 may count a long sudo command more than once, because the '(command continued)' lines also fill origin.command.
actionResult and action (Oracle ACTION code) exist only for Oracle audit records sent through AIX syslog, so they are not used as KPIs.
Parser problems found while designing this
These are not dashboard work, but they limit what the dashboard can show. They belong to #1977; raise them there rather than working around them in the dashboard.
Line 49 says 'fildName' instead of 'fieldName', so that grok pattern has no field name. The backend validator (backend/modules/eventprocessing/usecase/pipeline.go validateProcessor, lines 53-61) rejects any grok pattern without fieldName, so the filter cannot be saved through the API or UI as it is. How the engine treats it at runtime is unknown (go-sdk utils.ValidateReservedField returns 'field name cannot be empty' for an empty name). If the step fails, log.msgAll is never set and every field below it is lost.
Line 51 writes 'from.host', but 'from' is not a field of the event schema (go-sdk plugins.proto message Event), so the AIX host name is lost before storage. It should be origin.host.
Lines 118-127 overwrite origin.user (the sudo caller captured at lines 68-77) with the USER= value, which is the run-as user. The run-as user should go to target.user.
The patterns '(OBJ$CREATOR:)', '(OBJ$NAME:)' and '(OS$USERID:)' (lines 338-381) contain an unescaped '$', which in a regular expression means end of text, so they can never match. log.objCreator, log.objName and log.osUserID are never set, and the AIX rules that read log.objName or log.osUserID cannot fire.
The Oracle audit chain (lines 212-381) expects each key to follow the previous one. Oracle's syslog audit records usually carry TERMINAL between USERHOST and ACTION, so if grok patterns are anchored, ACTION and RETURNCODE are never reached and actionResult is never set. Not verified.
Only ';' and ':' are trimmed from captured values (lines 160-172), so origin.user, log.tty and log.pwd can keep a trailing space, which breaks exact-match filters.
How to build it
Before you start: parser field names are changing while the parsers are updated for the engine's new underscore handling (see "Field names are about to move" in #2696). Check every field in this issue against the v12 parser at that moment and against real logs, and build against what you find.
Add definitions/dashboards/integration-aix.yaml. Keep it in the top folder: the test that checks shipped dashboards (TestEveryShippedDashboardDefinitionIsValid) only reads the top folder.
Start from the file below; it follows the table above and passes the same checks as the backend (domain.Spec.Validate).
definitions/dashboards/integration-aix.yaml is merged to release/v12.0.0 and go test ./modules/dashboards/... passes in backend/.
With IBM AIX logs flowing on a v12 test server, every widget shows data. A widget that stays empty while logs arrive means a wrong field or value: fix it, don't ship it.
Clicking a row, bar or line point opens the Log Explorer on the same logs, and the Log Explorer count matches the widget.
A time range with no logs shows empty states, not errors.
A screenshot of the finished dashboard is attached to this issue.
Part of: #2696 · Needs first: #2697 (click-through to the Log Explorer and the value/count table)
Related: #1977 (parsers and rules for this integration, owned by the detection team)
Goal
Ship a built-in IBM AIX dashboard that shows, at a glance, how much IBM AIX is sending, whether it is still sending, and what kinds of events they are. The heart of it is the list of IBM AIX logs grouped by programs (widget W7): click one and the Log Explorer opens on exactly those logs.
Where the data comes from
AIXibm-aixdefinitions/filters/ibm/ibm_aix.yamldataSourceholdslog.eventType(programs)Why
log.eventType: AIX syslog has no event ID. The syslog tag, meaning the program name in front of '[pid]:' or ':' (sshd, sudo, cron, Oracle Audit), is the closest 'what kind of event' field: few values, readable, and it separates SSH, sudo, scheduled jobs and Oracle audit records. It exists on forwarded lines whose message starts with a tag; other lines have none, so W7/W8 filter on exists. Two risks could not be verified because the grok engine is not in the snapshot: the typo on line 49 may stop the step that every later field depends on, and if grok patterns are not anchored at the start, the last grok (lines 478-488) would overwrite log.eventType with the host name.Typical values:
sshd,sudo,su,cron,Oracle AuditWidgets
Standard layout from the parent issue; rows W2, W3 and W9 onward are specific to this integration.
origin.commandexistsorigin.ipexistsdataSourcelog.eventType; filterlog.eventTypeexistslog.eventType(top 5); filterlog.eventTypeexistsorigin.command; filterorigin.commandexistsorigin.ip; filterorigin.ipexistsorigin.geolocation.country; filterorigin.geolocation.countryexistslog.priority; filterlog.priorityexistsnameseverity@timestamp,dataSource,log.eventType,origin.user,origin.ip,origin.command,log.msgFields used and where they come from
log.eventType: Program (syslog tag) that wrote the message. Examples:sshd,sudo,Oracle Audit. Source: grok lines 177-186 ('{{.data}}[' when log.msgAll matches '\w+[[0-9]+]:'), '[' trimmed lines 191-195; grok lines 461-467 ('{{.word}}(:)'), ':' trimmed lines 494-499origin.command: Command run through sudo (text after COMMAND=), or the text of a '(command continued)' line. Examples:/usr/bin/ls -la /home/app,/usr/sbin/shutdown -r now. Source: grok lines 132-139 (COMMAND=) and 144-155 ((command continued))origin.ip: Source IPv4 address from messages of the form '... from port ' (mostly sshd). Examples:10.0.0.5,203.0.113.40. Source: grok lines 394-407 and 409-422 on log.msg (where regexMatch 'from(.+)port')origin.geolocation.country: Country of a public origin.ip. Examples:Brazil. Source: dynamic step lines 556-561; plugins/geolocation/geolocate.go skips private rangesorigin.user: User name, but unreliable: on sudo lines it ends up as the run-as user (USER=), not the person who ran sudo, and it may keep a trailing space. Shown only in the table. Examples:root. Source: grok lines 68-77 (sudo caller), overwritten by lines 118-127 (USER=); grok lines 409-422 ('from user ')log.priority: Syslog priority number (facility x 8 + level). Present on every line, even when nothing else parses. Examples:38 (auth.info),86 (authpriv.info),13 (user.notice),30 (daemon.info),78 (cron.info). Source: grok lines 20-28 ('<{{.data}}>'), '<' and '>' trimmed lines 33-42log.msg: Message text after the 'Message forwarded from :' prefix. Examples:sshd[4321]: Accepted password for admin from 10.0.0.5 port 51234 ssh2. Source: grok lines 469-473 (greedy copy of log.msgAll, runs last and overwrites earlier values)actionResult: 'success' or 'failed' from the RETURNCODE of an Oracle audit record forwarded through AIX syslog. Empty for normal AIX messages. Not used in widgets. Examples:success,failed. Source: grok lines 322-333 (log.returnCode), add steps lines 542-553dataSource: Sender IP of the syslog line (the AIX server). Examples:10.0.30.5. Source: collectors/forwarder/collector/syslog/handler.go lines 21-33 and 79; listener.go lines 264-266Watch out for
Parser problems found while designing this
These are not dashboard work, but they limit what the dashboard can show. They belong to #1977; raise them there rather than working around them in the dashboard.
How to build it
Before you start: parser field names are changing while the parsers are updated for the engine's new underscore handling (see "Field names are about to move" in #2696). Check every field in this issue against the v12 parser at that moment and against real logs, and build against what you find.
definitions/dashboards/integration-aix.yaml. Keep it in the top folder: the test that checks shipped dashboards (TestEveryShippedDashboardDefinitionIsValid) only reads the top folder.domain.Spec.Validate).categoryquery shown with chart typetable. It already renders; v12 dashboards: groundwork for integration dashboards (click-through to the Log Explorer, value/count table, Agents dashboard fix) #2697 makes its rows clickable and its headers readable.Starting dashboard file
Done when
definitions/dashboards/integration-aix.yamlis merged torelease/v12.0.0andgo test ./modules/dashboards/...passes inbackend/.