ASA

Cisco ASA Management Plane Hardening

Cisco ASA Management Plane Hardening
In: ASA, Fundamentals

The management plane is where most ASA breaches happen, and most of those breaches are preventable with a handful of configuration steps that take an hour to apply. This article covers the production-ready hardening pass for a Cisco ASA: SSH and HTTPS the right way, AAA against an external server with local fallback, a per-interface management ACL, password policy, banner, and the cleanup steps that disable the things you do not need. The lab's three AAA server-groups (RADIUS-VPN, LDAP-VPN, TACACS-ADMIN) appear here because the same server-group framework drives both VPN auth and admin auth.

This is the Cisco ASA Fundamentals article that maps onto the CIS Benchmark and most internal hardening standards. After running these commands, your ASA is something an auditor will not flag for the obvious findings.

SSH: Strong Keys, Strong Algorithms, Strict Sources

The default SSH config on a fresh ASA is permissive. Five things to tighten:

SettingDefaultHardened
Key sizeRSA 1024RSA 2048+ or ECDSA
Protocol version1 and 22 only
Idle timeout5 minutes5-10 minutes (unchanged is fine)
Permitted source subnetsNone (deny by default)Explicit per-interface allow-list
Cipher and KEX algorithmsWide listStrong-only

The configuration block:

ASA-PERIM(config)# crypto key zeroize rsa
ASA-PERIM(config)# crypto key generate rsa modulus 2048
ASA-PERIM(config)# crypto key generate ecdsa elliptic-curve 384
!
ASA-PERIM(config)# ssh version 2
ASA-PERIM(config)# ssh timeout 10
ASA-PERIM(config)# ssh key-exchange group dh-group14-sha256
ASA-PERIM(config)# ssh cipher encryption high
ASA-PERIM(config)# ssh cipher integrity high
!
ASA-PERIM(config)# ssh 10.10.0.0 255.255.255.0 inside
ASA-PERIM(config)# ssh 10.10.99.0 255.255.255.0 management

The cipher encryption high and cipher integrity high presets restrict the algorithm list to current strong choices (AES-256-GCM, ChaCha20, HMAC-SHA2-256). The presets get updated by Cisco as algorithms age out, so using the preset rather than naming individual algorithms means you inherit future tightening without revisiting the config.

The two ssh permit lines are the ASA's built-in SSH ACL: SSH from 10.10.0.0/24 on inside or 10.10.99.0/24 on management is allowed. SSH from anywhere else is silently dropped. Without at least one ssh permit line for an interface, the daemon does not listen on that interface at all.

HTTPS / ASDM: Lock It Down or Turn It Off

If you do not use ASDM, turn the HTTPS server off:

ASA-PERIM(config)# no http server enable

If you do use ASDM, pin it to a specific source list and use a real cert:

ASA-PERIM(config)# http server enable
ASA-PERIM(config)# http 10.10.0.50 255.255.255.255 inside
ASA-PERIM(config)# http 10.10.0.51 255.255.255.255 inside
ASA-PERIM(config)# http server idle-timeout 10
ASA-PERIM(config)# ssl server-version tlsv1.2 dtlsv1.2
ASA-PERIM(config)# ssl cipher tlsv1.2 high
ASA-PERIM(config)# ssl trust-point ASDM-CERT outside

The cert pinning matters for the same reason it does for AnyConnect: if you leave the default self-signed cert, every admin connection trains people to click through cert warnings, which trains them to click through a real attack later. Use a CA-signed cert if the ASA's HTTPS server is reachable from anywhere outside your tightly-controlled management subnet. See trustpoints and certificates for the cert workflow.

Local Users: Privilege 15, Hashed Passwords

ASA-PERIM(config)# username admin password Cisc0_Admin_S3cret! privilege 15
ASA-PERIM(config)# username noc password Cisc0_NOC_View1 privilege 5
ASA-PERIM(config)# username break-glass password Cisc0_Glass_R3cover! privilege 15

Three roles. The break-glass account exists for the case where AAA is unreachable; document its existence, rotate its password quarterly, and store it in a sealed envelope or a privileged-access vault. Skip this account and a RADIUS outage cuts you off from the firewall during the exact incident you need to log in to fix.

Privilege 15 is full enable. Privilege 5 (or any custom level you define with privilege ... level N command ...) is read-mostly. Most NOCs are happy with a level-5 user that can run show and packet-tracer but cannot configure.

AAA Server Groups (RADIUS / LDAP / TACACS+)

External AAA is the single biggest hardening win because it puts admin accounts under your existing identity-management lifecycle (joiner/mover/leaver). When somebody leaves the team, disabling them in AD or your IdP cuts off their ASA access automatically.

The PingLabz lab has three server groups configured (one per protocol), defined in Session 3:

ASA-PERIM# show running-config aaa-server
aaa-server RADIUS-VPN protocol radius
aaa-server RADIUS-VPN (inside) host 10.10.0.10
 retry-interval 2
 timeout 5
 key *****
 authentication-port 1812
 accounting-port 1813
aaa-server LDAP-VPN protocol ldap
aaa-server LDAP-VPN (inside) host 10.10.0.20
 server-port 636
 ldap-base-dn dc=pinglabz,dc=lab
 ldap-scope subtree
 ldap-naming-attribute sAMAccountName
 ldap-login-password *****
 ldap-login-dn cn=svc-asa,ou=Service,dc=pinglabz,dc=lab
 ldap-over-ssl enable
 server-type microsoft
aaa-server TACACS-ADMIN protocol tacacs+
aaa-server TACACS-ADMIN (inside) host 10.10.0.30
 timeout 5
 key *****

For admin login the standard practice is TACACS+ because it gives you per-command authorization and full command accounting. Bind the TACACS group to SSH login:

ASA-PERIM(config)# aaa authentication ssh console TACACS-ADMIN LOCAL
ASA-PERIM(config)# aaa authentication enable console TACACS-ADMIN LOCAL
ASA-PERIM(config)# aaa authentication http console TACACS-ADMIN LOCAL
ASA-PERIM(config)# aaa authentication serial console LOCAL
!
ASA-PERIM(config)# aaa authorization command TACACS-ADMIN LOCAL
ASA-PERIM(config)# aaa accounting command TACACS-ADMIN
ASA-PERIM(config)# aaa accounting enable console TACACS-ADMIN

Walk through the binds. Authentication runs against TACACS-ADMIN first, falling back to LOCAL if every TACACS server is unreachable (the LOCAL keyword is critical - omit it and a TACACS outage locks you out). Authorization uses the same group to ask TACACS "is this user allowed to run this command?" - useful when you want a NOC role that can run show but not configure. Accounting logs every command and every enable to the AAA server, giving you an audit trail.

Console authentication usually stays LOCAL because if you are at the console, AAA might be the very thing that is broken.

Management ACL: Defense in Depth

The per-interface ssh and http permit lines are the first ACL. A second ACL at the interface level adds defense in depth and lets you log management-plane attempts in a single place.

ASA-PERIM(config)# object-group network MGMT-SOURCES
ASA-PERIM(config-network-object-group)#  network-object 10.10.0.0 255.255.255.0
ASA-PERIM(config-network-object-group)#  network-object 10.10.99.0 255.255.255.0
ASA-PERIM(config-network-object-group)#  network-object host 10.20.5.10 ! Jump host
!
ASA-PERIM(config)# access-list MGMT-IN extended permit tcp object-group MGMT-SOURCES interface inside eq ssh
ASA-PERIM(config)# access-list MGMT-IN extended permit tcp object-group MGMT-SOURCES interface inside eq https
ASA-PERIM(config)# access-list MGMT-IN extended permit udp object-group MGMT-SOURCES interface inside eq snmp
ASA-PERIM(config)# access-list MGMT-IN extended deny ip any interface inside log informational interval 60
ASA-PERIM(config)# access-list MGMT-IN extended permit ip any any
ASA-PERIM(config)# access-group MGMT-IN in interface inside control-plane

The control-plane keyword is the magic word: this ACL applies only to traffic destined for the ASA itself (the management plane), not to through-traffic. The final permit ip any any ensures through-traffic continues to be governed by your real OUTSIDE_IN / INSIDE_OUT policies elsewhere; the deny in the middle only fires for management-plane attempts that did not match the explicit allow lines.

Password Policy

ASA-PERIM(config)# password-policy minimum-length 14
ASA-PERIM(config)# password-policy minimum-uppercase 1
ASA-PERIM(config)# password-policy minimum-lowercase 1
ASA-PERIM(config)# password-policy minimum-numeric 1
ASA-PERIM(config)# password-policy minimum-special 1
ASA-PERIM(config)# password-policy minimum-changes 4
ASA-PERIM(config)# password-policy lifetime 90
ASA-PERIM(config)# password-policy reuse-interval 12

The lifetime 90 setting forces a password change every 90 days. reuse-interval 12 prevents reusing any of the last 12 passwords. minimum-changes 4 means a new password must differ from the old one in at least 4 character positions, which prevents the classic "Password1 -> Password2" pattern.

If your AAA server (Microsoft AD, etc.) already enforces a password policy, the local policy mostly applies to the few break-glass accounts. Set both anyway; defense in depth.

Login Banner

Banners are not a technical control but they are a legal one. A clearly-worded banner asserting that the system is restricted, monitored, and logged is what allows your incident response to actually do something with the audit logs you collect.

ASA-PERIM(config)# banner motd ************************************************************
ASA-PERIM(config)# banner motd  WARNING: Authorized access only.
ASA-PERIM(config)# banner motd  Activity on this device is monitored, logged, and audited.
ASA-PERIM(config)# banner motd  Unauthorized access will be prosecuted under applicable law.
ASA-PERIM(config)# banner motd ************************************************************
ASA-PERIM(config)# banner login Please log in:
ASA-PERIM(config)# banner exec Logged-in users have agreed to the MOTD policy.

The MOTD shows before login (useful for the legal warning). The login banner shows immediately before the username prompt. The exec banner shows after successful login.

Skip language like "welcome" or "hello" - those have, in past cases, been used by defense to argue the banner did not constitute a clear no-trespass notice. Boring legalese works better in court.

SNMP: v3 Only, Strong Auth, Privacy

SNMPv1 and v2c send community strings in cleartext. Disable them.

ASA-PERIM(config)# no snmp-server enable traps snmp authentication
ASA-PERIM(config)# snmp-server group ADMIN-GROUP v3 priv
ASA-PERIM(config)# snmp-server user noc-monitor ADMIN-GROUP v3 auth sha NOC-Auth-S3cret priv aes 256 NOC-Priv-S3cret
ASA-PERIM(config)# snmp-server host inside 10.10.0.40 version 3 noc-monitor

SNMPv3 with auth sha priv aes 256 gives you authenticated, privacy-encrypted polling. The username/auth/priv credentials replace the cleartext community string of v2c.

Disable What You Do Not Use

Each enabled service is a potential attack surface. Turn off what you do not need:

ASA-PERIM(config)# no telnet 0.0.0.0 0.0.0.0 inside
ASA-PERIM(config)# no telnet 0.0.0.0 0.0.0.0 outside
ASA-PERIM(config)# no telnet 0.0.0.0 0.0.0.0 management
ASA-PERIM(config)# no http server enable                    ! if you do not use ASDM
ASA-PERIM(config)# no ssh stricthostkeycheck                ! relax only if you have a reason
ASA-PERIM(config)# no service password-recovery             ! prevents ROMmon password reset; use only with break-glass discipline

no service password-recovery is the most dangerous of these. It hardens the ASA against an attacker with physical console access, but it also means your password-reset path is "wipe the box and reload from backup." Only enable it if you have a tested off-box backup and a documented restore procedure - both of which the upgrade and backup article covers.

NTP Authentication

If your AAA depends on Kerberos or any cert-based protocol, time skew breaks login. Authenticate NTP so an attacker cannot manipulate the clock.

ASA-PERIM(config)# ntp authenticate
ASA-PERIM(config)# ntp authentication-key 1 md5 NTP-Auth-K3y
ASA-PERIM(config)# ntp trusted-key 1
ASA-PERIM(config)# ntp server 10.10.0.10 key 1 source inside prefer
ASA-PERIM(config)# ntp server 10.10.0.11 key 1 source inside

Log the Management Plane Events

Hardening without logging is a tree falling in a forest. The ASA emits per-event syslogs for SSH login success/fail, AAA accept/reject, command authorization, and config changes. Make sure these are flowing to your SIEM:

ASA-PERIM(config)# logging enable
ASA-PERIM(config)# logging timestamp
ASA-PERIM(config)# logging buffered informational
ASA-PERIM(config)# logging trap informational
ASA-PERIM(config)# logging host inside 10.10.0.30 17/514

Specific message IDs to watch for in your SIEM rules:

Message IDEvent
%ASA-6-605004SSH login allowed
%ASA-6-605005SSH login session started
%ASA-6-113004 / %ASA-6-113005AAA user authentication accepted / rejected
%ASA-5-111007Configuration change
%ASA-5-111008User executed a command (with the command itself)
%ASA-5-502103User priv level changed

Failed-login alarms over a window are the easiest brute-force detection. syslog configuration and reading covers the full message format and the recommended remote-server setup.

The 12-Item Hardening Checklist

If you do nothing else from this article, do these:

  1. Replace the default 1024-bit RSA host key with 2048+ and ECDSA P-384.
  2. ssh version 2 only.
  3. Per-interface ssh permit lines limited to known-good source subnets.
  4. External AAA (TACACS+ for admin) with explicit LOCAL fallback.
  5. A break-glass local user, password rotated quarterly.
  6. Per-interface management-plane ACL with control-plane keyword.
  7. Disable telnet on every interface.
  8. Disable HTTPS server if you do not use ASDM; pin source subnets if you do.
  9. Turn off SNMPv1/v2c; use v3 with auth+priv.
  10. Set a clear, legalese MOTD banner.
  11. Authenticated NTP from at least two sources.
  12. Remote syslog to a SIEM with alerting on the management-plane message IDs.

An hour of work. Years of avoided pain.

Key Takeaways

The Cisco ASA management plane is hardened in layers: per-interface SSH/HTTPS permits, control-plane ACL, AAA against an external server with local fallback, password policy on the local accounts, and aggressive logging of every authentication and command event. The lab's three AAA server-groups (RADIUS-VPN / LDAP-VPN / TACACS-ADMIN) work for both VPN and admin auth from the same framework.

The single biggest hardening win is wiring TACACS+ for admin login with command authorization and accounting. Once that is in place, joiner/mover/leaver flows through your IdP automatically, and every command an admin runs is logged centrally with the username attached.

For the logging side, see Cisco ASA Syslog Configuration and Logging Levels. For the rest of the cluster, the Cisco ASA pillar has the reading order.

Written by
More from Ping Labz
Great! You’ve successfully signed up.
Welcome back! You've successfully signed in.
You've successfully subscribed to Ping Labz.
Your link has expired.
Success! Check your email for magic link to sign-in.
Success! Your billing info has been updated.
Your billing was not updated.