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 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-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.shWait 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-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-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-collectorCheck 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 Add icon (+) 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 UDP or TCP depending 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 name field, enter a name for the feed (for example,
Cisco Catalyst Center Webhook). - Select Webhook as the Source type.
- Select Cisco Catalyst Center as 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 Finalize screen, 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 save the secret key securely.
Get the feed endpoint URL
- Go to the Details tab of the feed.
- In the Endpoint Information section, 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 key to restrict the key.
Restrict the API key
- In the API key settings 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 APIs dropdown, search for and select Chronicle API.
- Click Save.
- Copy the API key value from the API key field 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 Add icon (+) 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 Header and 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 Notifications tab, 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 REST as the notification channel.
- In the Endpoint dropdown, 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 Name for 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. |
Need more help? Get answers from Community members and Google SecOps professionals.