Collect IBM Security Verify Access logs

Supported in:

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

  1. Sign in to the Google SecOps console.
  2. Go to SIEM Settings > Collection Agents.
  3. Download the Ingestion Authentication File. Save the file securely on the system where BindPlane will be installed.

Get Google SecOps customer ID

  1. Sign in to the Google SecOps console.
  2. Go to SIEM Settings > Profile.
  3. Copy and save the Customer ID from the Organization Details section.

Install BindPlane Agent

Windows Installation

  1. Open the Command Prompt or PowerShell as an administrator.
  2. Run the following command:

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    

Linux Installation

  1. Open a terminal with root or sudo privileges.
  2. 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

Configure BindPlane Agent to ingest Syslog and send to Google SecOps

  1. 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).
  2. 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
    
  3. Replace the port and IP address as required in your infrastructure.

  4. Replace <customer_id> with the actual Customer ID.

  5. 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

  1. To edit the WebSEAL configuration file, use the appliance Local Management Interface (LMI).
  2. In the LMI, go to Reverse Proxy Management.
  3. Click Manage > Configuration > Edit configuration file (you can use the editor to directly edit the WebSEAL configuration file).
  4. Go to logging[stanza], look for syntax requests = {yes|no}, and click Yes.
  5. Go to gmt-time parameter and edit it as follows: gmt-time = yes.
  6. 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
    
  7. 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

  1. Sign in to the ISVA Local Management Interface.
  2. Go to Monitor > Logs > Remote Syslog Forwarding.
  3. Click Add.
  4. 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.
  5. Click Save.

Configuring the log sources for a remote log server

  1. Select the remote syslog server to send logs to.
  2. Click Sources.
  3. Click Add.
  4. 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.
  5. 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.