Collect Apache logs
This document explains how to ingest Apache logs to Google Security Operations using Bindplane agent.
Apache HTTP Server is an open-source web server that serves HTTP requests and generates access and error logs. The parser handles both standard combined/common log formats and JSON-formatted logs, extracting HTTP request details, response codes, and client information.
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 Apache server
- If running behind a proxy, ensure firewall ports are open per the Bindplane agent requirements
- Privileged access to the Apache server (root or sudo)
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 Bindplane agent installation guide.
Configure 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/apache: compression: gzip creds_file_path: '/etc/bindplane-agent/ingestion-auth.json' customer_id: '<customer_id>' endpoint: malachiteingestion-pa.googleapis.com log_type: APACHE raw_log_field: body service: pipelines: logs/apache_to_chronicle: receivers: - udplog exporters: - chronicle/apache
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 Apache
- Sign in to the server hosting Apache using SSH.
Create a file under
/etc/rsyslog.d/named02-apache2.conf:vim /etc/rsyslog.d/02-apache2.confAdd the following code to the file:
module(load="imfile" PollingInterval="10" statefile.directory="/var/spool/rsyslog") input(type="imfile" File="/var/log/apache2/access.log" Tag="http_access" Severity="info" Facility="local6") Local6.info @<BINDPLANE_IP>:<BINDPLANE_PORT> module(load="imfile" PollingInterval="10" statefile.directory="/var/spool/rsyslog") input(type="imfile" File="/var/log/apache2/error.log" Tag="http_error" Severity="error" Facility="local7") Local7.error @<BINDPLANE_IP>:<BINDPLANE_PORT>- Replace
<BINDPLANE_IP>and<BINDPLANE_PORT>with the IP address and port configured for the Bindplane agent. - If you are using TCP protocol, append an additional
@to the host line (for example,@@<BINDPLANE_IP>:<BINDPLANE_PORT>).
- Replace
Restart rsyslog services:
sudo service rsyslog restart
UDM mapping table
| Log field | UDM mapping | Logic |
|---|---|---|
bytes |
network.received_bytes |
Bytes received from the client. |
bytes |
network.sent_bytes |
Bytes sent to the client. |
bytes_out |
network.sent_bytes |
Bytes sent to the client. |
bytes_received |
network.received_bytes |
Bytes received from the client. |
Content |
network.http.method |
HTTP method extracted from the "Content" field. |
Content |
target.url |
Target URL extracted from the "Content" field. |
cookie |
additional.fields.value.string_value |
Value of the "cookie" field. |
dest_ip |
target.ip |
IP address of the target. |
dest_name |
target.hostname |
Hostname of the target. |
dest_port |
target.port |
Port of the target. |
description |
metadata.description |
Description of the event. |
duration_microseconds |
additional.fields.value.string_value |
Value of the "duration_microseconds" field. |
file_full_path |
target.file.full_path |
Full path of the target file. |
hostname |
target.hostname |
Hostname of the target. |
http_content_type |
additional.fields.value.string_value |
Value of the "http_content_type" field. |
http_host |
principal.hostname |
Hostname of the principal. |
http_method |
network.http.method |
HTTP method. |
http_referrer |
network.http.referral_url |
HTTP referrer URL. |
http_user_agent |
network.http.user_agent |
HTTP user agent. |
ID |
metadata.id |
ID of the event. |
insertId |
metadata.product_log_id |
Product log ID. |
ip |
principal.ip |
IP address of the principal. |
jsonPayload.cIP |
target.ip |
IP address of the target. |
jsonPayload.cPort |
target.port |
Port of the target. |
jsonPayload.csBytes |
network.sent_bytes |
Bytes sent to the client. |
jsonPayload.csMethod |
network.http.method |
HTTP method. |
jsonPayload.csMimeType |
target.file.mime_type |
MIME type of the target file. |
jsonPayload.csReferer |
network.http.referral_url |
HTTP referrer URL. |
jsonPayload.csURL |
target.url |
Target URL. |
jsonPayload.csUserAgent |
network.http.user_agent |
HTTP user agent. |
jsonPayload.sHierarchy |
additional.fields.value.string_value |
Value of the "sHierarchy" field. |
jsonPayload.sHostname |
principal.hostname |
Hostname of the principal. |
jsonPayload.sIP |
principal.ip |
IP address of the principal. |
jsonPayload.scBytes |
network.received_bytes |
Bytes received from the client. |
jsonPayload.scHTTPStatus |
network.http.response_code |
HTTP response code. |
jsonPayload.scResultCode |
additional.fields.value.string_value |
Value of the "scResultCode" field. |
LastStatus |
network.http.response_code |
HTTP response code. |
log_level |
security_result.severity |
Severity of the security result. |
logName |
security_result.category_details |
Category details of the security result. |
method |
network.http.method |
HTTP method. |
pid |
principal.process.pid |
Process ID of the principal. |
Port |
target.port |
Port of the target. |
proto |
network.application_protocol |
Application protocol. |
referer |
network.http.referral_url |
HTTP referrer URL. |
RemoteHost |
principal.ip |
IP address of the principal. |
RemoteUser |
principal.user.userid |
User ID of the principal. |
resource.labels.instance_id |
target.resource.product_object_id |
Product object ID of the target resource. |
resource.labels.project_id |
target.resource.attribute.labels.value |
Value of the "project_id" label. |
resource.labels.zone |
target.resource.attribute.cloud.availability_zone |
Availability zone of the target resource. |
resource.type |
target.resource.resource_type |
Resource type of the target. |
response |
network.http.response_code |
HTTP response code. |
SizeBytes |
network.received_bytes |
Bytes received from the client. |
src_ip |
principal.ip |
IP address of the principal. |
src_port |
principal.port |
Port of the principal. |
ssl_cipher |
network.tls.cipher |
TLS cipher. |
ssl_version |
network.tls.version_protocol |
TLS version protocol. |
status |
network.http.response_code |
HTTP response code. |
target |
target.url |
Target URL. |
target_ip |
target.ip |
IP address of the target. |
target_port |
target.port |
Port of the target. |
time |
metadata.event_timestamp |
Event timestamp. |
uri_path |
target.process.file.full_path |
Full path of the target file. |
user |
principal.user.userid |
User ID of the principal. |
useragent |
network.http.user_agent |
HTTP user agent. |
version_protocol |
network.tls.version_protocol |
TLS version protocol. |
Workername |
principal.hostname |
Hostname of the principal. |
x_forwarded_for |
Value of the "X-Forwarded-For" header. | |
metadata.log_type |
The value is set to "APACHE" in the parser code. | |
metadata.product_name |
The value is set to "Apache Web Server" in the parser code. | |
metadata.vendor_name |
The value is set to "Apache" in the parser code. | |
metadata.event_type |
The value is determined based on the presence of principal and target information. If both principal and target are present, the event type is set to "NETWORK_HTTP". If only principal is present, the event type is set to "STATUS_UPDATE". Otherwise, it is set to "GENERIC_EVENT". | |
additional.fields.key |
The key is set to "keep_alive", "duration_microseconds", "cookie", "http_content_type", "sHierarchy", "scResultCode" in the parser code based on the field. | |
target.port |
If the "proto" field is "HTTP", the port is set to 80. If the "proto" field is "HTTPS", the port is set to 443. If the "proto" field is "FTP", the port is set to 21. | |
target.resource.attribute.labels.key |
The key is set to "project_id" in the parser code. |
Need more help? Get answers from Community members and Google SecOps professionals.