Collect Cisco Secure ACS logs
This document describes how you can collect Cisco Secure Access Control Server (ACS) logs by using a Google Security Operations forwarder.
For more information, see Data ingestion to Google Security Operations.
An ingestion label identifies the parser which normalizes raw log data to structured
UDM format. The information in this document applies to the parser with the
CISCO_ACS ingestion label.
Configure Cisco Secure ACS
- Sign in to Cisco Secure ACS console using administrator credentials.
- In the Cisco Secure ACS console, select System administration > Configuration > Log configuration > Remote log targets.
- Click Create.
- In the Create window, specify values for the following fields: - Field - Description - Name - Name of the Google Security Operations forwarder. - Description - Description of the Google Security Operations forwarder. - IP address - IP address of the Google Security Operations forwarder. - Use advanced syslog options - Select this option to enable the advanced syslog options. - Target type - Select TCP syslog or UDP syslog. - Port - Use a high port, such as 10514. - Facility code - LOCAL6 (code = 22; default). - Maximum length - The recommended value is 1024. 
- Click Submit. The Remote log targets window appears with the new remote log target configuration. 
- In the Cisco Secure ACS console, select System administration > Configuration > Log configuration > Logging categories > Per-Instance. 
- Select ACS, and then click Configure. 
- In the Per-Instance window, select a logging category, and then click Edit. - On the General tab, for some logging categories, the logging severity must be set to default or as provided by the vendor. - For Cisco Secure ACS, the default severity is Warn for all the logging categories except for those for which the severity cannot be changed, such as AAA audit-notice, accounting-notice, administrative and operational audit-notice, and system statistics-notice. 
- Click the Remote syslog target tab and move the newly created remote target from Available targets to Selected targets. 
- Click Submit. 
- To configure remote targets for other logging categories repeat steps from 8 to 10. 
Configure Google Security Operations forwarder and syslog to ingest Cisco Secure ACS logs
- Go to SIEM Settings > Forwarders.
- Click Add new forwarder.
- In the Forwarder Name field, enter a unique name for the forwarder.
- Click Submit. The forwarder is added and the Add collector configuration window appears.
- In the Collector name field, type a name.
- Select Cisco ACS as the Log type.
- Select Syslog as the Collector type.
- Configure the following mandatory input parameters:
- Protocol: specify the protocol.
- Address: specify the target IP address or hostname where the collector resides and addresses to the syslog data.
- Port: specify the target port where the collector resides and listens for syslog data.
 
- Click Submit.
For more information about Google Security Operations forwarders, see Google Security Operations forwarders documentation. For information about requirements for each forwarder type, see Forwarder configuration by type. If you encounter issues when you create forwarders, contact Google Security Operations support.
Field mapping reference
This parser handles Cisco ACS logs, including authentication, accounting, diagnostics, and system statistics. It uses grok patterns to extract fields from various log formats (SYSLOG + KV, LEEF), normalizes timestamps and timezones, and maps key fields to the UDM, handling different log types with specific logic for authentication successes/failures, TACACS+ accounting, and RADIUS events. It also enriches the UDM with additional fields like device information and authentication details.
UDM Mapping Table
| Log Field | UDM Mapping | Logic | 
|---|---|---|
| Acct-Authentic | additional.fields[].value.string_value | Value is taken from the Acct-Authenticfield. | 
| Acct-Delay-Time | additional.fields[].value.string_value | Value is taken from the Acct-Delay-Timefield. | 
| Acct-Input-Octets | additional.fields[].value.string_value | Value is taken from the Acct-Input-Octetsfield. | 
| Acct-Input-Packets | additional.fields[].value.string_value | Value is taken from the Acct-Input-Packetsfield. | 
| Acct-Output-Octets | additional.fields[].value.string_value | Value is taken from the Acct-Output-Octetsfield. | 
| Acct-Output-Packets | additional.fields[].value.string_value | Value is taken from the Acct-Output-Packetsfield. | 
| Acct-Session-Id | additional.fields[].value.string_value | Value is taken from the Acct-Session-Idfield. | 
| Acct-Session-Time | additional.fields[].value.string_value | Value is taken from the Acct-Session-Timefield. | 
| Acct-Status-Type | additional.fields[].value.string_value | Value is taken from the Acct-Status-Typefield. | 
| Acct-Terminate-Cause | additional.fields[].value.string_value | Value is taken from the Acct-Terminate-Causefield. | 
| ACSVersion | additional.fields[].value.string_value | Value is taken from the ACSVersionfield. | 
| AD-Domain | principal.group.group_display_name | Value is taken from the AD-Domainfield. | 
| AD-IP-Address | principal.ip | Value is taken from the AD-IP-Addressfield. | 
| Called-Station-ID | additional.fields[].value.string_value | Value is taken from the Called-Station-IDfield. | 
| Calling-Station-ID | additional.fields[].value.string_value | Value is taken from the Calling-Station-IDfield. | 
| Class | additional.fields[].value.string_value | Value is taken from the Classfield. | 
| CmdSet | (not mapped) | Not mapped to the IDM object. | 
| ConfigVersionId | additional.fields[].value.number_value | Value is taken from the ConfigVersionIdfield and converted to a float. | 
| DestinationIPAddress | target.ip,intermediary.ip | Value is taken from the DestinationIPAddressfield.intermediary.ipis derived fromDevice IP Address. | 
| DestinationPort | target.port | Value is taken from the DestinationPortfield and converted to an integer. | 
| Device IP Address | intermediary.ip | Value is taken from the Device IP Addressfield. | 
| Device Port | intermediary.port | Value is taken from the Device Portfield and converted to an integer. | 
| DetailedInfo | security_result.summary,security_result.description,security_result.action | If DetailedInfois "Authentication succeed",security_result.summaryis "successful login occurred" andsecurity_result.actionis ALLOW. IfDetailedInfocontains "Invalid username or password specified",security_result.summaryis "failed login occurred" andsecurity_result.actionis BLOCK.security_result.descriptionis derived fromlog_header. | 
| Framed-IP-Address | principal.ip | Value is taken from the Framed-IP-Addressfield. | 
| Framed-Protocol | additional.fields[].value.string_value | Value is taken from the Framed-Protocolfield. | 
| NAS-IP-Address | target.ip | Value is taken from the NAS-IP-Addressfield. | 
| NAS-Port | additional.fields[].value.string_value | Value is taken from the NAS-Portfield. | 
| NAS-Port-Id | target.port | Value is taken from the NAS-Port-Idfield and converted to an integer. | 
| NAS-Port-Type | additional.fields[].value.string_value | Value is taken from the NAS-Port-Typefield. | 
| NetworkDeviceName | target.hostname | Value is taken from the NetworkDeviceNamefield. | 
| Protocol | additional.fields[].value.string_value | Value is taken from the Protocolfield. | 
| RadiusPacketType | (not mapped) | Not mapped to the IDM object. | 
| Remote-Address | principal.ip,target.ip | Value is taken from the Remote-Addressfield and parsed as an IP address. It is mapped toprincipal.ipfor authentication events andtarget.ipfor accounting and diagnostic events. | 
| RequestLatency | additional.fields[].value.string_value | Value is taken from the RequestLatencyfield. | 
| Response | principal.user.userid | If Responsecontains "User-Name", the username is extracted and mapped toprincipal.user.userid. | 
| SelectedAccessService | additional.fields[].value.string_value | Value is taken from the SelectedAccessServicefield. | 
| SelectedAuthenticationIdentityStores | security_result.detection_fields[].value | Value is taken from the SelectedAuthenticationIdentityStoresfield. | 
| SelectedAuthorizationProfiles | security_result.detection_fields[].value | Value is taken from the SelectedAuthorizationProfilesfield. | 
| Service-Type | additional.fields[].value.string_value | Value is taken from the Service-Typefield. | 
| Tunnel-Client-Endpoint | additional.fields[].value.string_value | Value is taken from the Tunnel-Client-Endpointfield and parsed as an IP address. | 
| User | target.user.userid | Value is taken from the Userfield. | 
| UserName | target.user.userid,principal.mac | If UserNameis a MAC address, it is parsed and mapped toprincipal.mac. Otherwise, it is mapped totarget.user.userid. | 
| ac-user-agent | network.http.user_agent | Value is taken from the ac-user-agentfield. | 
| cat | metadata.description | Value is taken from the catfield. | 
| device-mac | principal.mac | Value is taken from the device-macfield, colons are added, and the value is converted to lowercase. Ifdevice-macis "00", it is replaced with "00:00:00:00:00:00". | 
| device-platform | principal.asset.platform_software.platform | If device-platformis "win", the value "WINDOWS" is assigned toprincipal.asset.platform_software.platform. | 
| device-platform-version | principal.asset.platform_software.platform_version | Value is taken from the device-platform-versionfield. | 
| device-public-mac | principal.mac | Value is taken from the device-public-macfield, hyphens are replaced with colons, and the value is converted to lowercase. | 
| device-type | principal.asset.hardware.model | Value is taken from the device-typefield. | 
| device-uid | principal.asset.asset_id | Value is taken from the device-uidfield and prepended with "ASSET ID: ". | 
| device-uid-global | principal.asset.product_object_id | Value is taken from the device-uid-globalfield. | 
| hostname | principal.hostname | Value is taken from the hostnamefield. | 
| ip:source-ip | principal.ip | Value is taken from the ip:source-ipfield. | 
| kv.ADDomain | (not mapped) | Not mapped to the IDM object. | 
| kv.Airespace-Wlan-Id | (not mapped) | Not mapped to the IDM object. | 
| kv.AuthenticationIdentityStore | (not mapped) | Not mapped to the IDM object. | 
| kv.AVPair | (not mapped) | Not mapped to the IDM object. | 
| kv.CVPN3000/ASA/PIX7.x-DAP-Tunnel-Group-Name | (not mapped) | Not mapped to the IDM object. | 
| kv.CVPN3000/ASA/PIX7.x-Group-Based-Address-Pools | (not mapped) | Not mapped to the IDM object. | 
| kv.ExternalGroups | (not mapped) | Not mapped to the IDM object. | 
| kv.FailureReason | (not mapped) | Not mapped to the IDM object. | 
| kv.IdentityAccessRestricted | (not mapped) | Not mapped to the IDM object. | 
| kv.IdentityGroup | (not mapped) | Not mapped to the IDM object. | 
| kv.NAS-Identifier | (not mapped) | Not mapped to the IDM object. | 
| kv.SelectedShellProfile | (not mapped) | Not mapped to the IDM object. | 
| kv.ServiceSelectionMatchedRule | (not mapped) | Not mapped to the IDM object. | 
| kv.State | (not mapped) | Not mapped to the IDM object. | 
| kv.Step | (not mapped) | Not mapped to the IDM object. | 
| kv.Tunnel-Medium-Type | (not mapped) | Not mapped to the IDM object. | 
| kv.Tunnel-Private-Group-ID | (not mapped) | Not mapped to the IDM object. | 
| kv.Tunnel-Type | (not mapped) | Not mapped to the IDM object. | 
| kv.UseCase | (not mapped) | Not mapped to the IDM object. | 
| kv.UserIdentityGroup | (not mapped) | Not mapped to the IDM object. | 
| kv.VendorSpecific | (not mapped) | Not mapped to the IDM object. | 
| kv.attribute-131 | (not mapped) | Not mapped to the IDM object. | 
| kv.attribute-89 | (not mapped) | Not mapped to the IDM object. | 
| kv.cisco-av-pair | (not mapped) | Not mapped to the IDM object. | 
| kv.cisco-av-pair:CiscoSecure-Group-Id | (not mapped) | Not mapped to the IDM object. | 
| leef_version | (not mapped) | Not mapped to the IDM object. | 
| log_header | metadata.description | Value is taken from the log_headerfield. | 
| log_id | metadata.product_log_id | Value is taken from the log_idfield. | 
| log_type | metadata.product_event_type | Value is taken from the log_typefield. | 
| message_severity | (not mapped) | Not mapped to the IDM object. | 
| product | metadata.product_name | Value is taken from the productfield. | 
| product_version | metadata.product_version | Value is taken from the product_versionfield. | 
| server_host | target.hostname | Value is taken from the server_hostfield. | 
| timestamp | metadata.event_timestamp | Value is taken from the timestampfield and thetimezonefield (after removing the colon). The combined value is parsed as a timestamp. | 
| url | network.dns.questions[].name | Value is taken from the urlfield. | 
| vendor | metadata.vendor_name | Value is taken from the vendorfield. Set to "GENERIC_EVENT" initially, then potentially overwritten based on thelog_typeand parsed fields.  Can be "USER_LOGIN", "USER_UNCATEGORIZED", "NETWORK_DNS", "NETWORK_CONNECTION", "STATUS_UPDATE", or "STATUS_UNCATEGORIZED". Set to "Cisco" initially, then potentially overwritten by thevendorfield. Set to "ACS" initially, then potentially overwritten by theproductfield. Set to "CISCO_ACS". Set to "USERNAME_PASSWORD". Set to "TACACS". Set to "UDP" for RADIUS accounting and diagnostic events. Set to "DNS" for DNS events. Derived from thesecurity_actionfield, which is set based on whether the login was successful or not. Set to "successful login occurred" for successful logins and "failed login occurred" for failed logins.  May also be set to "passed" for certain identity store diagnostic events. Set to "LOW" for failed login attempts. Constructed by prepending "ASSET ID: " to thedevice-uidfield. | 
Need more help? Get answers from Community members and Google SecOps professionals.