Collect Cisco Catalyst Center (formerly DNA Center) logs
This document explains how to ingest Cisco Catalyst Center (formerly known as DNA Center) logs to Google Security Operations using two different approaches. Choose the option that best fits your environment and requirements.
Cisco Catalyst Center is a centralized network management and automation platform for enterprise campus, branch, and IoT networks. It provides intent-based networking, policy management, device provisioning, assurance analytics, and AI-driven issue detection across wired and wireless infrastructure. Catalyst Center generates events related to network health, device status changes, security policy violations, and assurance issues.
Before you begin
Make sure you have the following prerequisites:
- A Google SecOps instance.
- Privileged access to the Cisco Catalyst Center management console.
- For Option 1: Windows Server 2016 or later, or a Linux host with
systemdfor the Bindplane agent. - For Option 2: Network connectivity between Cisco Catalyst Center and the Google SecOps webhook endpoint.
Option 1 - Syslog integration using the Bindplane agent
This option uses syslog forwarding from Cisco Catalyst Center to the Bindplane agent, 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 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 -
Wait for the installation to complete.
-
Verify the installation by running:
sc query observiq-otel-collector
The 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.sh -
Wait for the installation to complete.
-
Verify the installation by running:
sudo systemctl status observiq-otel-collector
The service should show as active (running).
Additional installation resources
For additional installation options and troubleshooting, see Bindplane agent installation guide .
Configure the Bindplane agent to ingest syslog and send to Google SecOps
Locate the configuration file
-
Locate the configuration file on your operating system as follows:
- Linux:
sudo systemctl status observiq-otel-collector- Windows:
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/cisco_catalyst_center : compression : gzip creds_file_path : '/etc/bindplane-agent/ingestion-auth.json' customer_id : 'YOUR_CUSTOMER_ID' endpoint : malachiteingestion-pa.googleapis.com log_type : CISCO_DNAC raw_log_field : body service : pipelines : logs/cisco_catalyst_center_to_chronicle : receivers : - udplog exporters : - chronicle/cisco_catalyst_center
Configuration parameters
Replace the following placeholders:
-
Receiver configuration:
-
listen_address: IP address and port to listen on. Use0.0.0.0to listen on all interfaces. Replace the port if needed (for example,1514for non-root Linux).
-
-
Exporter configuration:
-
creds_file_path: Full path to the ingestion authentication file:- Linux:
/etc/bindplane-agent/ingestion-auth.json - Windows:
C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
- Linux:
-
YOUR_CUSTOMER_ID: Your Google SecOps customer ID. -
endpoint: 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 the 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-collector -
Verify the service is running:
sudo systemctl status observiq-otel-collector -
Check 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-collector- Services console:
- Press
Win+R, typeservices.msc, and press Enter. - Locate observIQ OpenTelemetry Collector.
- Right-click and select Restart.
- Press
-
Verify the service is running:
sc query observiq-otel-collector -
Check logs for errors:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
Configure syslog forwarding on Cisco Catalyst Center
- Sign in to the Cisco Catalyst Center.
- Go to System > Settings > External Services > Destinations > Syslog.
- Click the Addicon ( +) to create a new syslog destination.
- Provide the following configuration details:
- Name: Enter a descriptive name (for example,
Google SecOps-Bindplane). - Description: Enter a brief description (for example,
Syslog forwarding to Google SecOps via Bindplane). - Hostname/IP Address: Enter the IP address of the Bindplane agent host.
- Port: Enter
514(or the port configured in the Bindplane agent). - Protocol: Select UDPor TCPdepending on your Bindplane configuration.
- Name: Enter a descriptive name (for example,
-
Click Save.
Option 2 - Webhook integration
This option uses Cisco Catalyst Center's native webhook capabilities to deliver structured JSON events directly to Google SecOps in real time.
Create webhook feed in Google SecOps
Create the feed
- Go to SIEM Settings > Feeds.
- Click Add New Feed.
- On the next page, click Configure a single feed.
- In the Feed namefield, enter a name for the feed (for example,
Cisco Catalyst Center Webhook). - Select Webhookas the Source type.
- Select Cisco Catalyst Centeras the Log type.
- Click Next.
- Specify values for the following input parameters:
- Split delimiter(optional): Enter
\nfor newline-delimited events. - Asset namespace: The asset namespace .
- Ingestion labels: The label to be applied to the events from this feed.
- Split delimiter(optional): Enter
- Click Next.
- Review your new feed configuration in the Finalizescreen, and then click Submit.
Generate and save secret key
After creating the feed, you must generate a secret key for authentication:
- On the feed details page, click Generate Secret Key.
- A dialog displays the secret key.
-
Copy and savethe secret key securely.
Get the feed endpoint URL
- Go to the Detailstab of the feed.
- In the Endpoint Informationsection, copy the Feed endpoint URL.
- Save this URL for the next steps.
- Click Done.
Create Google Cloud API key
Google SecOps requires an API key for authentication. Create a restricted API key in the Google Cloud Console.
Create the API key
- Go to the Google Cloud Console Credentials page .
- Select your project (the project associated with your Google SecOps instance).
- Click Create credentials > API key.
- An API key is created and displayed in a dialog.
- Click Edit API keyto restrict the key.
Restrict the API key
- In the API keysettings page:
- Name: Enter a descriptive name (for example,
Chronicle Webhook API Key).
- Name: Enter a descriptive name (for example,
- Under API restrictions:
- Select Restrict key.
- In the Select APIsdropdown, search for and select Chronicle API.
- Click Save.
- Copythe API key value from the API keyfield at the top of the page.
-
Save the API key securely.
Configure webhook destination in Cisco Catalyst Center
- Sign in to the Cisco Catalyst Center.
- Go to System > Settings > External Services > Destinations > Webhook.
- Click the Addicon ( +) to create a new webhook destination.
- Provide the following configuration details:
- Name: Enter a descriptive name (for example,
Google SecOps-Webhook). - Description: Enter a brief description (for example,
Webhook to Google SecOps). - URL: Paste the Google SecOps webhook endpoint URL.
- Method: Select POST.
- Authentication: Select No Authentication.
- Trust Certificate: Select Yes.
- Headers: Click Add Headerand add the following headers:
- Name:
Content-Type, Value:application/json - Name:
X-goog-api-key, Value: Your Google Cloud API key - Name:
X-Webhook-Access-Key, Value: Your Google SecOps feed secret key
- Name:
- Name: Enter a descriptive name (for example,
- Click Save.
Subscribe events to webhook notifications
- In Cisco Catalyst Center, go to Platform > Developer Toolkit > Event Notifications.
- In the Notificationstab, click Create New Notification.
- In Step 1 (Select Site and Events), select the sites and events 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.
- Click Next.
- In Step 2 (Select Channels), select RESTas the notification channel.
- In the Endpointdropdown, select the webhook destination created in the previous section (for example,
Google SecOps-Webhook). - Click Next.
- In Step 3 (Summary), review the notification configuration.
- Enter a Namefor the subscription (for example,
Google SecOps Events). - Click Finish.
UDM mapping table
| Log Field | UDM Mapping | Logic |
|---|---|---|
category
|
security_result.severity_details
|
The value of category
from the raw log is mapped to the security_result.severity_details
field. |
ciscoDnaEventLink
|
target.url
|
The value of ciscoDnaEventLink
from the raw log is mapped to the target.url
field. |
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
|
The value of details.Assurance_Issue_Category
from the raw log is mapped with the key "Assurance_Issue_Category". |
details.Assurance_Issue_Details
|
security_result.summary
|
The value of details.Assurance_Issue_Details
from the raw log is mapped to the security_result.summary
field. |
details.Assurance_Issue_Name
|
security_result.about.resource.attribute.labels[].value
|
The value of details.Assurance_Issue_Name
from the raw log is mapped with the key "Assurance_Issue_Name". |
details.Assurance_Issue_Priority
|
security_result.about.resource.attribute.labels[].value
|
The value of details.Assurance_Issue_Priority
from the raw log is mapped with the key "Assurance_Issue_Priority". |
details.Assurance_Issue_Status
|
security_result.about.resource.attribute.labels[].value
|
The value of details.Assurance_Issue_Status
from the raw log is mapped with the key "Assurance_Issue_Status". |
details.Device
|
target.ip
, target.hostname
|
If the value is an IP address, it is mapped to target.ip
, otherwise to target.hostname
. |
dnacIp
|
target.ip
|
The value of dnacIp
from the raw log is mapped to target.ip
if it is a valid IP address. |
domain
|
additional.fields[].value.string_value
|
The value of domain
from the raw log is added as a key-value pair to additional.fields
with the key "domain". |
eventId
|
metadata.product_event_type
|
The value of eventId
from the raw log is mapped to the metadata.product_event_type
field. |
instanceId
|
target.resource.product_object_id
|
The value of instanceId
from the raw log is mapped to the target.resource.product_object_id
field. |
name
|
target.resource.attribute.labels[].value
|
The value of name
from the raw log is mapped with the key "name". |
namespace
|
target.namespace
|
The value of namespace
from the raw log is mapped to the target.namespace
field. |
network.deviceId
|
target.asset.asset_id
|
The value of network.deviceId
from the raw log is prefixed with "deviceId: " and mapped to target.asset.asset_id
. |
note
|
additional.fields[].value.string_value
|
The value of note
from the raw log is added as a key-value pair to additional.fields
with the key "note". |
severity
|
security_result.severity
|
Used to determine the value of security_result.severity
, is_alert
, and is_significant
. |
source
|
target.resource.attribute.labels[].value
|
The value of source
from the raw log is mapped with the key "source". |
src_ip
|
principal.ip
|
Extracted from the raw log message using grok pattern and mapped to principal.ip
. |
subDomain
|
additional.fields[].value.string_value
|
The value of subDomain
from the raw log is added as a key-value pair to additional.fields
with the key "subDomain". |
tntId
|
target.resource.attribute.labels[].value
|
The value of tntId
from the raw log is mapped with the key "tntId". |
type
|
target.resource.attribute.labels[].value
|
The value of type
from the raw log is mapped with the key "type". |
userId
|
target.user.userid
|
The value of userId
from the raw log is mapped to the target.user.userid
field. |
version
|
metadata.product_version
|
The value of version
from the raw log is mapped to the metadata.product_version
field. |
|
N/A
|
metadata.event_type
|
Set based on the presence and values of has_principal
, has_target
, and userId
fields. Possible values: NETWORK_CONNECTION, USER_UNCATEGORIZED, STATUS_UPDATE, GENERIC_EVENT. |
|
N/A
|
is_alert
|
Set to true if severity is 0 or 1, false otherwise. |
|
N/A
|
is_significant
|
Set to true if severity is 0 or 1, false otherwise. |
correlationId
|
event.idm.read_only_udm.additional.fields
|
Mapped from changelog |
isSimulated
|
event.idm.read_only_udm.additional.fields
|
Mapped from changelog |
startTime
|
event.idm.read_only_udm.extensions.vulns.vulnerabilities.scan_start_time
|
Mapped from changelog |
details.wlcIp
|
event.idm.read_only_udm.intermediary.ip
|
Mapped from changelog |
details.detectingApName
|
event.idm.read_only_udm.observer.hostname
|
Mapped from changelog |
details.detectingApLocation
|
event.idm.read_only_udm.observer.location.name
|
Mapped from changelog |
details.detectingApMacAddress
|
event.idm.read_only_udm.observer.mac
|
Mapped from changelog |
network.siteId
|
event.idm.read_only_udm.observer.resource.attribute.labels
|
Mapped from changelog |
src_ip
|
event.idm.read_only_udm.principal.hostname
|
Mapped from changelog |
details
|
event.idm.read_only_udm.security_result.detection_fields
|
Mapped from changelog |
details.threatType
|
event.idm.read_only_udm.security_result.threat_name
|
Mapped from changelog |
tenantId
|
event.idm.read_only_udm.target.resource.attribute.labels
|
Mapped from changelog |
Change Log
View the Change Log for this parser
Need more help? Get answers from Community members and Google SecOps professionals.

