Collect F5 ASM logs

Supported in:

This document explains how to ingest F5 Application Security Manager (ASM) logs to Google Security Operations using Bindplane. The parser handles various F5 ASM log formats (such as syslog, CSV, CEF, and Splunk), and normalizes them into the Unified Data Model (UDM). It uses grok patterns and key-value extractions to parse fields, XML filtering for violation details, conditional logic for event categorization and severity mapping, and merges extracted fields into the UDM schema.

Before you begin

Make sure you have the following prerequisites:

  • Google SecOps instance
  • Windows 2016 or later, or a Linux host with systemd
  • If running behind a proxy, firewall ports are open
  • Privileged access to F5 ASM

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 the 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

For additional installation options, consult the installation guide.

Configure the 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 port and IP address as required
            listen_address: `0.0.0.0:514`
    
    exporters:
        chronicle/chronicle_w_labels:
            compression: gzip
            # Adjust the path to the credentials file you downloaded in Step 1
            creds_file_path: '/path/to/ingestion-authentication-file.json'
            # Replace with your actual customer ID from Step 2
            customer_id: <customer_id>
            endpoint: malachiteingestion-pa.googleapis.com
            # Add optional ingestion labels for better organization
            ingestion_labels:
                log_type: 'F5_ASM'
                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 the Bindplane agent to apply the changes

  • To restart the Bindplane agent in Linux, run the following command:

    sudo systemctl restart bindplane-agent
    
  • To restart the Bindplane agent in Windows, you can either use the Services console or enter the following command:

    net stop BindPlaneAgent && net start BindPlaneAgent
    

Configure Syslog in F5 ASM

  1. Sign in to the tmsh instance by typing the following command:

    tmsh
    
  2. Edit syslog configuration using the following command:

    edit /sys syslog all-properties
    
  3. Syslog configuration opens in the vi text editor and appears similar to the following example:

    modify syslog {
              auth-priv-from notice
              auth-priv-to emerg
              cron-from warning
              cron-to emerg
              daemon-from notice
              daemon-to emerg
              description none
              include none
              iso-date disabled
              kern-from notice
              kern-to emerg
              mail-from notice
              mail-to emerg
              messages-from notice
              messages-to warning
              remote-servers none
              user-log-from notice
              user-log-to emerg
          }
    
  4. Replace the include none line with the following syslog filter:

        include `
              filter f_audit{
                  match(AUDIT);
              };
              destination d_syslog_server {
                      udp(\`<bindplane-ip>\` port (<bindplane-port>));
              };
              log {
                      source(s_syslog_pipe);
                          filter(f_audit);
                          destination(d_syslog_server);
              };
              `
    
  5. Replace <bindplane-ip> and <bindplane-port> with the actual IP address and port number configured for your Bindplane agent.

  6. Exit vi by typing the following key sequence:

    :wq!
    
  7. At the following prompt, type y to save the changes to the file:

    Save changes? (y/n/e)
    
  8. Save the configuration by typing the following command:

    save /sys config
    

UDM mapping table

Log Field UDM Mapping Logic
act security_result.action If act is blocked, maps to BLOCK. If act is passed or legal, maps to ALLOW. If act contains alerted, maps to QUARANTINE. Otherwise, defaults to ALLOW for Splunk format.
app network.application_protocol Directly maps to HTTPS if present in the raw log.
attack_type security_result.category_details, metadata.description Used in conjunction with other fields to determine security_result.category. If no other description is available, it becomes the event description. For Splunk format logs, it is used to determine category and summary if violations is empty.
client_ip principal.ip, principal.asset.ip Directly maps to principal IP.
cn1 network.http.response_code Directly maps to HTTP response code.
cn2 security_result.severity_details Directly maps to security result severity details. Used with response_code to determine if an event is an alert.
column1 principal.ip, principal.asset.ip Maps to principal IP for certain CSV formatted logs.
column2 target.port Maps to target port for certain CSV formatted logs.
column3 target.ip, target.asset.ip Maps to target IP for certain CSV formatted logs.
column4 security_result.severity Maps to security result severity for certain CSV formatted logs. Values Information, Informational, 0, 4 map to INFORMATIONAL. Warning, 1, 3 map to MEDIUM. Error, 2 map to ERROR. Critical, CRITICAL, critical map to CRITICAL.
column7 security_result.detection_fields, network.http.response_code Contains XML data. viol_name within request-violations is extracted and added as detection fields with key Request Violation Name_index. viol_name within response_violations is extracted and added as detection fields with key Response Violation Name_index. response_code within response_violations maps to network.http.response_code.
column8 security_result.rule_name Maps to security result rule name for certain CSV formatted logs.
cs1 security_result.rule_name Directly maps to security result rule name.
cs2 security_result.summary Directly maps to security result summary.
cs5 principal.ip, principal.asset.ip, additional.fields If cs5 contains a JNDI LDAP URL, it is added as an additional field with key JNDI_LDAP_URL. Otherwise, if it contains comma-separated IPs, any IP different from principal_ip is added as an additional principal IP.
cs6 principal.location.country_or_region Directly maps to principal location country or region.
data network.session_id, network.sent_bytes, network.tls.version If present, parsed as JSON to extract sessionid, bits (mapped to sent_bytes), and version.
date_time metadata.event_timestamp Directly maps to event timestamp after parsing and converting to the correct format.
dest_ip target.ip, target.asset.ip Directly maps to target IP.
dest_port target.port Directly maps to target port.
dhost target.hostname Directly maps to target hostname.
dpt target.port Directly maps to target port.
dst target.ip Directly maps to target IP.
dvc intermediary.ip Directly maps to intermediary IP.
dvchost target.hostname, intermediary.hostname Directly maps to target hostname and intermediary hostname.
errdefs_msgno additional.fields Added as an additional field with key errdefs_msgno.
externalId additional.fields Added as an additional field with key Support_Id.
f5_host target.hostname, intermediary.hostname Directly maps to target hostname and intermediary hostname.
geo_info principal.location.country_or_region, security_result.detection_fields Maps to principal location country or region. Also added as a detection field with key geo_info.
host target.hostname Directly maps to target hostname.
ids additional.fields Parsed as a comma-separated list of support IDs. Each ID is added to a list-valued additional field with key supportid.
ip_addr_intelli security_result.detection_fields Added as a detection field with key ip_addr_intelli.
ip_client principal.ip Directly maps to principal IP.
ip_route_domain principal.ip, principal.asset.ip The IP portion is extracted and mapped to principal IP.
irule security_result.rule_name Directly maps to security result rule name.
irule-version security_result.rule_version Directly maps to security result rule version.
level security_result.severity, security_result.severity_details Used to determine security result severity. error or warning map to HIGH. notice maps to MEDIUM. information or info map to LOW. The raw value is also mapped to severity_details.
logtime metadata.event_timestamp Directly maps to event timestamp after parsing.
management_ip_address, management_ip_address_2 intermediary.ip Directly maps to intermediary IP.
method network.http.method Directly maps to HTTP method.
msg security_result.summary, metadata.description Directly maps to security result summary for some log formats. If no other description is available, it becomes the event description.
policy_name security_result.about.resource.name, security_result.rule_name Directly maps to security result resource name or rule name.
process target.application Directly maps to target application.
process_id principal.process.pid Directly maps to principal process ID.
protocol network.application_protocol, network.ip_protocol, app_protocol Directly maps to application protocol or IP protocol depending on the log format.
proxy_id security_result.rule_id Directly maps to security result rule ID.
query_string additional.fields Added as an additional field with key query_string.
referrer network.http.referral_url Directly maps to HTTP referral URL.
req_method network.http.method Directly maps to HTTP method.
req_status security_result.action, security_result.action_details, security_result.detection_fields If blocked, maps security_result.action to BLOCK. If passed or legal, maps to ALLOW. If contains alerted, maps to QUARANTINE. The raw value is also mapped to action_details and added as a detection field with key req_status.
request target.url Directly maps to target URL.
requestMethod network.http.method Directly maps to HTTP method.
resp security_result.detection_fields Added as a detection field with key resp.
resp_code network.http.response_code Directly maps to HTTP response code.
response security_result.summary Directly maps to security result summary.
response_code network.http.response_code Directly maps to HTTP response code.
route_domain additional.fields Added as an additional field with key route_domain.
rt metadata.event_timestamp Directly maps to event timestamp after parsing.
sev security_result.severity, security_result.severity_details Used to determine security result severity. ERROR maps to ERROR. The raw value is also mapped to severity_details.
severity security_result.severity, security_result.severity_details Used to determine security result severity. Informational maps to LOW, Error or warning map to HIGH, critical maps to CRITICAL, notice maps to MEDIUM, information or info map to LOW. The raw value is also mapped to severity_details.
sig_ids security_result.rule_id Directly maps to security result rule ID.
sig_names security_result.rule_name Directly maps to security result rule name.
snat_ip principal.nat_ip Directly maps to principal NAT IP.
snat_port principal.nat_port Directly maps to principal NAT port.
src principal.ip, principal.asset.ip Directly maps to principal IP.
spt principal.port Directly maps to principal port.
sub_violates security_result.about.resource.attribute.labels Added as a label with key Sub Violations to security result resource attributes.
sub_violations security_result.about.resource.attribute.labels Added as a label with key Sub Violations to security result resource attributes.
summary security_result.summary Directly maps to security result summary.
support_id metadata.product_log_id Prefixed with support_id - and mapped to product log ID.
suid network.session_id Directly maps to network session ID.
suser principal.user.userid Directly maps to principal user ID.
timestamp metadata.event_timestamp Directly maps to event timestamp after parsing and converting to the correct format.
unit_host principal.hostname, principal.asset.hostname Directly maps to principal hostname.
uri principal.url Directly maps to principal URL.
user_id principal.user.userid Directly maps to principal user ID.
user_name principal.user.user_display_name Directly maps to principal user display name.
username principal.user.userid Directly maps to principal user ID.
useragent network.http.user_agent, network.http.parsed_user_agent Directly maps to HTTP user agent. Also parsed and mapped to parsed user agent.
virtualserver network.tls.client.server_name Directly maps to TLS client server name.
violate_details security_result.detection_fields, network.http.response_code Contains XML data. viol_name within request-violations is extracted and added as detection fields with key Request Violation Name_index. viol_name within response_violations is extracted and added as detection fields with key Response Violation Name_index. response_code within response_violations maps to network.http.response_code.
violate_rate security_result.detection_fields Added as a detection field with key violate_rate.
violation_rating security_result.about.resource.attribute.labels Added as a label with key Violations Rating to security result resource attributes.
violations security_result.description Directly maps to security result description. For Splunk format logs, it is used to determine summary if present.
virus_name security_result.threat_name Directly maps to security result threat name.
vs_name network.tls.client.server_name Directly maps to TLS client server name.
websocket_direction network.direction If clientToServer, maps to INBOUND. If ServerToclient, maps to OUTBOUND.
websocket_message_type security_result.detection_fields Added as a detection field with key WebsocketMessageType.
x_fwd_hdr_val principal.ip, principal.asset.ip Directly maps to principal IP.

Need more help? Get answers from Community members and Google SecOps professionals.