Collect IBM Security Verify Access logs
This document describes how you can collect IBM Security Verify Access logs. The parser extracts common fields like timestamps, hostnames, and descriptions using Grok patterns. Then, it leverages XML parsing for detailed event information embedded within the description field, ultimately mapping extracted data to the unified data model (UDM) for standardized security event representation.
Before you begin
- Ensure you have a Google Security Operations instance.
- Ensure that you are using Windows 2016 or later, or a Linux host with
systemd
. - If running behind a proxy, ensure firewall ports are open.
- Ensure you have administrative access to IBM Security Verify Access (ISVA).
Get Google SecOps ingestion authentication file
- Sign in to the Google SecOps console.
- Go to SIEM Settings > Collection Agents.
- Download the Ingestion Authentication File. Save the file securely on the system where BindPlane will be installed.
Get Google SecOps customer ID
- Sign in to the Google SecOps console.
- Go to SIEM Settings > Profile.
- Copy and save the Customer ID from the Organization Details section.
Install BindPlane Agent
Windows Installation
- Open the Command Prompt or PowerShell as an administrator.
Run the following command:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Linux Installation
- Open a terminal with root or sudo privileges.
Run the following command:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
Additional Installation Resources
- For additional installation options, consult this installation guide.
Configure BindPlane Agent to ingest Syslog and send to Google SecOps
Access the configuration file:
- Locate the
config.yaml
file. Typically, it's in the/etc/bindplane-agent/
directory on Linux or in the installation directory on Windows. - Open the file using a text editor (for example,
nano
,vi
, or Notepad).
- Locate the
Edit the
config.yaml
file as follows:receivers: udplog: # Replace the below port <54525> and IP <0.0.0.0> with your specific values listen_address: "0.0.0.0:54525" exporters: chronicle/chronicle_w_labels: compression: gzip # Adjust the creds location below according the placement of the credentials file you downloaded creds: '{ json file for creds }' # Replace <customer_id> below with your actual ID that you copied customer_id: <customer_id> endpoint: malachiteingestion-pa.googleapis.com # You can apply ingestion labels below as preferred ingestion_labels: log_type: SYSLOG namespace: ibm_security_verify raw_log_field: body service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labels
Replace the port and IP address as required in your infrastructure.
Replace
<customer_id>
with the actual Customer ID.Update
/path/to/ingestion-authentication-file.json
to the path where the authentication file was saved in the Get Google SecOps ingestion authentication file section.
Restart BindPlane Agent to apply the changes
In Linux, to restart the BindPlane Agent, run the following command:
sudo systemctl restart bindplane-agent
In Windows, to restart the BindPlane Agent, you can either use the Services console or enter the following command:
net stop BindPlaneAgent && net start BindPlaneAgent
Customize the Log Format
- To edit the
WebSEAL
configuration file, use the appliance Local Management Interface (LMI). - In the LMI, go to Reverse Proxy Management.
- Click Manage > Configuration > Edit configuration file (you can use the editor to directly edit the
WebSEAL
configuration file). - Go to logging[stanza], look for
syntax requests = {yes|no}
, and click Yes. - Go to
gmt-time
parameter and edit it as follows:gmt-time = yes
. Replace the request-log-format with the following:
request-log-format = ibmsva: %h %l "%u" %t "%r" %s %b %T %j %{X-Forwarded-For}i %a %A %H %p %m %U %v %d %q
See the following explanation of each directive:
ibmsva:
Identifies logs from the SVA device%h
: Remote host%l
: Remote logname%u
: Remote user%t
: Time and date in CLF format%r
: First line of the request%s
: Response status%b
: Bytes in the response (excluding HTTP headers)%T
: Time to serve the request (seconds)%j
: Junction name%X-Forwarded-For
: Forwarded-for IP address%a
: Remote IP address%A
: Local IP address%H
: Request protocol%p
: Port%m
: Request method (GET, POST, HEAD)%U
: URL requested%v
: Server name%d
: Transaction identifier%q
: Query string
Configure Syslog Forwarding in ISVA
- Sign in to the ISVA Local Management Interface.
- Go to Monitor > Logs > Remote Syslog Forwarding.
- Click Add.
- Specify the details for the remote syslog server.
- Server: the IP address or hostname of the syslog server (Bindplane).
- Port: the port on which the syslog server is listening for requests (Bindplane).
- Protocol: select UDP or TCP (depending on your syslog/Bindplane configuration).
- Format: select Syslog.
- Click Save.
Configuring the log sources for a remote log server
- Select the remote syslog server to send logs to.
- Click Sources.
- Click Add.
Specify the details for the log source and then click OK.
- Name: select WebSEAL.
- Instance Name: select the WebSEAL instance.
- Log file: name of the source log file.
- Optional: Tag: the tag to add to the sent log entries.
- Facility: all messages will be sent with the specified facility code (the available codes list).
- Severity: the severity of the sent log entries.
- All messages will be sent with the specified severity level.
Click Save.
UDM Mapping Table
Log Field | UDM Mapping | Logic |
---|---|---|
action | read_only_udm.security_result.action_details | Extracted from the XML field "/event/originator/action" when "description" field contains "event". |
app | read_only_udm.target.application | Extracted using grok pattern from "message" field. |
auth_details | read_only_udm.security_result.detection_fields.value | Extracted from the XML field "/event/accessor/principal/@auth" when "description" field contains "event". The key is set to "Auth". |
authntype | read_only_udm.security_result.detection_fields.value | Extracted from the XML field "/event/authntype" when "description" field contains "event". The key is set to "Authntype". |
data | read_only_udm.metadata.description | If "data" field is not empty, its value replaces the existing value of "read_only_udm.metadata.description". |
description | read_only_udm.metadata.description | Extracted using grok pattern from "message" field. If "description" field contains "event", it is parsed as XML to extract other fields. |
event_id | read_only_udm.metadata.product_log_id | Extracted from the XML field "/event/originator/event_id" when "description" field contains "event". |
hostname | read_only_udm.principal.hostname, read_only_udm.principal.asset.hostname | Extracted using grok pattern from "message" field. |
id | read_only_udm.metadata.product_log_id | Extracted using grok pattern from "message" field. |
location | read_only_udm.principal.location.name | Extracted from the XML field "/event/originator/location" when "description" field contains "event". |
outcome | read_only_udm.security_result.detection_fields.value | Extracted from the XML field "/event/outcome" when "description" field contains "event". The key is set to "Outcome". |
outcome_reason | read_only_udm.security_result.summary | Extracted from the XML field "/event/outcome/@reason" when "description" field contains "event". Also used to determine the value of "read_only_udm.security_result.action" - set to "BLOCK" if "outcome_reason" contains "fail" (case-insensitive), otherwise set to "ALLOW". |
outcome_status | read_only_udm.security_result.detection_fields.value | Extracted from the XML field "/event/outcome/@status" when "description" field contains "event". The key is set to "Outcome Status". |
originator_blade | read_only_udm.security_result.detection_fields.value | Extracted from the XML field "/event/originator/@blade" when "description" field contains "event". The key is set to "Originator Blade". |
originator_component | read_only_udm.security_result.detection_fields.value | Extracted from the XML field "/event/originator/component" when "description" field contains "event". The key is set to "Originator Component". |
originator_instance | read_only_udm.security_result.detection_fields.value | Extracted from the XML field "/event/originator/@instance" when "description" field contains "event". The key is set to "Originator Instance". |
session_id | read_only_udm.network.session_id | Extracted from the XML field "/event/accessor/session_id" when "description" field contains "event". |
target_url | read_only_udm.target.url | Extracted from the XML field "/event/target/url" when "description" field contains "event". |
thread_id | read_only_udm.security_result.detection_fields.value | Extracted using grok pattern from "message" field. The key is set to "Thread id". |
timestamp | read_only_udm.metadata.event_timestamp | Extracted using grok pattern from "message" field. Formatted using the "date" filter based on the presence and format of "timezone" field. |
time_stamp | read_only_udm.metadata.event_timestamp | Extracted from the XML field "/event/date" when "description" field contains "event". Formatted using the "date" filter. |
timezone | Used in conjunction with "timestamp" field to format the "read_only_udm.metadata.event_timestamp" field using the "date" filter. | |
url | read_only_udm.target.url | Extracted using grok pattern from "message" field. |
user | read_only_udm.principal.user.userid | Extracted from the XML field "/event/accessor/principal" when "description" field contains "event". |
user_location | read_only_udm.principal.ip, read_only_udm.principal.asset.ip | Extracted from the XML field "/event/accessor/user_location" when "description" field contains "event". If "user_location_type" contains "ip" (case-insensitive), it is parsed as an IP address and mapped to both "read_only_udm.principal.ip" and "read_only_udm.principal.asset.ip". |
user_location_type | Used to determine if "user_location" should be parsed as an IP address. | |
N/A | read_only_udm.metadata.vendor_name | Set to "IBM_SECURITY_VERIFY". |
N/A | read_only_udm.metadata.product_name | Set to "IBM_SECURITY_VERIFY". |
N/A | read_only_udm.metadata.event_type | Initially set to "STATUS_UPDATE". Changed to "USER_LOGIN" if both "user" and "hostname" fields are extracted. |
N/A | read_only_udm.extensions.auth.type | Set to "SSO" if both "user" and "hostname" fields are extracted. |
N/A | read_only_udm.network.application_protocol | Set to "HTTP" if "message" field contains "HttpServletRequest". |
N/A | read_only_udm.metadata.log_type | Set to "IBM_SECURITY_VERIFY" - taken from the log metadata. |
Changes
2024-05-13
- The parser was updated to support XML format logs.
2023-01-25
- Newly created parser.