L7 · security · draft
TACACS+
Terminal Access Controller Access-Control System Plus
Device-administration AAA that separates authentication, authorization, and accounting exchanges over TCP.
Presenter modeEmbed this figure
Why it exists
Device administration needs per-command policy and accounting, not only a yes/no network-access decision like many RADIUS deployments. IntroductionRFC 8907 · INFORMATIONAL · September 2020
RFC 8907 documents deployed TACACS+ as Informational. It is not an IETF Standards Track interoperability standard. IntroductionRFC 8907 · INFORMATIONAL · September 2020
Authenticate, then authorize the shell
Login is not one packet. Authentication establishes identity; a separate authorization request asks whether the shell or service is permitted.
The device opens a TCP session to the TACACS+ server. Single-connection mode may reuse the socket for many AAA sessions. Admin. Device · TACACS client. TACACS+ · TCP.
- Link
- Blocking
- Packet in flight
- Discarded
- Emphasis
Text equivalent of this diagram
| Element | Kind | State |
|---|---|---|
| Admin | host | — |
| Device · TACACS client | router | — |
| TACACS+ · TCP | cloud | — |
| Admin — Device · TACACS client | link | up |
| Device · TACACS client — TACACS+ · TCP | link | up |
The device opens a TCP session to the TACACS+ server. Single-connection mode may reuse the socket for many AAA sessions.
What changed
- TCP session: Device · TACACS client → TACACS+ · TCP
- TCP, not UDP
How it works
Authentication, authorization, and accounting are distinct exchanges over a TCP connection, with a common packet header. TACACS+ Packets and SessionsRFC 8907 · INFORMATIONAL · September 2020
Authorization REQUEST carries argument-value pairs naming the service or command; REPLY permits, denies, or modifies them. AuthorizationRFC 8907 · INFORMATIONAL · September 2020
Privilege levels and command sets are policy on the server; the device enforces the REPLY. Privilege LevelsRFC 8907 · INFORMATIONAL · September 2020
On the wire
Constructed examples, encoded from the field table below them — not captured traffic.
- TCP
- TACACS+ runs over TCP. Common deployment uses port 49. RFC 8907
- TACACS+ header
- Fixed header preceding the (usually encrypted) body. RFC 8907
Configure it
aaa new-model tacacs server LAB address ipv4 192.0.2.20 key <configured out of band>Named TACACS+ server. Sessions ride TCP (commonly port 49). Authentication, authorization, and accounting are separate exchanges — unlike RADIUS folding authz into Access-Accept.
RFC 8907 §4.1
aaa authentication login default group tacacs+ local aaa authorization exec default group tacacs+ localLogin proves identity; a second authorization request asks whether the shell/exec is permitted. Local is the outage fallback.
Common mistake: Configuring authentication without exec authorization — users authenticate then land in an unexpected privilege level.
RFC 8907 §5
aaa authorization commands 15 default group tacacs+ localOptional command authorization: each privileged command can be checked as its own authorization request.
RFC 8907 §6
Verify
show tacacs- Server address, port, and success/fail counters.
show aaa servers- TACACS+ server state where listed.
Caveats
- Marked draft: syntax has not been checked against Cisco documentation or a device.
- RFC 8907 is Informational — it documents deployed TACACS+, not Standards Track.
- Placeholder keys only — never commit real shared secrets.
When it breaks
Symptom first, because that is what you have when it happens.
Login succeeds, but every privileged command is rejected.
Narrow it down
- Separate authentication from command-authorization logs.
- Check the command and argument attributes sent.
Cause
The identity passed authentication, while the independent authorization policy denied the requested command.
Fix
Correct the command set or device attribute mapping; do not weaken authentication to solve authorization.
AuthorizationRFC 8907 · INFORMATIONAL · September 2020A server outage locks out all administrators.
Narrow it down
- Read the complete AAA method list.
- Test the difference between server error and explicit reject.
Cause
The fallback method is absent or only runs on an error class the client never reaches.
Fix
Provide a tested local emergency method and document when fallback is invoked; never make explicit policy rejection fall through silently.
Cisco IOS XE — Configuring TACACS+ §Configuring TACACS+Accounting records login but no commands.
Narrow it down
- Check command accounting at the required privilege levels.
- Compare authorization and accounting method lists.
Cause
Session accounting was enabled, but per-command accounting was not.
Fix
Enable command accounting for the intended privilege levels and verify start/stop or stop-only behavior.
AccountingRFC 8907 · INFORMATIONAL · September 2020AAA never contacts the server though ICMP ping works.
Narrow it down
- Confirm TCP to the TACACS+ port from the configured source.
- Check intermediate firewalls that allow ICMP but not the AAA TCP port.
Cause
TACACS+ requires TCP; path filters that only permit ping leave AAA dead.
Fix
Permit the TACACS+ TCP port end to end from the device source address.
ConnectionRFC 8907 · INFORMATIONAL · September 2020Server logs show undecodable or rejected TACACS+ bodies.
Narrow it down
- Compare the shared key on device and server.
- Confirm both sides expect the same obfuscation behavior.
Cause
Mismatched shared secret breaks body obfuscation between client and server.
Fix
Align the key and restart the AAA session; rotate both ends together.
Data ObfuscationRFC 8907 · INFORMATIONAL · September 2020
Design notes
A working login with failing commands is usually authorization, not a password problem.
Always leave a tested local emergency method for server outages — and never confuse error with Reject. Cisco IOS XE — Configuring TACACS+ §Configuring TACACS+
Misconceptions
- “If TACACS+ authentication succeeds, commands are authorized.”
- Authentication and authorization are separate message types and policies; either can succeed while the other fails. AuthorizationRFC 8907 · INFORMATIONAL · September 2020
- “TACACS+ is an IETF Standards Track protocol.”
- RFC 8907 documents deployed TACACS+ as an Informational RFC; it does not turn the protocol into an IETF standard. IntroductionRFC 8907 · INFORMATIONAL · September 2020
- “TACACS+ is just RADIUS over TCP.”
- The message model separates AuthN/AuthZ/Accounting and is aimed at device administration; RADIUS commonly folds AuthZ into Access-Accept attributes over UDP. IntroductionRFC 8907 · INFORMATIONAL · September 2020
More walkthroughs
Login works; every privileged command is rejectedfailure
Command authorization asks the server about each command and its arguments. Passing identity does not imply a permit on configure terminal.
The admin types a privileged command. The device does not execute it yet — it builds an authorization request with the command and arguments. Admin · logged in. Device: Pending configure terminal. TACACS+.
- Link
- Blocking
- Packet in flight
- Discarded
- Emphasis
Text equivalent of this diagram
| Element | Kind | State |
|---|---|---|
| Admin · logged in | host | — |
| Device | router | Pending: configure terminal |
| TACACS+ | cloud | — |
| Admin · logged in — Device | link | up |
| Device — TACACS+ | link | up |
The admin types a privileged command. The device does not execute it yet — it builds an authorization request with the command and arguments.
What changed
- Device: Pending → configure terminal
- Ask before execute
Method list decides lockout vs emergency accessdesign-choice
When the server is unreachable, the AAA method list — not authentication success alone — decides whether local fallback runs, and on which error class.
TCP to the TACACS+ servers fails. That is an error path, not an explicit policy Reject. The method list must say what happens next. Admin. Device. Servers unreachable. local if-authenticated.
- Link
- Blocking
- Packet in flight
- Discarded
- Emphasis
Text equivalent of this diagram
| Element | Kind | State |
|---|---|---|
| Admin | host | — |
| Device | router | — |
| Servers unreachable | zone | — |
| local if-authenticated | label | — |
| Admin — Device | link | up |
| Device — Servers unreachable | link | down |
TCP to the TACACS+ servers fails. That is an error path, not an explicit policy Reject. The method list must say what happens next.
What changed
- Error ≠ Reject
- Emphasis on Device ↔ Servers unreachable
Terms
- Command authorization
- A TACACS+ authorization decision for a requested command and its arguments, separate from the authentication exchange that established the administrator identity.