Collect F5 ASM logs
This document explains how to ingest F5 Application Security Manager (ASM) logs to Google Security Operations using the Bindplane agent.
F5 BIG-IP ASM is a web application firewall (WAF) that generates syslog messages for HTTP request violations, policy enforcement actions, and security events. The parser supports multiple log formats (CEF, syslog, CSV, Splunk, JSON) and maps them to the Unified Data Model (UDM).
Before you begin
Make sure you have the following prerequisites:
- A Google SecOps instance
- Windows Server 2016 or later, or Linux host with
systemd - Network connectivity between the Bindplane agent and the F5 BIG-IP appliance
- If running behind a proxy, ensure firewall ports are open per the Bindplane agent requirements
- Privileged access to F5 BIG-IP tmsh
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 the Bindplane agent 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 the Bindplane agent
Install the Bindplane agent on your Windows or Linux operating system according to the following instructions.
Windows installation
- Open 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" /quietWait for the installation to complete.
Verify the installation by running:
sc query observiq-otel-collectorThe service should show as RUNNING.
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.shWait for the installation to complete.
Verify the installation by running:
sudo systemctl status observiq-otel-collectorThe service should show as active (running).
Additional installation resources
For additional installation options and troubleshooting, see the Bindplane agent installation guide.
Configure the Bindplane agent to ingest syslog and send to Google SecOps
Locate the configuration file
Linux:
sudo nano /etc/bindplane-agent/config.yamlWindows:
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
Edit the configuration file
Replace the entire contents of
config.yamlwith the following configuration:receivers: udplog: listen_address: "0.0.0.0:514" exporters: chronicle/f5_asm: compression: gzip creds_file_path: '/etc/bindplane-agent/ingestion-auth.json' customer_id: '<customer_id>' endpoint: malachiteingestion-pa.googleapis.com log_type: F5_ASM raw_log_field: body service: pipelines: logs/f5_asm_to_chronicle: receivers: - udplog exporters: - chronicle/f5_asm
Configuration parameters
Replace the following placeholders:
Receiver configuration:
listen_address: IP address and port to listen on:0.0.0.0to listen on all interfaces (recommended)- Port
514is the standard syslog port (requires root on Linux; use1514for non-root)
Exporter configuration:
creds_file_path: Full path to ingestion authentication file:- Linux:
/etc/bindplane-agent/ingestion-auth.json - Windows:
C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
- Linux:
customer_id: Customer ID copied from the Google SecOps consoleendpoint: Regional endpoint URL:- US:
malachiteingestion-pa.googleapis.com - Europe:
europe-malachiteingestion-pa.googleapis.com - Asia:
asia-southeast1-malachiteingestion-pa.googleapis.com - See Regional Endpoints for complete list
- US:
Save the configuration file
- After editing, save the file:
- Linux: Press
Ctrl+O, thenEnter, thenCtrl+X - Windows: Click File > Save
- Linux: Press
Restart the Bindplane agent to apply the changes
To restart the Bindplane agent in Linux, run the following command:
sudo systemctl restart observiq-otel-collectorVerify the service is running:
sudo systemctl status observiq-otel-collectorCheck logs for errors:
sudo journalctl -u observiq-otel-collector -f
To restart the Bindplane agent in Windows, choose one of the following options:
Command Prompt or PowerShell as administrator:
net stop observiq-otel-collector && net start observiq-otel-collectorServices console:
- Press
Win+R, typeservices.msc, and press Enter. - Locate observIQ OpenTelemetry Collector.
- Right-click and select Restart.
Verify the service is running:
sc query observiq-otel-collectorCheck logs for errors:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
- Press
Configure syslog in F5 ASM
Sign in to the tmsh instance by typing the following command:
tmshEdit syslog configuration using the following command:
edit /sys syslog all-propertiesSyslog configuration opens in the
vitext 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 }Replace the
include noneline 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); }; `Replace
<bindplane-ip>and<bindplane-port>with the actual IP address and port number configured for your Bindplane agent.Exit
viby typing the following key sequence::wq!At the following prompt, type
yto save the changes to the file:Save changes? (y/n/e)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.