Collect Cisco DNA Center Platform logs
This document explains how to ingest Cisco DNA Center Platform logs to Google Security Operations using two different approaches. Choose the option that best fits your environment and requirements. The parser transforms Cisco DNA Center SYSLOG+JSON logs into a unified data model (UDM). It extracts fields from the raw log message and JSON payload, maps them to corresponding UDM attributes, and enriches the data with labels and security context based on event characteristics like severity and involved entities.
Before you begin
Make sure you have the following prerequisites:
- A Google SecOps instance
- Privileged access to the Cisco DNA Center Platform management console
- Choose your preferred integration method:
- For Option 2: Network connectivity between Cisco DNA Center and Google SecOps webhook endpoint
- For Option 1: Windows 2016 or later, or a Linux host with
systemdfor the Bindplane agent installation
Option 1: Syslog integration using Bindplane agent
This option uses syslog forwarding from Cisco DNA Center to Bindplane, which then forwards structured logs to Google SecOps.
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 IDfrom the Organization Detailssection.
Install the Bindplane agent
Install the Bindplane agent on your Windows or Linux operating system according to the following instructions.
Windows installation
- Open the Command Promptor PowerShellas 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 the Bindplane agent to ingest Syslog and send to Google SecOps
-
Access the configuration file:
- Locate the
config.yamlfile. 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.yamlfile 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 : YOUR_CUSTOMER_ID endpoint : malachiteingestion-pa.googleapis.com log_type : 'CISCO_DNAC' 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
<YOUR_CUSTOMER_ID>with the actual customer ID. - Update
/path/to/ingestion-authentication-file.jsonto the path where the authentication file was saved in the Get Google SecOps ingestion authentication file section. - This configuration uses the Bindplane agent Syslog (UDP) receiver to collect structured syslog messages from DNA Center.
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 Servicesconsole or enter the following command:
net stop BindPlaneAgent && net start BindPlaneAgent
Configure Syslog forwarding on Cisco DNA Center Platform
- Sign in to the Cisco DNA Center Platform.
- Go to System > Settings > External Services > Destinations > Syslog.
- Click + Addto create a new syslog destination.
- Provide the following configuration details:
- Name: Enter a descriptive name (for example,
Google SecOps BindPlane). - Host: Enter the BindPlane Agent IP address.
- Port: Enter
514(or the port configured in BindPlane). - Protocol: Select UDPor TCPdepending on your BindPlane configuration.
- Facility: Select appropriate facility (for example, Local0).
- Severity: Select Informationto capture all event levels.
- Name: Enter a descriptive name (for example,
- Click Save.
Option 2: Real-time webhook integration
This option uses Cisco DNA Center's native webhook capabilities to deliver structured JSON events directly to Google SecOps in real-time.
Overview
Cisco DNA Center natively supports webhook notifications for real-time event delivery. This option provides structured JSON payloads with rich event context, delivering events directly to Google SecOps without requiring Bindplane as an intermediary.
Configure Google SecOps webhook feed
- In Google SecOps, go to SIEM Settings > Feeds.
- Click + Add New Feed.
- In the Feed namefield, enter a name for the feed (for example,
Cisco DNA Center Webhook). - Select Webhookas the Source type.
- Select Cisco DNA Center Platformas the Log type.
- Click Next.
- Specify values for the following input parameters:
- Split delimiter: Optional
\n. - Asset namespace: The asset namespace .
- Ingestion labels: The label to be applied to the events from this feed.
- Split delimiter: Optional
- Click Next.
- Review your feed configuration and click Submit.
- Click Generate Secret Keyto generate a secret key to authenticate this feed.
- Copyand savethe secret key as you cannot view this secret again.
- Go to the Detailstab.
- Copythe feed endpoint URL from the Endpoint Informationfield.
- Click Done.
Create an API key for the webhook feed
- Go to the Google Cloudconsole Credentialspage.
- Click Createcredentials, and then select API key.
- Restrict the API key accessto the Google SecOps API.
Configure Webhook destination in Cisco DNA Center
- Sign in to the Cisco DNA Center Platform.
- Go to System > Settings > External Services > Destinations > Webhook.
- Click + Addto create a new webhook destination.
- Provide the following configuration details:
- Name: Enter a descriptive name (for example,
Google SecOps Webhook). - Description: Enter a description for the webhook.
- URL: Enter the Google SecOps webhook endpoint URL from previous step.
- Method: Select POST.
- Trust Certificate: Select Noif using self-signed certificates.
- Headers: Add required headers:
- Content-Type:
application/json - X-goog-api-key: Your Google Cloud API key
- X-Webhook-Access-Key: Your Google SecOps feed secret key
- Content-Type:
- Name: Enter a descriptive name (for example,
- Click Test Connectionto verify connectivity.
- Click Save.
Subscribe events to webhook notifications
- In Cisco DNA Center, go to Platform > Developer Toolkit > Event Notifications.
- Click + Subscribe.
- Provide the following configuration details:
- Subscription Name: Enter a descriptive name (for example,
Google SecOps Events). - Connector Type: Select REST Endpoint.
- Destination: Select the webhook destination created in previous step.
- Subscription Name: Enter a descriptive name (for example,
- Select the event types you want to monitor:
- Network Events: Device unreachable, interface down, configuration changes.
- Security Events: Security policy violations, authentication failures.
- System Events: Platform events, software updates, maintenance.
- Assurance Events: Performance degradation, connectivity issues.
- Configure event filters if needed:
- Severity: Select minimum severity level (for example, P1, P2).
- Domain: Filter by specific domains (for example, Connectivity, Performance).
- Click Subscribe.
UDM Mapping Table
| Log Field | UDM Mapping | Logic |
|---|---|---|
|
category
|
security_result.severity_details | Directly mapped from the category
field in the raw log. |
|
ciscoDnaEventLink
|
target.url | Directly mapped from the ciscoDnaEventLink
field in the raw log. |
|
date_time
|
metadata.event_timestamp | Extracted from the raw log message using grok pattern and converted to timestamp format. |
|
details.Assurance_Issue_Category
|
security_result.about.resource.attribute.labels[].value | Directly mapped from the details.Assurance_Issue_Category
field in the raw log. The key for this label is "Assurance_Issue_Category". |
|
details.Assurance_Issue_Details
|
security_result.summary | Directly mapped from the details.Assurance_Issue_Details
field in the raw log. |
|
details.Assurance_Issue_Name
|
security_result.about.resource.attribute.labels[].value | Directly mapped from the details.Assurance_Issue_Name
field in the raw log. The key for this label is "Assurance_Issue_Name". |
|
details.Assurance_Issue_Priority
|
security_result.about.resource.attribute.labels[].value | Directly mapped from the details.Assurance_Issue_Priority
field in the raw log. The key for this label is "Assurance_Issue_Priority". |
|
details.Assurance_Issue_Status
|
security_result.about.resource.attribute.labels[].value | Directly mapped from the details.Assurance_Issue_Status
field in the raw log. The key for this label is "Assurance_Issue_Status". |
|
details.Device
|
target.ip OR target.hostname | Mapped from the details.Device
field in the raw log. If the value is an IP address, it's mapped to target.ip
, otherwise to target.hostname
. |
|
dnacIp
|
target.ip | Directly mapped from the dnacIp
field in the raw log, if it's an IP address. |
|
domain
|
additional.fields[].value.string_value | Directly mapped from the domain
field in the raw log. The key for this field is "domain". |
|
eventId
|
metadata.product_event_type | Directly mapped from the eventId
field in the raw log. |
|
instanceId
|
target.resource.product_object_id | Directly mapped from the instanceId
field in the raw log. |
|
name
|
target.resource.attribute.labels[].value | Directly mapped from the name
field in the raw log. The key for this label is "name". |
|
namespace
|
target.namespace | Directly mapped from the namespace
field in the raw log. |
|
network.deviceId
|
target.asset.asset_id | Directly mapped from the network.deviceId
field in the raw log and prefixed with "deviceId: ". |
|
note
|
additional.fields[].value.string_value | Directly mapped from the note
field in the raw log. The key for this field is "note". |
| |
metadata.event_type | Determined based on the presence and values of has_principal
, has_target
, and userId
fields. Possible values: NETWORK_CONNECTION, USER_UNCATEGORIZED, STATUS_UPDATE, GENERIC_EVENT. |
| |
is_alert | True if severity is 0 or 1, False otherwise. |
| |
is_significant | True if severity is 0 or 1, False otherwise. |
|
severity
|
Used to determine the value of security_result.severity
, is_alert
and is_significant
. |
|
|
source
|
target.resource.attribute.labels[].value | Directly mapped from the source
field in the raw log. The key for this label is "source". |
|
src_ip
|
principal.ip | Extracted from the raw log message using grok pattern. |
|
subDomain
|
additional.fields[].value.string_value | Directly mapped from the subDomain
field in the raw log. The key for this field is "subDomain". |
|
tntId
|
target.resource.attribute.labels[].value | Directly mapped from the tntId
field in the raw log. The key for this label is "tntId". |
|
type
|
target.resource.attribute.labels[].value | Directly mapped from the type
field in the raw log. The key for this label is "type". |
|
userId
|
target.user.userid | Directly mapped from the userId
field in the raw log. |
|
version
|
metadata.product_version | Directly mapped from the version
field in the raw log. |
Need more help? Get answers from Community members and Google SecOps professionals.

