rfc8907xml2.original.xml | rfc8907.xml | |||
---|---|---|---|---|
<?xml version="1.0" encoding="UTF-8"?> | <?xml version='1.0' encoding='UTF-8'?> | |||
<!DOCTYPE rfc SYSTEM "rfc2629.dtd"> | <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | |||
<?rfc toc="yes" ?> | ||||
<?rfc rfcedstyle="yes" ?> | ||||
<?rfc subcompact="no" ?> | ||||
<?rfc symrefs="yes" ?> | ||||
<rfc category="info" docName="draft-ietf-opsawg-tacacs-18" ipr="pre5378Trust2009 | ||||
02"> | ||||
<front> | ||||
<title> | ||||
The TACACS+ Protocol | ||||
</title> | ||||
<author initials="T." surname="Dahm" fullname="Thorsten Dahm"> | ||||
<organization>Google Inc</organization> | ||||
<address> | ||||
<postal> | ||||
<street>1600 Amphitheatre Parkway</street | ||||
> | ||||
<city>Mountain View</city> | ||||
<region>CA</region> | ||||
<code>94043</code> | ||||
<country>US</country> | ||||
</postal> | ||||
<phone /> | ||||
<email>thorstendlux@google.com</email> | ||||
<uri /> | ||||
</address> | ||||
</author> | ||||
<author initials="A." surname="Ota" fullname="Andrej Ota"> | ||||
<organization>Google Inc</organization> | ||||
<address> | ||||
<postal> | ||||
<street>1600 Amphitheatre Parkway</street | ||||
> | ||||
<city>Mountain View</city> | ||||
<region>CA</region> | ||||
<code>94043</code> | ||||
<country>US</country> | ||||
</postal> | ||||
<phone /> | ||||
<email>andrej@ota.si</email> | ||||
<uri /> | ||||
</address> | ||||
</author> | ||||
<author initials="D.C." surname="Medway Gash" fullname="Douglas C | ||||
. Medway Gash"> | ||||
<organization>Cisco Systems, Inc.</organization> | ||||
<address> | ||||
<postal> | ||||
<street>170 West Tasman Dr.</street> | ||||
<city>San Jose</city> | ||||
<region>CA</region> | ||||
<code>95134</code> | ||||
<country>US</country> | ||||
</postal> | ||||
<email>dcmgash@cisco.com</email> | ||||
<uri /> | ||||
</address> | ||||
</author> | ||||
<author initials="D." surname="Carrel" fullname="David Carrel"> | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" number="8907" category="info" | |||
<organization>vIPtela, Inc.</organization> | docName="draft-ietf-opsawg-tacacs-18" consensus="true" ipr="pre5378Trust20 | |||
0902" | ||||
obsoletes="" updates="" submissionType="IETF" xml:lang="en" | ||||
tocInclude="true" symRefs="true" version="3" sortRefs="true"> | ||||
<address> | <front> | |||
<postal> | ||||
<street>1732 North First St.</street> | ||||
<city>San Jose</city> | ||||
<region>CA</region> | ||||
<code>95112</code> | ||||
<country>US</country> | ||||
</postal> | ||||
<email>dcarrel@viptela.com</email> | ||||
<uri /> | ||||
</address> | ||||
</author> | ||||
<author initials="L." surname="Grant" fullname="Lol Grant"> | <title abbrev="TACACS+">The Terminal Access Controller Access-Control System | |||
<address> | Plus (TACACS+) Protocol | |||
<email>lol.grant@gmail.com</email> | </title> | |||
</address> | <seriesInfo name="RFC" value="8907"/> | |||
</author> | <author initials="T." surname="Dahm" fullname="Thorsten Dahm"> | |||
<organization>Google Inc.</organization> | ||||
<address> | ||||
<postal> | ||||
<street>1600 Amphitheatre Parkway</street> | ||||
<city>Mountain View</city> | ||||
<region>CA</region> | ||||
<code>94043</code> | ||||
<country>United States of America</country> | ||||
</postal> | ||||
<phone/> | ||||
<email>thorstendlux@google.com</email> | ||||
<uri/> | ||||
</address> | ||||
</author> | ||||
<author initials="A." surname="Ota" fullname="Andrej Ota"> | ||||
<organization>Google Inc</organization> | ||||
<address> | ||||
<postal> | ||||
<street>1600 Amphitheatre Parkway</street> | ||||
<city>Mountain View</city> | ||||
<region>CA</region> | ||||
<code>94043</code> | ||||
<country>United States of America</country> | ||||
</postal> | ||||
<phone/> | ||||
<email>andrej@ota.si</email> | ||||
<uri/> | ||||
</address> | ||||
</author> | ||||
<author initials="D.C." surname="Medway Gash" fullname="Douglas C. Medway Ga | ||||
sh"> | ||||
<organization>Cisco Systems, Inc.</organization> | ||||
<address> | ||||
<postal> | ||||
<street>170 West Tasman Dr.</street> | ||||
<city>San Jose</city> | ||||
<region>CA</region> | ||||
<code>95134</code> | ||||
<country>United States of America</country> | ||||
</postal> | ||||
<email>dcmgash@cisco.com</email> | ||||
<uri/> | ||||
</address> | ||||
</author> | ||||
<date day="20" month="March" year="2020" /> | <author initials="D." surname="Carrel" fullname="David Carrel"> | |||
<area>Operations</area> | <organization>IPsec Research</organization> | |||
<workgroup>Operations</workgroup> | <address> | |||
<keyword>TACACS+</keyword> | ||||
<keyword>Protocol</keyword> | ||||
<abstract> | ||||
<t>This document describes the Terminal Access Controller | ||||
Access-Control System Plus (TACACS+) | ||||
protocol which is widely deployed today to provid | ||||
e Device Administration for routers, network | ||||
access | ||||
servers and | ||||
other networked computing devices via | ||||
one or more | ||||
centralized servers. | ||||
</t> | ||||
</abstract> | ||||
</front> | <email>carrel@ipsec.org</email> | |||
<uri/> | ||||
</address> | ||||
</author> | ||||
<author initials="L." surname="Grant" fullname="Lol Grant"> | ||||
<address> | ||||
<email>lol.grant@gmail.com</email> | ||||
</address> | ||||
</author> | ||||
<date month="September" year="2020"/> | ||||
<area>Operations</area> | ||||
<workgroup>Operations</workgroup> | ||||
<keyword>TACACS+</keyword> | ||||
<keyword>Protocol</keyword> | ||||
<abstract> | ||||
<t>This document describes the Terminal Access Controller Access-Control | ||||
System Plus (TACACS+) protocol, which is widely deployed today to provide | ||||
Device Administration for routers, network access servers, and other | ||||
networked computing devices via one or more centralized servers. | ||||
</t> | ||||
</abstract> | ||||
</front> | ||||
<middle> | ||||
<section anchor="Introduction" numbered="true" toc="default"> | ||||
<name>Introduction</name> | ||||
<t>This document describes the Terminal Access Controller Access-Control | ||||
System Plus (TACACS+) protocol. It was conceived initially as a general | ||||
Authentication, Authorization, and Accounting (AAA) protocol. It is | ||||
widely deployed today but is mainly confined for a specific subset of | ||||
AAA called Device Administration, which includes authenticating access to | ||||
network | ||||
devices, providing central authorization of operations, and auditing of | ||||
those operations.</t> | ||||
<middle> | <t> | |||
<section anchor="Introduction" title="Introduction"> | A wide range of TACACS+ clients and servers is already deployed in the | |||
<t>This document describes the Terminal Access Controller | field. The TACACS+ protocol they are based on is defined in a document | |||
Access-Control System Plus (TACACS+) protocol. It | that was originally intended for IETF publication, but was never | |||
was conceived initially as a general Authenticati | standardized. The document is known as "The Draft" <xref target="THE-DRA | |||
on, Authorization | FT" | |||
and Accounting (AAA) protocol. It is widely deplo | format="default"/>. | |||
yed today but is mainly confined for a specific subset of AAA: Device | </t> | |||
Administration, that is: | <t> This Draft was a product of its time and did not address all of the | |||
authenticating access to network devices, providi | key security concerns that are considered when designing modern | |||
ng | standards. Therefore, deployment must be executed with care. These | |||
central | concerns are addressed in <xref target="TACACSSecurity" | |||
authorization of | format="default"/>. | |||
operations, and audit of those operations.</t> | </t> | |||
<t> | <t> | |||
A wide range of TACACS+ clients and servers are a | The primary intent of this informational document is to clarify the | |||
lready | subset of "The Draft", which is common to implementations supporting | |||
deployed | Device Administration. It is intended that all implementations that | |||
in | conform to this document will conform to "The Draft". However, it is | |||
the field. The TACACS+ protocol they are | not intended that all implementations that conform to "The Draft" will | |||
based on is defined in a | conform to this document. The following features from "The Draft" have | |||
draft document that was | been removed: | |||
originally intended for IETF publication, but was | </t> | |||
never standardized. | <ul empty="false" spacing="normal"> | |||
The draft document | <li>This document officially removes SENDPASS for security | |||
is known as | reasons.</li> | |||
<xref target="TheDraft">`The Draft'</xref>. | ||||
</t> | ||||
<t> This Draft was a product of its time, and did not add | ||||
ress all of the | ||||
key security concerns which are | ||||
considered when designing modern | ||||
standards. Deployment must therefore be executed | ||||
with care. These concerns are addressed | ||||
in the | ||||
<xref target="TACACSSecurity">security section</x | ||||
ref>. | ||||
</t> | ||||
<t> | ||||
The primary intent of this informational document | ||||
is to clarify the | ||||
subset of `The Draft' which is common to implemen | ||||
tations supporting | ||||
Device Administration. | ||||
It is intended that all implementations which | ||||
conform to this | ||||
document will conform to `The Draft'. However, it | ||||
is not intended that all | ||||
implementations which conform to 'The Draft' will | ||||
conform to this | ||||
document. The following features from `The Draft' | ||||
have been removed: | ||||
<list> | ||||
<t>This document officially remov | ||||
es SENDPASS for | ||||
security | ||||
reasons.</t> | ||||
<t>The normative description of L | ||||
egacy features | ||||
such as | ||||
ARAP and | ||||
outbound authentication h | ||||
as been removed.</t> | ||||
<t>The Support for forwarding to | ||||
an alternative daemon | ||||
(TAC_PLUS_AUTHEN_STATUS_F | ||||
OLLOW) has been deprecated.</t> | ||||
</list> | ||||
</t> | ||||
<t>The TACACS+ protocol allows for arbitrary | ||||
length and | ||||
content | ||||
authentication | ||||
exchanges, to | ||||
support alternative authentication | ||||
mechanisms. It is extensible to | ||||
provide for site | ||||
customization and | ||||
future development features, and | ||||
it | ||||
uses TCP to | ||||
ensure reliable | ||||
delivery. The protocol | ||||
allows the | ||||
TACACS+ client to | ||||
request | ||||
fine-grained | ||||
access | ||||
control and | ||||
allows | ||||
the server to | ||||
respond to each | ||||
component of that request.</t> | ||||
<t> | <li>The normative description of legacy features such as the Apple | |||
The separation of authentication, authorization a | Remote Access Protocol (ARAP) and outbound authentication has been | |||
nd | removed.</li> | |||
accounting is | <li>The Support for forwarding to an alternative daemon | |||
a | (TAC_PLUS_AUTHEN_STATUS_FOLLOW) has been deprecated.</li> | |||
key element of the design of | </ul> | |||
TACACS+ protocol. Essentially it makes | <t>The TACACS+ protocol allows for arbitrary length and content | |||
TACACS+ a suite of three protocols. | authentication exchanges to support alternative authentication | |||
This document will | mechanisms. It is extensible to provide for site customization and | |||
address each | future development features, and it uses TCP to ensure reliable | |||
one | delivery. The protocol allows the TACACS+ client to request fine-grained | |||
in separate sections. Although TACACS+ defines | access control and allows the server to respond to each component of | |||
all | that request.</t> | |||
three, | <t> | |||
an | The separation of authentication, authorization, and accounting is a | |||
implementation or deployment is not required | key element of the design of TACACS+ protocol. Essentially, it makes | |||
to | TACACS+ a suite of three protocols. This document will address each | |||
employ all three. | one in separate sections. Although TACACS+ defines all three, an | |||
Separating the elements is useful for Device Admi | implementation or deployment is not required to employ all three. | |||
nistration | Separating the elements is useful for the Device Administration use | |||
use case, | case, specifically, for authorization and accounting of individual comman | |||
specifically, for authorization of individual com | ds in a | |||
mands in a | session. Note that there is no provision made at the protocol level | |||
session. | to associate authentication requests with authorization requests. | |||
Note that there is no provision | </t> | |||
made at the protocol level for | ||||
association of an | ||||
authentication to authorization requests. | ||||
</t> | ||||
</section> | </section> | |||
<section anchor="Conventions" numbered="true" toc="default"> | ||||
<name>Conventions</name> | ||||
<t> | ||||
The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", | ||||
"<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | ||||
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", | ||||
"<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | ||||
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are | ||||
to be interpreted as described in BCP 14 <xref target="RFC2119"/> | ||||
<xref target="RFC8174"/> when, and only when, they appear in all capitals, | ||||
as shown here. | ||||
</t> | ||||
<section anchor="Conventions" title="Conventions"> | </section> | |||
<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", | <section anchor="TechnicalDefinitions" numbered="true" toc="default"> | |||
"SHALL | <name>Technical Definitions</name> | |||
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT | <t>This section provides a few basic definitions that are applicable to | |||
RECOMMENDED", | this document.</t> | |||
"MAY", and "OPTIONAL" in this document are to be | <section anchor="Client" numbered="true" toc="default"> | |||
interpreted as | <name>Client</name> | |||
described in BCP 14 [RFC2119] [RFC8174] when, and | <t>The client is any device that initiates TACACS+ protocol requests | |||
only when, they | to mediate access, mainly for the Device Administration use case.</t> | |||
appear in all capitals, as shown here. | </section> | |||
</t> | <section anchor="Server" numbered="true" toc="default"> | |||
</section> | <name>Server</name> | |||
<t>The server receives TACACS+ protocol requests and replies | ||||
according to its business model in accordance with the flows defined | ||||
in this document.</t> | ||||
</section> | ||||
<section anchor="Packet" numbered="true" toc="default"> | ||||
<name>Packet</name> | ||||
<section anchor="TechnicalDefinitions" title="Technical Definitio | <t>All uses of the word packet in this document refer to TACACS+ | |||
ns"> | protocol data units unless explicitly noted otherwise. The informal | |||
<t>This section provides a few basic definitions that are | term "packet" has become an established part of the definition.</t> | |||
applicable | </section> | |||
to this document</t> | <section anchor="Connection" numbered="true" toc="default"> | |||
<section anchor="Client" title="Client"> | <name>Connection</name> | |||
<t>The client is any device which initiates TACAC | <t> | |||
S+ protocol | TACACS+ uses TCP for its transport. TCP Server port 49 is allocated | |||
requests | by IANA for TACACS+ traffic. | |||
to mediate access, mainly for the Device | </t> | |||
Administration use case.</t> | </section> | |||
</section> | <section anchor="Session" numbered="true" toc="default"> | |||
<section anchor="Server" title="Server"> | <name>Session</name> | |||
<t>The server receives TACACS+ protocol requests, | <t> | |||
and | The concept of a session is used | |||
replies | throughout this document. A TACACS+ | |||
according to its business model, in accor | ||||
dance | ||||
with the flows | ||||
defined | ||||
in this document.</t> | ||||
</section> | ||||
<section anchor="Packet" title="Packet"> | ||||
<t>All uses of the word packet in this document r | ||||
efer to | ||||
TACACS+ | ||||
protocol data units unless explicitly not | ||||
ed | ||||
otherwise. The informal | ||||
term "Packet" has become an established p | ||||
art of the definition.</t> | ||||
</section> | ||||
<section anchor="Connection" title="Connection"> | ||||
<t> | ||||
TACACS+ uses TCP for its transport. | ||||
TCP Server port 49 is | ||||
allocated by IANA | ||||
for | ||||
TACACS+ traffic. | ||||
</t> | ||||
</section> | ||||
<section anchor="Session" title="Session"> | ||||
<t> | ||||
The concept of a session is used througho | ||||
ut this | ||||
document. A | ||||
TACACS+ | ||||
session is a single authentication | session is a single authentication | |||
sequence, a single | sequence, a single authorization | |||
authorization | exchange, or a single accounting | |||
exchange, or a single | exchange. | |||
accounting exchange. | </t> | |||
</t> | <t> | |||
<t> | An accounting and authorization | |||
An accounting and authorization session w | session will consist of a single pair | |||
ill consist | of packets (the request and its | |||
of a single | reply). An authentication session may | |||
pair of packets (the request and its | involve an arbitrary number of packets | |||
reply). An authentication | being exchanged. The session is an | |||
session may involve an | operational concept that is maintained | |||
arbitrary number of packets being exchang | between the TACACS+ client and | |||
ed. | server. It does not necessarily | |||
The | correspond to a given user or user | |||
session is an operational concept that is | action. | |||
maintained | </t> | |||
between | </section> | |||
the | <section anchor="TreatmentOfEnumeratedValues" numbered="true" toc="default | |||
TACACS+ client and server. It does not | "> | |||
necessarily correspond to | <name>Treatment of Enumerated Protocol Values</name> | |||
a | <t> | |||
given user or user action. | This document describes various | |||
</t> | enumerated values in the packet header | |||
</section> | and the headers for specific packet | |||
<section anchor="TreatmentOfEnumeratedValues" title="Trea | types. For example, in the | |||
tment of Enumerated Protocol Values"> | authentication start packet type, this | |||
<t> | document defines the action field with | |||
This document describes various enumerate | three values: TAC_PLUS_AUTHEN_LOGIN, | |||
d values in the packet | TAC_PLUS_AUTHEN_CHPASS, and | |||
header | TAC_PLUS_AUTHEN_SENDAUTH. | |||
and the headers for specific packet types | </t> | |||
. For example, in | <t>If the server does not implement one of the defined options in a | |||
the | packet that it receives, or it encounters an option that is not listed | |||
Authentication start packet type, this do | in this document for a header field, then it should respond with an | |||
cument defines the | ERROR and terminate the session. This will allow the client to try a | |||
action | different option. | |||
field with three values TAC_PLUS_AUTHEN_L | </t> | |||
OGIN, | <t> | |||
TAC_PLUS_AUTHEN_CHPASS and TAC_PLUS_AUTHE | ||||
N_SENDAUTH. | ||||
</t> | ||||
<t>If the server does not implement one of the de | ||||
fined options in a | ||||
packet that it receives, or it encounters | ||||
an option that is not | ||||
listed in this | ||||
document for a header field, then it shou | ||||
ld respond | ||||
with an ERROR and terminate the session. | ||||
This | ||||
will allow the client | ||||
to try a different option. | ||||
</t> | ||||
<t> | ||||
If an error occurs but the type of the | If an error occurs but the type of the | |||
incoming packet | incoming packet cannot be determined, | |||
cannot be | a packet with the identical cleartext | |||
determined, a packet | header but with a sequence number | |||
with the | incremented by one and the length set | |||
identical cleartext header | to zero <bcp14>MUST</bcp14> be | |||
but | returned to indicate an error. | |||
with a | </t> | |||
sequence number incremented by one and th | </section> | |||
e | <section anchor="TextEncoding" numbered="true" toc="default"> | |||
length set | <name>Treatment of Text Strings</name> | |||
to | <t>The TACACS+ protocol makes extensive use of text strings. "The | |||
zero | Draft" intended that these strings would be treated as byte arrays | |||
MUST be | where each byte would represent a US-ASCII character. | |||
returned to indicate an | </t> | |||
error. | ||||
</t> | ||||
</section> | ||||
<section anchor="TextEncoding" title="Treatment of Text S | ||||
trings"> | ||||
<t>The TACACS+ protocol makes extensive use of te | ||||
xt strings. | ||||
The | ||||
original draft intended that these string | ||||
s would be treated as | ||||
byte | ||||
arrays where each byte would represent a | ||||
US-ASCII character. | ||||
</t> | ||||
<t>More recently, server implementations have bee | ||||
n extended to | ||||
interwork with external identity services | ||||
, | ||||
and so a more nuanced | ||||
approach is needed. | ||||
Usernames MUST be encoded and handled usi | ||||
ng the | ||||
UsernameCasePreserved Profile specified i | ||||
n | ||||
<xref target="RFC8265">RFC 8265</xref>. T | ||||
he security | ||||
considerations in Section 8 of that RFC a | ||||
pply. | ||||
</t> | ||||
<t>Where specifically mentioned, data fields cont | ||||
ain arrays of | ||||
arbitrary bytes as required for protocol | ||||
processing. These are not | ||||
intended to be made visible through user | ||||
interface to users.</t> | ||||
<t> | ||||
All other text fields in TACACS+ MUST be | ||||
treated as printable byte | ||||
arrays | ||||
of US-ASCII as defined by | ||||
<xref target="RFC0020">RFC 20</xref>. | ||||
The term "printable" used | ||||
here means the fields MUST exclude the | ||||
"Control Characters" defined in section | ||||
5.2 of | ||||
<xref target="RFC0020">RFC 20</xref>. | ||||
</t> | ||||
</section> | <t>More recently, server implementations have been extended to | |||
</section> | interwork with external identity services, and so a more nuanced | |||
<section anchor="TACACSPacketsSessions" title="TACACS+ Packets an | approach is needed. Usernames <bcp14>MUST</bcp14> be encoded and | |||
d Sessions"> | handled using the UsernameCasePreserved Profile specified in <xref | |||
<section anchor="TheTACACSPacketHeader" title="The TACACS | target="RFC8265" format="default"/>. The security | |||
+ Packet Header"> | considerations in <xref target="RFC8265" sectionFormat="of" | |||
<t> | section="8" /> apply. | |||
All TACACS+ packets begin with the follow | </t> | |||
ing | <t>Where specifically mentioned, data fields contain arrays of | |||
12-byte | arbitrary bytes as required for protocol processing. These are not | |||
header. The | intended to be made visible through user interface to users.</t> | |||
header describes the remainder | <t> | |||
of | All other text fields in TACACS+ | |||
the | <bcp14>MUST</bcp14> be treated as | |||
packet: | printable byte arrays of US-ASCII as | |||
</t> | defined by <xref target="RFC0020" | |||
<figure> | format="default"/>. The term | |||
<artwork><![CDATA[ | "printable" used here means the fields | |||
<bcp14>MUST</bcp14> exclude the | ||||
"Control Characters" defined in <xref | ||||
target="RFC0020" sectionFormat="of" | ||||
section="5.2"/>. | ||||
</t> | ||||
</section> | ||||
</section> | ||||
<section anchor="TACACSPacketsSessions" numbered="true" toc="default"> | ||||
<name>TACACS+ Packets and Sessions</name> | ||||
<section anchor="TheTACACSPacketHeader" numbered="true" toc="default"> | ||||
<name>The TACACS+ Packet Header</name> | ||||
<t> | ||||
All TACACS+ packets begin with the | ||||
following 12-byte header. The header | ||||
describes the remainder of the packet: | ||||
</t> | ||||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 | 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
|major | minor | | | | | |major | minor | | | | | |||
|version| version| type | seq_no | flags | | |version| version| type | seq_no | flags | | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| | | | | | |||
| session_id | | | session_id | | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| | | | | | |||
| length | | | length | | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
]]></artwork> | ]]></artwork> | |||
</figure> | <t>The following general rules apply to all TACACS+ packet types: | |||
<t>The | </t> | |||
following general rules apply to all | <ul empty="false" spacing="normal"> | |||
TACACS+ packet | <li> | |||
types: | To signal that any variable-length data fields are unused, the | |||
</t> | corresponding length values are set to zero. Such fields | |||
<t> | <bcp14>MUST</bcp14> be ignored, and treated as if not present. | |||
<list> | </li> | |||
<t> | <li> | |||
- To signal that any vari | The lengths of data and message fields in a packet are specified by | |||
able length data fields are | their corresponding length field (and are not null terminated). | |||
unused, | </li> | |||
the corresponding length | ||||
values are set to zero. Such fields MUST be ignored, | <li> | |||
and treated as if not pre | All length values are unsigned and in network byte order. | |||
sent. | </li> | |||
</t> | </ul> | |||
<t> | ||||
- the lengths of data and | <t> | |||
message fields in a packet are | ||||
specified by their corres | ||||
ponding length fields, (and are not null | ||||
terminated.) | ||||
</t> | ||||
<t> | ||||
- All length values are u | ||||
nsigned and in | ||||
network | ||||
byte | ||||
order. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
major_version | major_version | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
<li> | ||||
<t> | ||||
This is the major TACACS+ version number. | This is the major TACACS+ version number. | |||
</t> | </t> | |||
<t> | </li> | |||
<list> | </ul> | |||
<t> | ||||
<ul empty="true" spacing="normal"> | ||||
<li> | ||||
TAC_PLUS_MAJOR_VER := 0xc | TAC_PLUS_MAJOR_VER := 0xc | |||
</t> | </li> | |||
</list> | </ul> | |||
</t> | <t> | |||
<t> | ||||
minor_version | minor_version | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
The minor TACACS+ version number. | <li> | |||
</t> | <t> | |||
<t> | This is the minor TACACS+ version number. | |||
<list> | </t> | |||
<t> | </li> | |||
<li> | ||||
TAC_PLUS_MINOR_VER_DEFAUL T := 0x0 | TAC_PLUS_MINOR_VER_DEFAUL T := 0x0 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_MINOR_VER_ONE := 0x1 | TAC_PLUS_MINOR_VER_ONE := 0x1 | |||
</t> | </li> | |||
</list> | </ul> | |||
</t> | <t> | |||
<t> | ||||
type | type | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
This is the packet type. Options are: | <li> | |||
</t> | <t> | |||
<t> | This is the packet type. | |||
<list> | </t> | |||
<t> | </li> | |||
<li>Options are: | ||||
</li> | ||||
<li> | ||||
TAC_PLUS_AUTHEN := 0x01 ( Authentication) | TAC_PLUS_AUTHEN := 0x01 ( Authentication) | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHOR := 0x02 ( Authorization) | TAC_PLUS_AUTHOR := 0x02 ( Authorization) | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_ACCT := 0x03 (Ac counting) | TAC_PLUS_ACCT := 0x03 (Ac counting) | |||
</t> | </li> | |||
</list> | </ul> | |||
</t> | <t> | |||
<t> | ||||
seq_no | seq_no | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
This is the sequence number of the curren | <li> | |||
t packet. The first | <t> | |||
packet in a session | This is the sequence number of the current packet. The first packet in | |||
MUST have the | a session <bcp14>MUST</bcp14> have the sequence number 1, and each | |||
sequence | subsequent packet will increment the sequence number by one. TACACS+ | |||
number | clients only send packets containing odd sequence numbers, and TACACS+ | |||
1 | servers only send packets containing even sequence numbers. | |||
and each subsequent | </t> | |||
packet will increment the sequence | </li> | |||
number by | ||||
one. | <li> | |||
TACACS+ Clients only | <t> | |||
send | The sequence number must never wrap, i.e., if the sequence number 2<sup>8 | |||
packets containing odd | </sup>-1 | |||
sequence | is ever reached, that session must terminate and be restarted with a | |||
numbers, | sequence number of 1. | |||
and | </t> | |||
TACACS+ servers only | </li> | |||
send | </ul> | |||
packets | ||||
containing | <t> | |||
even sequence | flags | |||
numbers. | </t> | |||
</t> | <ul empty="true"> | |||
<t> | <li> | |||
The sequence number must never wrap i.e. | <t> | |||
if the | This field contains various bitmapped flags. | |||
sequence number | </t> | |||
2^8-1 | </li> | |||
is | <li> | |||
ever reached, that session | <t> | |||
must terminate and be restarted | The flag bit: | |||
with a | </t> | |||
sequence number | </li> | |||
of 1. | ||||
</t> | <li> | |||
<t> | ||||
flags | <t> | |||
</t> | TAC_PLUS_UNENCRYPTED_FLAG := 0x01 | |||
<t> | </t> | |||
This field contains various bitmapped fla | </li> | |||
gs. | ||||
</t> | <li> | |||
<t> | <t> | |||
The flag bit: | This flag indicates that the sender | |||
</t> | did not obfuscate the body of the | |||
<t> | packet. This option <bcp14>MUST | |||
TAC_PLUS_UNENCRYPTED_FLAG := 0x01 | NOT</bcp14> be used in production. The | |||
</t> | application of this flag will be | |||
<t> | covered in "Security Considerations" | |||
This flag indicates that the sender did n | (<xref target="TACACSSecurity" | |||
ot obfuscate the body of | format="default"/>). | |||
the packet. This option MUST NOT be used | </t> | |||
in production. The application of this flag will be covered in the | </li> | |||
security | <li> | |||
<xref target="TACACSSecurity">section</xr | <t> | |||
ef>. | This flag <bcp14>SHOULD</bcp14> be clear in all | |||
</t> | deployments. Modern network traffic tools support encrypted | |||
<t> | traffic when configured with the shared secret (see "Shared Secre | |||
This flag SHOULD be clear in all deployme | ts" (<xref | |||
nts. Modern | target="SharedSecrets" />)), so obfuscated mode can and | |||
network | <bcp14>SHOULD</bcp14> be used even during test. | |||
traffic tools support | </t> | |||
encrypted traffic when | </li> | |||
configured with | ||||
the | <li> | |||
shared secret (see section | <t> | |||
below), so | The single-connection flag: | |||
obfuscated mode can and SHOULD | </t> | |||
be | </li> | |||
used even during test. | ||||
</t> | <li> | |||
<t> | ||||
The single-connection flag: | <t> | |||
</t> | TAC_PLUS_SINGLE_CONNECT_FLAG := 0x04 | |||
<t> | ||||
TAC_PLUS_SINGLE_CONNECT_FLAG := 0x04 | </t> | |||
</t> | </li> | |||
<t> | <li> | |||
This flag is used to allow a client and s | <t> | |||
erver to | This flag is used to allow a client and server to negotiate | |||
negotiate <xref target="SingleConnectMode | "Single Connection Mode" (<xref target="SingleConnectMode" | |||
">Single | format="default"/>). | |||
Connection Mode</xref>. | </t> | |||
</t> | </li> | |||
<t> | <li> | |||
All other bits MUST be ignored when readi | <t> | |||
ng, and SHOULD be set to | All other bits <bcp14>MUST</bcp14> be ignored when reading, | |||
zero when writing. | and <bcp14>SHOULD</bcp14> be set to zero when writing. | |||
</t> | </t> | |||
<t> | </li> | |||
session_id | </ul> | |||
</t> | <t> | |||
<t> | session_id | |||
The Id for this TACACS+ session. This fie | </t> | |||
ld does not change | <ul empty="true"> | |||
for the | <li> | |||
duration of the TACACS+ | <t> | |||
session. This number MUST be generated by | The Id for this TACACS+ session. This field does not change | |||
a | for the duration of the TACACS+ session. This number | |||
cryptographically strong random number ge | <bcp14>MUST</bcp14> be generated by a cryptographically strong | |||
neration method. Failure | random number generation method. Failure to do so will | |||
to do so will compromise security of the | compromise security of the session. For more details, refer to | |||
session. For more details | <xref target="RFC4086" format="default"/>. | |||
refer to | </t> | |||
<xref target="RFC4086">RFC 4086</xref>. | </li> | |||
</t> | </ul> | |||
<t> | ||||
<t> | ||||
length | length | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
The total length of the packet body (not | <li> <t> | |||
including | The total length of the packet body (not including | |||
the header). | the header). Implementations <bcp14>MUST</bcp14> allow control over | |||
</t> | maximum packet sizes accepted by TACACS+ Servers. | |||
</section> | The recommended maximum packet size is 2<sup>16</sup>. | |||
<section anchor="TheTACACSPacketBody" title="The TACACS+ | ||||
Packet Body"> | </t> | |||
<t> | </li> | |||
The TACACS+ body types are defined in the | </ul> | |||
packet | </section> | |||
header. The | <section anchor="TheTACACSPacketBody" numbered="true" toc="default"> | |||
next | <name>The TACACS+ Packet Body</name> | |||
sections | <t> | |||
of this document will address | The TACACS+ body types are defined in | |||
the contents of the | the packet header. The next sections | |||
different | of this document will address the | |||
TACACS+ | contents of the different TACACS+ | |||
bodies. | bodies. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="SingleConnectMode" title="Single Connect | <section anchor="SingleConnectMode" numbered="true" toc="default"> | |||
ion Mode"> | <name>Single Connection Mode</name> | |||
<t> | <t> | |||
Single Connection Mode is intended to imp | Single Connection Mode is intended to | |||
rove performance where there is a lot of traffic between a client and a server b | improve performance where there is a | |||
y | lot of traffic between a client and a | |||
allowing the client to multiplex multiple | server by allowing the client to | |||
session on a single TCP | multiplex multiple sessions on a | |||
connection. | single TCP connection. | |||
</t> | </t> | |||
<t> | <t> | |||
The packet header contains the TAC_PLUS_S | The packet header contains the | |||
INGLE_CONNECT_FLAG used | TAC_PLUS_SINGLE_CONNECT_FLAG used by | |||
by the client and | the client and server to negotiate the | |||
server to negotiate the use of Single Con | use of Single Connection Mode. | |||
nect | </t> | |||
Mode. | <t> | |||
</t> | The client sets this flag to indicate | |||
<t> | that it supports multiplexing TACACS+ | |||
The client sets this flag, to indicate th | sessions over a single TCP | |||
at it | connection. The client <bcp14>MUST | |||
supports | NOT</bcp14> send a second packet on a | |||
multiplexing TACACS+ sessions over a sing | connection until single-connect status | |||
le | ||||
TCP | ||||
connection. The | ||||
client MUST NOT send a second | ||||
packet on a connection until | ||||
single-connect status | ||||
has been established. | has been established. | |||
</t> | </t> | |||
<t> | <t> | |||
To indicate it will support | To indicate it will support Single | |||
Single Connection Mode, the server | Connection Mode, the server sets this | |||
sets | flag in the first reply packet in | |||
this flag in the first reply packet in re | response to the first request from a | |||
sponse to the first | client. The server may set this flag | |||
request from a client. The server | even if the client does not set it, | |||
may set this flag even if the | but the client may ignore the flag and | |||
client | close the connection after the session | |||
does not set it, but the client | ||||
may ignore the flag and close | ||||
the | ||||
connection after the session | ||||
completes. | completes. | |||
</t> | </t> | |||
<t> | <t> | |||
The flag is only relevant for the first t | The flag is only relevant for the | |||
wo packets | first two packets on a connection, to | |||
on a | allow the client and server to | |||
connection, to allow the client and serve | establish Single Connection Mode. No | |||
r to | provision is made for changing Single | |||
establish Single | Connection Mode after the first two | |||
Connection Mode. No provision is made for | packets; the client and server | |||
changing Single Connection | <bcp14>MUST</bcp14> ignore the flag | |||
Mode after the first two packets: the cli | after the second packet on a | |||
ent and server MUST ignore | connection. | |||
the flag after the second packet on a con | </t> | |||
nection. | <t> | |||
</t> | If Single Connection Mode has not been | |||
<t> | established in the first two packets | |||
If | of a TCP connection, then both the | |||
single Connection Mode has not been | client and the server close the | |||
established in | connection at the end of the first | |||
the | ||||
first two | ||||
packets of a TCP connection, then both th | ||||
e client and the server | ||||
close the connection at the end of the fi | ||||
rst | ||||
session. | session. | |||
</t> | </t> | |||
<t>The client negotiates Single Connection Mode t | <t>The client negotiates Single Connection Mode to improve | |||
o improve | efficiency. The server may refuse to allow Single Connection Mode for | |||
efficiency. The server may refuse to allo | the client. For example, it may not be appropriate to allocate a | |||
w Single Connection Mode | long-lasting TCP connection to a specific client in some deployments. | |||
for the client. For example, it may not b | Even if the server is configured to permit Single Connection Mode for | |||
e appropriate | a specific client, the server may close the connection. For example, a | |||
to allocate a | server <bcp14>MUST</bcp14> be configured to time out a Single | |||
long-lasting TCP connection to a specific | Connection Mode TCP connection after a specific period of inactivity | |||
client in some | to preserve its resources. The client <bcp14>MUST</bcp14> accommodate | |||
deployments. | such closures on a TCP session even after Single Connection Mode has | |||
Even if the server is configured to permi | been established.</t> | |||
t single | <t>The TCP connection underlying the Single Connection Mode will close | |||
Connection Mode | eventually either because of the timeout from the server or from an | |||
for a specific client, the server may clo | intermediate link. If a session is in progress when the client | |||
se the | detects disconnect, then the client should handle it as described in | |||
connection. For | "Session Completion" (<xref target="SessionCompletion" format="default"/ | |||
example: a server MUST be | >). If a session is | |||
configured to time out a | not in progress, then the client will need to detect this and restart | |||
Single Connection | the Single Connection Mode when it initiates the next session. | |||
Mode TCP Connection after | </t> | |||
a specific period of | </section> | |||
inactivity to | <section anchor="SessionCompletion" numbered="true" toc="default"> | |||
preserve its resources. The | <name>Session Completion</name> | |||
client MUST accommodate | ||||
such closures | ||||
on | ||||
a TCP session even after | ||||
Single Connection Mode has | ||||
been | ||||
established.</t> | ||||
<t>The TCP connection underlying the Sing | ||||
le Connection Mode will close eventually, either because of the timeout from the | ||||
server or from an intermediate link. | ||||
If a session is in progress when the clie | ||||
nt detects disconnect then the client should handle it as described in <xref tar | ||||
get="SessionCompletion"/>. | ||||
If a session is not in progress, then the | ||||
client will need to detect this, and restart the single connection mode when th | ||||
e it initiates the next session. | ||||
</t> | ||||
</section> | ||||
<section anchor="SessionCompletion" title="Session Comple | ||||
tion"> | ||||
<t>The REPLY packets defined for the packets type | ||||
s in the sections | ||||
below (Authentication, Authorization and | ||||
Accounting) contain a | ||||
status field. | ||||
The complete set of options for this fiel | ||||
d depend upon | ||||
the packet | ||||
type, but | ||||
all three REPLY packet types define value | ||||
s | ||||
representing | ||||
PASS, ERROR and FAIL, which indicate the | ||||
last packet of | ||||
a | ||||
regular session (one which is not aborted | ||||
).</t> | ||||
<t>The server responds with a PASS or a FAIL to i | ||||
ndicate that the | ||||
processing of the request completed and t | ||||
he client can apply the | ||||
result (PASS or FAIL) to control the exec | ||||
ution of the action which | ||||
prompted the | ||||
request to be sent to the server.</t> | ||||
<t>The server responds with an ERROR to indicate | ||||
that the processing | ||||
of the request did not complete. The clie | ||||
nt cannot apply the | ||||
result and it MUST behave as if the serve | ||||
r could not be connected | ||||
to. For | ||||
example, the client tries alternative met | ||||
hods, if they are | ||||
available, | ||||
such as sending the request to a backup s | ||||
erver, or using | ||||
local | ||||
configuration to determine whether the ac | ||||
tion which prompted | ||||
the | ||||
request should be executed.</t> | ||||
<t> | ||||
Refer to | ||||
<xref target="AbortinganAuthenticationSes | ||||
sion"/> | ||||
on Aborting Authentication Sessions for d | ||||
etails on handling | ||||
additional status options. | ||||
</t> | ||||
<t>When the session is complete, then the TCP con | <t>The REPLY packets defined for the packet types in the sections | |||
nection should be | below (Authentication, Authorization, and Accounting) contain a status | |||
handled as follows, according to whether | field. The complete set of options for this field depend upon the | |||
Single Connection Mode was | packet type, but all three REPLY packet types define values | |||
negotiated:</t> | representing PASS, ERROR, and FAIL, which indicate the last packet of a | |||
<t>If Single Connection Mode was not negotiated, | regular session (one that is not aborted).</t> | |||
then the connection | <t>The server responds with a PASS or a FAIL to indicate that the | |||
should be closed</t> | processing of the request completed and that the client can apply the | |||
<t> | result (PASS or FAIL) to control the execution of the action that | |||
If Single Connection Mode was enabled, th | prompted the request to be sent to the server.</t> | |||
en the connection SHOULD | <t>The server responds with an ERROR to indicate that the processing | |||
be left open (see | of the request did not complete. The client cannot apply the result, | |||
<xref target="SingleConnectMode"/>), but | and it <bcp14>MUST</bcp14> behave as if the server could not be | |||
may still be closed after a timeout period | connected to. For example, the client tries alternative methods, if | |||
to preserve | they are available, such as sending the request to a backup server or | |||
deployment resources. | using local configuration to determine whether the action that | |||
</t> | prompted the request should be executed.</t> | |||
<t> | <t> | |||
If Single Connection Mode was enabled, bu | Refer to "Aborting an Authentication Session" (<xref target="AbortinganAu | |||
t an ERROR occurred due to | thenticationSession" | |||
connection issues (such as an incorrect s | format="default"/>) for details | |||
ecret, see | on handling additional status options. | |||
<xref target="Obfuscation"/>), then any f | </t> | |||
urther new | <t>When the session is complete, the TCP connection should be | |||
sessions MUST NOT be accepted on the | handled as follows, according to whether Single Connection Mode was | |||
connection. | negotiated:</t> | |||
If there are any sessions that have alrea | <ul> | |||
dy been | <li> | |||
established then they | <t>If Single Connection Mode was not negotiated, then the connection | |||
MAY be completed. Once all active session | should be closed.</t> | |||
s are | </li> | |||
completed then the | <li> | |||
connection MUST be closed. | <t> | |||
</t> | ||||
<t>It is recommended that client implementations | ||||
provide robust | ||||
schemes for dealing with servers which ca | ||||
nnot be connected to. | ||||
Options | ||||
include providing a list of servers for r | ||||
edundancy, and an | ||||
option for | ||||
a local fallback configuration if no serv | ||||
ers can be | ||||
reached. Details | ||||
will be implementation specific.</t> | ||||
<t> | ||||
The client should manage connections and | ||||
handle the case of a | ||||
server | ||||
which establishes a connection, but does | ||||
not respond. The | ||||
exact | ||||
behavior is implementation specific. It i | ||||
s recommended that | ||||
the | ||||
client should close the connection after | ||||
a configurable timeout. | ||||
</t> | ||||
</section> | If Single Connection Mode was enabled, | |||
<section anchor="Obfuscation" title="Data Obfuscation"> | then the connection | |||
<bcp14>SHOULD</bcp14> be left open | ||||
(see "Single Connection Mode" (<xref targ | ||||
et="SingleConnectMode" | ||||
format="default"/>)) but may still be | ||||
closed after a timeout period to | ||||
preserve deployment resources. | ||||
</t> | ||||
</li> | ||||
<li> | ||||
<t> | ||||
If Single Connection Mode was enabled, | ||||
but an ERROR occurred due to | ||||
connection issues (such as an | ||||
incorrect secret (see <xref | ||||
target="Obfuscation" | ||||
format="default"/>)), then any further | ||||
new sessions <bcp14>MUST NOT</bcp14> | ||||
be accepted on the connection. If | ||||
there are any sessions that have | ||||
already been established, then they | ||||
<bcp14>MAY</bcp14> be completed. Once | ||||
all active sessions are completed, then | ||||
the connection <bcp14>MUST</bcp14> be | ||||
closed. | ||||
</t> | ||||
</li> | ||||
</ul> | ||||
<t>It is recommended that client implementations provide robust | ||||
schemes for dealing with servers that cannot be connected to. Options | ||||
include providing a list of servers for redundancy and an option for | ||||
a local fallback configuration if no servers can be reached. Details | ||||
will be implementation specific.</t> | ||||
<t> | ||||
The client should manage connections | ||||
and handle the case of a server that | ||||
establishes a connection but does not | ||||
respond. The exact behavior is | ||||
implementation specific. It is | ||||
recommended that the client | ||||
close the connection after a | ||||
configurable timeout. | ||||
</t> | ||||
</section> | ||||
<section anchor="Obfuscation" numbered="true" toc="default"> | ||||
<name>Data Obfuscation</name> | ||||
<t> | ||||
The body of packets may be | ||||
obfuscated. The following sections | ||||
describe the obfuscation method that | ||||
is supported in the protocol. In "The | ||||
Draft", this process was actually | ||||
referred to as Encryption, but the | ||||
algorithm would not meet modern | ||||
standards and so will not be termed | ||||
as encryption in this document. | ||||
</t> | ||||
<t> | ||||
The obfuscation mechanism relies on a | ||||
secret key, a shared secret value that | ||||
is known to both the client and the | ||||
server. The secret keys | ||||
<bcp14>MUST</bcp14> remain secret. | ||||
</t> | ||||
<t>Server implementations <bcp14>MUST</bcp14> allow a unique secret | ||||
key to be associated with each client. It is a site-dependent decision | ||||
as to whether or not the use of separate keys is appropriate. | ||||
</t> | ||||
<t> | ||||
The flag field <bcp14>MUST</bcp14> be configured with | ||||
TAC_PLUS_UNENCRYPTED_FLAG set to 0 so that the packet body is obfuscated by | ||||
XORing it bytewise with a pseudo-random pad: | ||||
</t> | ||||
<ul empty="true"> | ||||
<li> | ||||
<t>ENCRYPTED {data} = data <sup>pseudo_pad</sup> | ||||
</t> | ||||
</li> | ||||
</ul> | ||||
<t>The packet body can then be de-obfuscated by XORing it bytewise | ||||
with a pseudo-random pad. | ||||
</t> | ||||
<ul empty="true"> | ||||
<li> | ||||
<t> | ||||
data = ENCRYPTED {data} <sup>pseudo_pad</ | ||||
sup> | ||||
</t> | ||||
</li> | ||||
</ul> | ||||
<t> | ||||
The pad is generated by concatenating | ||||
a series of MD5 hashes (each 16 bytes | ||||
long) and truncating it to the length | ||||
of the input data. | ||||
<t> | ||||
The body of packets may be obfuscated. Th | ||||
e | ||||
following sections | ||||
describe | ||||
the obfuscation | ||||
method that is supported in the protocol. | ||||
In | ||||
'The Draft' this process was actually ref | ||||
erred to as Encryption, | ||||
but the algorithm would not meet modern s | ||||
tandards, and so will not | ||||
be termed as encryption in this document. | ||||
</t> | ||||
<t> | ||||
The obfuscation mechanism relies on a sec | ||||
ret | ||||
key, a shared secret | ||||
value | ||||
that is known to both the | ||||
client | ||||
and the | ||||
server. | ||||
The secret keys | ||||
MUST remain secret. | ||||
</t> | ||||
<t>Server implementations MUST allow a unique sec | ||||
ret key to be | ||||
associated with each client. It | ||||
is a | ||||
site-dependent decision as to | ||||
whether the | ||||
use of | ||||
separate keys is | ||||
appropriate. | ||||
</t> | ||||
<t> | ||||
The flag field MUST be configured with th | ||||
e following bit as follows: | ||||
</t> | ||||
<t> | ||||
TAC_PLUS_UNENCRYPTED_FLAG = 0x0 | ||||
</t> | ||||
<t> | ||||
So that the packet body is obfuscated by | ||||
XOR-ing it | ||||
byte-wise | ||||
with a pseudo-random pad. | ||||
</t> | ||||
<t> | ||||
ENCRYPTED {data} = data ^ pseudo_pad | ||||
</t> | ||||
<t> | ||||
The packet body can then be de-obfuscated | ||||
by | ||||
XOR-ing it | ||||
byte-wise | ||||
with a pseudo random pad. | ||||
</t> | ||||
<t> | ||||
data = ENCRYPTED {data} ^ pseudo_pad | ||||
</t> | ||||
<t> | ||||
The pad is generated by concatenating a s | ||||
eries of | ||||
MD5 hashes | ||||
(each | ||||
16 bytes long) and truncating it | ||||
to the length of the input | ||||
data. | ||||
</t> | ||||
<t> | ||||
Whenever used in this document, MD5 refer s to | Whenever used in this document, MD5 refer s to | |||
the "RSA Data | the "RSA Data | |||
Security, Inc. MD5 Message-Digest | Security, Inc. MD5 Message-Digest | |||
Algorithm" as specified in | Algorithm" as specified in | |||
<xref target="RFC1321">RFC 1321</xref>. | <xref target="RFC1321" format="default"/> | |||
</t> | . | |||
<t> | </t> | |||
pseudo_pad = {MD5_1 [,MD5_2 [ ... ,MD5_n] | <ul empty="true"> | |||
]} | <li> | |||
truncated to | <t> | |||
len(data) | pseudo_pad = {MD5_1 [,MD5_2 [ | |||
</t> | ... ,MD5_n]]} truncated to len(data) | |||
<t> | </t> | |||
The first MD5 hash is generated by concat | </li> | |||
enating | </ul> | |||
the session_id, | ||||
the secret key, the version | <t> | |||
number and the sequence number and | The first MD5 hash is generated by | |||
then | concatenating the session_id, the | |||
running | secret key, the version number, and the | |||
MD5 over that stream. All of those input | sequence number, and then running MD5 | |||
values | over that stream. All of those input | |||
are | values are available in the packet | |||
available | header, except for the secret | |||
in the packet header, except for | key, which | |||
the secret key which is | is a shared secret between the TACACS+ | |||
a shared | client and server. | |||
secret between | </t> | |||
the TACACS+ client and server. | <t> | |||
</t> | ||||
<t> | ||||
The version number and session_id are ext racted from the | The version number and session_id are ext racted from the | |||
header | header. | |||
</t> | </t> | |||
<t> | <t> | |||
Subsequent hashes are generated by using | Subsequent hashes are generated by | |||
the same | using the same input stream but | |||
input stream, | concatenating the previous hash value | |||
but concatenating the previous hash | at the end of the input stream. | |||
value at the end of the input | </t> | |||
stream. | ||||
</t> | <ul empty="true"> | |||
<t> | <li> | |||
MD5_1 = MD5{session_id, key, version, seq | <t> | |||
_no} | MD5_1 = MD5{session_id, key, version, | |||
MD5_2 = | seq_no} MD5_2 = MD5{session_id, key, | |||
version, seq_no, MD5_1} .... MD5_n = | ||||
MD5{session_id, key, version, seq_no, | MD5{session_id, key, version, seq_no, | |||
MD5_1} | MD5_n-1} | |||
.... | </t> | |||
MD5_n = | </li> | |||
MD5{session_id, key, version, | </ul> | |||
seq_no, MD5_n-1} | ||||
</t> | <t> | |||
<t> | ||||
When a server detects that the secret(s) | When a server detects that the | |||
it has configured for | secrets it has configured for the | |||
the | device do not match, it | |||
device mismatch, it MUST return ERROR. Fo | <bcp14>MUST</bcp14> return ERROR. For | |||
r details of TCP | details of TCP connection handling on | |||
connection handling on ERROR, refer to | ERROR, refer to "Session Completion" (<xr | |||
<xref target="SessionCompletion"/>. | ef | |||
</t> | target="SessionCompletion" | |||
<t> | format="default"/>). | |||
</t> | ||||
<ul empty="true"> | ||||
<li> | ||||
<t> | ||||
TAC_PLUS_UNENCRYPTED_FLAG == 0x1 | TAC_PLUS_UNENCRYPTED_FLAG == 0x1 | |||
</t> | </t> | |||
<t> | </li> | |||
This option is deprecated and MUST NOT be | </ul> | |||
used in production. In this case, the entire packet body is in | <t> | |||
cleartext. A | This option is deprecated and | |||
request MUST be dropped if | <bcp14>MUST NOT</bcp14> be used in | |||
TAC_PLUS_UNENCRYPTED_FLAG is set to true. | production. In this case, the entire | |||
</t> | packet body is in cleartext. A request | |||
<t> | <bcp14>MUST</bcp14> be dropped if | |||
TAC_PLUS_UNENCRYPTED_FLAG is set to | ||||
true. | ||||
</t> | ||||
<t> | ||||
After a packet body is de-obfuscated, the lengths of the | After a packet body is de-obfuscated, the lengths of the | |||
component | component | |||
values | values | |||
in the packet are summed. If the sum is n ot | in the packet are summed. If the sum is n ot | |||
identical to the | identical to the | |||
cleartext | cleartext | |||
datalength value from the header, | datalength value from the header, | |||
the | the | |||
packet MUST be | packet <bcp14>MUST</bcp14> be | |||
discarded, and an ERROR signaled. For det | discarded and an ERROR signaled. For deta | |||
ails of TCP connection | ils of TCP connection | |||
handling on ERROR, refer to | handling on ERROR, refer to | |||
<xref target="SessionCompletion"/>. | "Session Completion" (<xref target="Sessi | |||
</t> | onCompletion" format="default"/>). | |||
<t> | </t> | |||
Commonly | <t> | |||
such failures are seen when the keys are | Commonly, such failures are seen when | |||
mismatched | the keys are mismatched between the | |||
between the client and the TACACS+ server | client and the TACACS+ server. | |||
. | </t> | |||
</t> | ||||
</section> | ||||
</section> | ||||
<section anchor="Authentication" title="Authentication"> | ||||
<t>Authentication is the action of determining who a user | ||||
(or entity) | ||||
is. Authentication can take many forms. | ||||
Traditional authentication | ||||
employs a name and a fixed | ||||
password. However, fixed passwords are | ||||
vulnerable security, so many modern | ||||
authentication mechanisms utilize | ||||
"one-time" passwords | ||||
or a | ||||
challenge-response query. TACACS+ is | ||||
designed to | ||||
support all of | ||||
these, and be flexible enough to | ||||
handle any | ||||
future | ||||
mechanisms. | ||||
Authentication generally | ||||
takes place when the user | ||||
first | ||||
logs in to a | ||||
machine or | ||||
requests a service of it.</t> | ||||
<t>Authentication is not mandatory; it is a site-configur | ||||
ed | ||||
option. | ||||
Some sites do not require it. Others require it | ||||
only for certain | ||||
services (see authorization below). | ||||
Authentication may | ||||
also take | ||||
place | ||||
when a user attempts to | ||||
gain extra privileges, and must | ||||
identify | ||||
himself or | ||||
herself as someone who possesses the required | ||||
information | ||||
(passwords, etc.) for those privileges.</t> | ||||
<section anchor="TheAuthenticationSTARTPacketBody" title= | </section> | |||
"The Authentication START Packet Body"> | </section> | |||
<figure> | <section anchor="Authentication" numbered="true" toc="default"> | |||
<artwork><![CDATA[ | <name>Authentication</name> | |||
<t>Authentication is the action of determining who a user (or entity) | ||||
is. Authentication can take many forms. Traditional authentication | ||||
employs a name and a fixed password. However, fixed passwords are | ||||
vulnerable security, so many modern authentication mechanisms utilize | ||||
"one-time" passwords or a challenge-response query. TACACS+ is designed | ||||
to support all of these and be flexible enough to handle any future | ||||
mechanisms. Authentication generally takes place when the user first | ||||
logs in to a machine or requests a service of it.</t> | ||||
<t>Authentication is not mandatory; it is a site-configured option. | ||||
Some sites do not require it. Others require it only for certain | ||||
services (see "Authorization" (<xref target="Authorization"/>)). Authenti | ||||
cation may also take place | ||||
when a user attempts to gain extra privileges and must identify himself | ||||
or herself as someone who possesses the required information (passwords, | ||||
etc.) for those privileges.</t> | ||||
<section anchor="TheAuthenticationSTARTPacketBody" numbered="true" toc="de | ||||
fault"> | ||||
<name>The Authentication START Packet Body</name> | ||||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 | 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| action | priv_lvl | authen_type | authen_service | | | action | priv_lvl | authen_type | authen_service | | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| user_len | port_len | rem_addr_len | data_len | | | user_len | port_len | rem_addr_len | data_len | | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| user ... | | user ... | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| port ... | | port ... | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| rem_addr ... | | rem_addr ... | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| data... | | data... | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
]]></artwork> | ]]></artwork> | |||
</figure> | <t> | |||
<t> | ||||
Packet fields are as follows: | Packet fields are as follows: | |||
</t> | </t> | |||
<t> | <t> | |||
action | action | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
This indicates the authentication action. | <li> <t> This indicates the authentication action. </t> | |||
Valid | <t> | |||
values | Valid values are: | |||
are listed | </t> | |||
below. | </li> | |||
</t> | <li> | |||
<t> | ||||
<list> | ||||
<t> | ||||
TAC_PLUS_AUTHEN_LOGIN := 0x01 | TAC_PLUS_AUTHEN_LOGIN := 0x01 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_CHPASS := 0x02 | TAC_PLUS_AUTHEN_CHPASS := 0x02 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_SENDAUTH := 0x04 | TAC_PLUS_AUTHEN_SENDAUTH := 0x04 | |||
</t> | </li> | |||
</list> | </ul> | |||
</t> | <t> | |||
<t> | ||||
priv_lvl | priv_lvl | |||
</t> | </t> | |||
<t> | ||||
This indicates the privilege level that t | <ul empty="true"> | |||
he user is | <li> <t> This indicates the privilege level that the user is authenticating | |||
authenticating | as. Please refer to "Privilege Levels" (<xref target="PrivilegeLevel" | |||
as. Please refer to the | format="default"/>). | |||
<xref target="PrivilegeLevel">Privilege L | </t> | |||
evel section</xref> | </li> | |||
below. | </ul> | |||
</t> | ||||
<t> | <t> | |||
authen_type | authen_type | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
The type of authentication. Please see se | <li> | |||
ction | <t> | |||
<xref target="CommonAuthenticationFlows"> | The type of authentication. Please see "Common Authentication Flows" (<xref | |||
Common Authentication Flows</xref>. Valid values | target="CommonAuthenticationFlows" format="default"/>). | |||
are: | </t> | |||
</t> | </li> | |||
<t> | <li> | |||
<list> | <t> | |||
<t> | Valid values are: | |||
</t> | ||||
</li> | ||||
<li> | ||||
TAC_PLUS_AUTHEN_TYPE_ASCI I := 0x01 | TAC_PLUS_AUTHEN_TYPE_ASCI I := 0x01 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_TYPE_PAP := 0x02 | TAC_PLUS_AUTHEN_TYPE_PAP := 0x02 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_TYPE_CHAP := 0x03 | TAC_PLUS_AUTHEN_TYPE_CHAP := 0x03 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_TYPE_MSCH AP := 0x05 | TAC_PLUS_AUTHEN_TYPE_MSCH AP := 0x05 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_TYPE_MSCH APV2 := 0x06 | TAC_PLUS_AUTHEN_TYPE_MSCH APV2 := 0x06 | |||
</t> | </li> | |||
</list> | </ul> | |||
</t> | ||||
<t> | <t> | |||
authen_service | authen_service | |||
</t> | </t> | |||
<t> | ||||
This is the service that is requesting th | <ul empty="true"> | |||
e | <li> | |||
authentication. Valid | <t> | |||
values | This is the service that is requesting | |||
are: | the authentication. | |||
</t> | </t> | |||
<t> | </li> | |||
<list> | <li> | |||
<t> | <t> | |||
Valid values are: | ||||
</t> | ||||
</li> | ||||
<li> | ||||
TAC_PLUS_AUTHEN_SVC_NONE := 0x00 | TAC_PLUS_AUTHEN_SVC_NONE := 0x00 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_SVC_LOGIN := 0x01 | TAC_PLUS_AUTHEN_SVC_LOGIN := 0x01 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_SVC_ENABL E := 0x02 | TAC_PLUS_AUTHEN_SVC_ENABL E := 0x02 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_SVC_PPP : = 0x03 | TAC_PLUS_AUTHEN_SVC_PPP : = 0x03 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_SVC_PT := 0x05 | TAC_PLUS_AUTHEN_SVC_PT := 0x05 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_SVC_RCMD := 0x06 | TAC_PLUS_AUTHEN_SVC_RCMD := 0x06 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_SVC_X25 : = 0x07 | TAC_PLUS_AUTHEN_SVC_X25 : = 0x07 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_SVC_NASI := 0x08 | TAC_PLUS_AUTHEN_SVC_NASI := 0x08 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_SVC_FWPRO XY := 0x09 | TAC_PLUS_AUTHEN_SVC_FWPRO XY := 0x09 | |||
</t> | </li> | |||
</list> | <li> | |||
</t> | <t>The TAC_PLUS_AUTHEN_SVC_NONE option is intended for the | |||
<t>The TAC_PLUS_AUTHEN_SVC_NONE option is intende | authorization application of this field that indicates that no | |||
d for the | authentication was performed by the device.</t> | |||
authorization application of this field t | <t>The TAC_PLUS_AUTHEN_SVC_LOGIN option indicates regular login (as | |||
hat indicates that no | opposed to ENABLE) to a client device.</t> | |||
authentication was performed by the devic | </li> | |||
e.</t> | ||||
<t>The TAC_PLUS_AUTHEN_SVC_LOGIN option indicates | <li> | |||
regular login | <t> | |||
(as | The TAC_PLUS_AUTHEN_SVC_ENABLE option | |||
opposed to ENABLE) to a client device.</t | identifies the ENABLE authen_service, | |||
> | which refers to a service requesting | |||
<t> | authentication in order to grant the | |||
The TAC_PLUS_AUTHEN_SVC_ENABLE option ide | user different privileges. This is | |||
ntifies the ENABLE | comparable to the Unix "su(1)" | |||
authen_service, which refers to a service | command, which substitutes the current | |||
requesting | user's identity with another. An | |||
authentication | authen_service value of NONE is only | |||
in | to be used when none of the other | |||
order | authen_service values are appropriate. | |||
to grant the user different | ENABLE may be requested independently; | |||
privileges. This is comparable | no requirements for previous | |||
to | authentications or authorizations are | |||
the Unix | imposed by the protocol. | |||
"su(1)" | </t> | |||
command, which substitutes the current us | ||||
er's | </li> | |||
identity with another. An authen_service | <li> | |||
value of NONE is only to | <t>Other options are included for legacy/backwards compatibility.</t> | |||
be | </li> | |||
used | </ul> | |||
when none | <t> | |||
of the other authen_service values are | ||||
appropriate. | ||||
ENABLE | ||||
may be requested | ||||
independently, no requirements for previo | ||||
us | ||||
authentications or | ||||
authorizations are imposed by the protoco | ||||
l. | ||||
</t> | ||||
<t>Other options are included for legacy/backward | ||||
s compatibility.</t> | ||||
<t> | ||||
user, user_len | user, user_len | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
The username is | <li> | |||
optional in this | <t> | |||
packet, | The username is optional in this | |||
depending upon the | packet, depending upon the class of | |||
class of | authentication. If it is absent, the | |||
authentication. If it is absent, the clie | client <bcp14>MUST</bcp14> set | |||
nt MUST set user_len to 0. | user_len to 0. If included, the | |||
If included, | user_len indicates the length of the | |||
the user_len indicates the length of the | user field, in bytes. | |||
user field, in | </t> | |||
bytes. | </li> | |||
</t> | </ul> | |||
<t> | <t> | |||
port, port_len | port, port_len | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
The name of the client port on which the | <li> | |||
authentication | <t> | |||
is | The name of the client port on which | |||
taking | the authentication is taking place. | |||
place. | The value of this field is free-format | |||
The value of | text and is client specific. Examples | |||
this | of this argument include "tty10" | |||
field is free format text and is client s | to denote the tenth tty line, and | |||
pecific. | "async10" to denote the tenth async | |||
Examples of this this argument include "t | interface. The client documentation | |||
ty10" to denote the tenth tty line and "async10" to | <bcp14>SHOULD</bcp14> define the | |||
denote the tenth async interface. The client | values and their meanings for this | |||
documentation SHOULD define the values and their meanings for this field. | field. For details of text encoding, | |||
For details of | see "Treatment of Text Strings" (<xref | |||
<xref target="TextEncoding">text encoding | target="TextEncoding" | |||
, see</xref>. | format="default"/>). The port_len indica | |||
port_len indicates the length of the port | tes the | |||
field, in | length of the port field, in bytes. | |||
bytes. | </t> | |||
</t> | </li> | |||
<t> | </ul> | |||
<t> | ||||
rem_addr, rem_addr_len | rem_addr, rem_addr_len | |||
</t> | </t> | |||
<t> | ||||
A string indicating the | <ul empty="true"> | |||
remote | <li> | |||
location from | <t> | |||
which the | A string indicating the remote | |||
user | location from which the user has | |||
has | connected to the client. For details | |||
connected to the client. For details of | of text encoding, see "Treatment of | |||
<xref target="TextEncoding">text encoding | Text Strings" (<xref | |||
, see</xref>. | target="TextEncoding" | |||
</t> | format="default"/>). | |||
<t> When TACACS+ was used for dial-up services, t | </t> | |||
his value contained | ||||
the caller ID</t> | </li> | |||
<t> | <li> | |||
When TACACS+ is used for Device Administr | <t> When TACACS+ was used for dial-up services, this value contained | |||
ation, the user is | the caller ID.</t> | |||
normally connected via a network, and in | </li> | |||
this case the value | <li> | |||
is | <t> | |||
intended to hold a | When TACACS+ is used for Device | |||
network | Administration, the user is normally | |||
address, IPv4 or IPv6. For IPv6 address | connected via a network, and in this | |||
text representation | case, the value is intended to hold a | |||
defined please see | network address, IPv4 or IPv6. For | |||
<xref target="RFC5952">RFC 5952</xref>. | IPv6 address text representation | |||
</t> | defined, please see <xref | |||
<t>This | target="RFC5952" format="default"/>. | |||
field | </t> | |||
is optional | </li> | |||
(since the | <li> | |||
information may not be | <t>This field is optional (since the information may not be | |||
available). | available). The rem_addr_len indicates the length of the user field, | |||
The | in bytes. | |||
rem_addr_len indicates the | </t> | |||
length of the user field, in bytes. | </li> | |||
</t> | </ul> | |||
<t> | <t> | |||
data, data_len | data, data_len | |||
</t> | </t> | |||
<t> | ||||
This field is used to send data appropria | ||||
te for the | ||||
action and | ||||
authen_type. It is described in more | ||||
detail in the section | ||||
<xref target="CommonAuthenticationFlows"> | ||||
Common Authentication flows</xref>. The data_len indicates the length of the dat | ||||
a field, in | ||||
bytes. | ||||
</t> | ||||
</section> | ||||
<section anchor="TheAuthenticationREPLYPacketBody" title= | ||||
"The Authentication REPLY Packet Body"> | ||||
<t> | ||||
The TACACS+ server sends only one type of | ||||
authentication packet | ||||
(a | ||||
REPLY packet) to the client. | ||||
</t> | ||||
<figure> | <ul empty="true"> | |||
<artwork><![CDATA[ | <li> | |||
<t> | ||||
The data field is used to send data appropriate for the action and | ||||
authen_type. It is described in more detail in "Common Authentication | ||||
Flows" (<xref target="CommonAuthenticationFlows" | ||||
format="default"/>). The data_len field indicates the length of the | ||||
data field, in bytes. | ||||
</t> | ||||
</li> | ||||
</ul> | ||||
</section> | ||||
<section anchor="TheAuthenticationREPLYPacketBody" numbered="true" toc="de | ||||
fault"> | ||||
<name>The Authentication REPLY Packet Body</name> | ||||
<t> | ||||
The TACACS+ server sends only one type | ||||
of authentication packet (a REPLY | ||||
packet) to the client. | ||||
</t> | ||||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 | 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| status | flags | server_msg_len | | | status | flags | server_msg_len | | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| data_len | server_msg ... | | data_len | server_msg ... | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| data ... | | data ... | |||
+----------------+----------------+ | +----------------+----------------+ | |||
]]></artwork> | ]]></artwork> | |||
</figure> | <t> | |||
<t> | ||||
status | status | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
The current status of the authentication. | <li> | |||
Valid | <t> | |||
values are: | The current status of the authentication. | |||
</t> | </t> | |||
<t> | </li> | |||
<list> | <li>Valid values are: | |||
<t> | </li> | |||
</ul> | ||||
<ul empty="true" spacing="normal"> | ||||
<li> | ||||
TAC_PLUS_AUTHEN_STATUS_PA SS := 0x01 | TAC_PLUS_AUTHEN_STATUS_PA SS := 0x01 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_STATUS_FA IL := | TAC_PLUS_AUTHEN_STATUS_FA IL := | |||
0x02 | 0x02 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_STATUS_GE TDATA := 0x03 | TAC_PLUS_AUTHEN_STATUS_GE TDATA := 0x03 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_STATUS_GE TUSER := 0x04 | TAC_PLUS_AUTHEN_STATUS_GE TUSER := 0x04 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_STATUS_GE TPASS := 0x05 | TAC_PLUS_AUTHEN_STATUS_GE TPASS := 0x05 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_STATUS_RE START := 0x06 | TAC_PLUS_AUTHEN_STATUS_RE START := 0x06 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_STATUS_ER ROR | TAC_PLUS_AUTHEN_STATUS_ER ROR | |||
:= 0x07 | := 0x07 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_STATUS_FO LLOW := 0x21 | TAC_PLUS_AUTHEN_STATUS_FO LLOW := 0x21 | |||
</t> | </li> | |||
</list> | </ul> | |||
</t> | <t> | |||
<t> | ||||
flags | flags | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
Bitmapped flags that modify the action to | <li> | |||
be taken. | <t> | |||
The | Bitmapped flags that modify the action to be taken. | |||
following | </t> | |||
values are | </li> | |||
defined: | <li>The following values are defined: | |||
</t> | </li> | |||
<t> | </ul> | |||
<list> | <ul empty="true" spacing="normal"> | |||
<t> | <li> | |||
TAC_PLUS_REPLY_FLAG_NOECH O := 0x01 | TAC_PLUS_REPLY_FLAG_NOECH O := 0x01 | |||
</t> | </li> | |||
</list> | </ul> | |||
</t> | <t> | |||
<t> | ||||
server_msg, server_msg_len | server_msg, server_msg_len | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
A message to be displayed to the user. Th | <li> <t> | |||
is field is | A message to be displayed to the user. This field is optional. The | |||
optional. | server_msg_len indicates the length of the server_msg field, in bytes. | |||
The | For details of text encoding, see "Treatment of Text Strings" (<xref targ | |||
server_msg_len | et="TextEncoding" format="default"/>). | |||
indicates the length | </t> | |||
of the | </li> | |||
server_msg field, in bytes. | </ul> | |||
For details of | <t> | |||
<xref target="TextEncoding">text encoding | ||||
, see</xref>. | ||||
</t> | ||||
<t> | ||||
data, data_len | data, data_len | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
This field holds data that is a part of t | <li> | |||
he | <t> | |||
authentication | A field that holds data that is a part of the authentication exchange | |||
exchange | and is intended for client processing, not the user. It is not a | |||
and | printable text encoding. Examples of its use are shown in "Common | |||
is intended for | Authentication Flows" (<xref target="CommonAuthenticationFlows" | |||
client processing, not the user. It is no | format="default"/>). The data_len indicates the length of the data | |||
t a | field, in bytes. | |||
printable text encoding. Examples of its | </t> | |||
use are | </li> | |||
shown | </ul> | |||
in the section | </section> | |||
<xref target="CommonAuthenticationFlows"> | <section anchor="TheAuthenticationCONTINUEPacketBody" numbered="true" toc= | |||
Common Authentication flows</xref>. The data_len indicates the length of the dat | "default"> | |||
a field, in | <name>The Authentication CONTINUE Packet Body</name> | |||
bytes. | ||||
</t> | ||||
</section> | <t> | |||
<section anchor="TheAuthenticationCONTINUEPacketBody" tit | This packet is sent from the client to the server following the | |||
le="The Authentication CONTINUE Packet Body"> | receipt of a REPLY packet. | |||
<t> | </t> | |||
This packet is sent from the client to th | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
e server | ||||
following the | ||||
receipt | ||||
of a REPLY packet. | ||||
</t> | ||||
<figure> | ||||
<artwork><![CDATA[ | ||||
1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 | 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| user_msg len | data_len | | | user_msg len | data_len | | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| flags | user_msg ... | | flags | user_msg ... | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| data ... | | data ... | |||
+----------------+ | +----------------+ | |||
]]></artwork> | ]]></artwork> | |||
</figure> | <t> | |||
<t> | ||||
user_msg, user_msg_len | user_msg, user_msg_len | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
This field is the string that the user en | <li> | |||
tered, or | <t> | |||
the client | A field that is the string that the user entered, or the client | |||
provided | provided on behalf of the user, in response to the server_msg from a | |||
on behalf of the user, in response | REPLY packet. The user_len indicates the length of the user field, in | |||
to the server_msg from | bytes. | |||
a | </t> | |||
REPLY | </li> | |||
packet. The user_len indicates the length | </ul> | |||
of the user | <t> | |||
field, in | ||||
bytes. | ||||
</t> | ||||
<t> | ||||
data, data_len | data, data_len | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
This field carries information that is sp | ||||
ecific to | <li> | |||
the action | <t> | |||
and | This field carries information that is specific to the action and the | |||
the | authen_type for this session. Valid uses of this field are described | |||
authen_type for this session. Valid | below. It is not a printable text encoding. The data_len indicates the | |||
uses of this field are | length of the data field, in bytes. | |||
described below. It is not a printable te | </t> | |||
xt encoding. The data_len | </li> | |||
indicates the length of the data | </ul> | |||
field, in bytes. | ||||
</t> | <t> | |||
<t> | ||||
flags | flags | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
This holds the bitmapped flags that modif | <li> | |||
y the action | <t> | |||
to be | This holds the bitmapped flags that modify the action to be taken. | |||
taken. | </t> | |||
The | </li> | |||
following values are defined: | <li> | |||
</t> | <t> | |||
<t> | The following values are defined: | |||
<list> | </t> | |||
<t> | </li> | |||
<li> | ||||
TAC_PLUS_CONTINUE_FLAG_AB ORT := 0x01 | TAC_PLUS_CONTINUE_FLAG_AB ORT := 0x01 | |||
</t> | </li> | |||
</list> | </ul> | |||
</t> | ||||
</section> | </section> | |||
<section anchor="DescriptionofAuthenticationProcess" titl | <section anchor="DescriptionofAuthenticationProcess" numbered="true" toc=" | |||
e="Description of Authentication Process"> | default"> | |||
<t> | <name>Description of Authentication Process</name> | |||
The action, authen_type and authen_servic | <t> | |||
e fields (described | The action, authen_type, and authen_service fields (described above) | |||
above) | combine to indicate what kind of authentication is to be performed. | |||
combine to indicate what kind of authenti | Every authentication START, REPLY, and CONTINUE packet includes a data | |||
cation is to be | field. The use of this field is dependent upon the kind of | |||
performed. | authentication. | |||
Every authentication START, REPLY and CON | </t> | |||
TINUE packet | <t> | |||
includes a | This document defines a core set of authentication flows to be | |||
data field. The use of this field is depe | supported by TACACS+. Each authentication flow consists of a START | |||
ndent upon the | packet. The server responds either with a request for more | |||
kind of the | information (GETDATA, GETUSER, or GETPASS) or a termination PASS, FAIL, | |||
Authentication. | ERROR, or RESTART. The actions and meanings when the server sends a | |||
</t> | RESTART or ERROR are common and are described further below. | |||
<t> | </t> | |||
This document defines a core set of | <t> | |||
authentication flows to be | When the REPLY status equals TAC_PLUS_AUTHEN_STATUS_GETDATA, | |||
supported by TACACS+. | TAC_PLUS_AUTHEN_STATUS_GETUSER, or TAC_PLUS_AUTHEN_STATUS_GETPASS, | |||
Each authentication flow | authentication continues and the server <bcp14>SHOULD</bcp14> provide | |||
consists of a START | server_msg content for the client to prompt the user for more | |||
packet. | information. The client <bcp14>MUST</bcp14> then return a CONTINUE | |||
The | packet containing the requested information in the user_msg field. | |||
server responds either | </t> | |||
with a request | <t> | |||
for more information | The client should interpret TAC_PLUS_AUTHEN_STATUS_GETUSER as a | |||
(GETDATA, | request for a username and TAC_PLUS_AUTHEN_STATUS_GETPASS as a request | |||
GETUSER | for a password. The TAC_PLUS_AUTHEN_STATUS_GETDATA is the generic | |||
or GETPASS) or a termination | request for more information to flexibly support future requirements. | |||
PASS, FAIL, ERROR or | </t> | |||
RESTART. The | <t>If the information being requested by the server from the client is | |||
actions and | sensitive, then the server should set the TAC_PLUS_REPLY_FLAG_NOECHO | |||
meanings when | flag. When the client queries the user for the information, the | |||
the server sends a | response <bcp14>MUST NOT</bcp14> be reflected in the user interface as | |||
RESTART or | it is entered. | |||
ERROR are | </t> | |||
common | <t> | |||
and are | ||||
described | ||||
further below. | ||||
</t> | ||||
<t> | ||||
When the REPLY status equals | ||||
TAC_PLUS_AUTHEN_STATUS_GETDATA, | ||||
TAC_PLUS_AUTHEN_STATUS_GETUSER or | ||||
TAC_PLUS_AUTHEN_STATUS_GETPASS, | ||||
then authentication | ||||
continues and the server SHOULD provide | ||||
server_msg | ||||
content for | ||||
the | ||||
client to prompt the user for more | ||||
information. The | ||||
client MUST | ||||
then | ||||
return a CONTINUE packet containing | ||||
the requested | ||||
information | ||||
in the | ||||
user_msg field. | ||||
</t> | ||||
<t> | ||||
The client should interpret TAC_PLUS_AUTH | ||||
EN_STATUS_GETUSER as a | ||||
request for username and TAC_PLUS_AUTHEN_ | ||||
STATUS_GETPASS as a | ||||
request for password. | ||||
The TAC_PLUS_AUTHEN_STATUS_GETDATA is | ||||
the | ||||
generic | ||||
request | ||||
for | ||||
more information to flexibly support futu | ||||
re | ||||
requirements. | ||||
</t> | ||||
<t>If the information being requested by the serv | ||||
er form the client | ||||
is sensitive, then the server should set | ||||
the | ||||
TAC_PLUS_REPLY_FLAG_NOECHO flag. | ||||
When the client queries the | ||||
user for | ||||
the information, the response MUST NOT be | ||||
reflected in the user | ||||
interface as it is | ||||
entered. | ||||
</t> | ||||
<t> | ||||
The data field is only used in the REPLY | The data field is only used in the REPLY | |||
where | where | |||
explicitly | explicitly | |||
defined | defined | |||
below. | below. | |||
</t> | </t> | |||
<section anchor="VersionBehaviour" title="Version | <section anchor="VersionBehaviour" numbered="true" toc="default"> | |||
Behavior"> | <name>Version Behavior</name> | |||
<t> | <t> | |||
The TACACS+ protocol is versioned | The TACACS+ protocol is | |||
to allow | versioned to allow revisions | |||
revisions while | while maintaining backwards | |||
maintaining backwards | ||||
compatibility. The version | compatibility. The version | |||
number is in | number is in every packet | |||
every | header. The changes between | |||
packet header. The changes betwee | minor_version 0 and 1 apply | |||
n minor_version | only to the authentication | |||
0 and 1 | process, and all deal with the | |||
apply only | way that Challenge | |||
to the authentication process, | Handshake | |||
and all deal with the | Authentication | |||
way that CHAP | Protocol (CHAP) and | |||
and PAP | Password | |||
authentications are handled. mino | Authentication | |||
r_version | Protocol (PAP) | |||
1 | authentications are | |||
may | handled. minor_version 1 may | |||
only be used | only be used for | |||
for authentication kinds that | authentication kinds that | |||
explicitly call | explicitly call for it in the | |||
for it in the table | table below: | |||
below: | </t> | |||
</t> | ||||
<figure> | <table anchor="table_1"> | |||
<artwork><![CDATA[ | <name>TACACS+ Protocol Versioning</name> | |||
LOGIN CHPASS SENDAUTH | ||||
ASCII v0 v0 - | <tbody> | |||
PAP v1 - v1 | <tr> | |||
CHAP v1 - v1 | <td></td> | |||
MS-CHAPv1/2 v1 - v1 | <td>LOGIN</td> | |||
]]> | <td>CHPASS</td> | |||
</artwork> | <td>SENDAUTH</td> | |||
</figure> | </tr> | |||
<t>The '-' symbol represents that the opt | <tr> | |||
ion is not valid.</t> | <td>ASCII</td> | |||
<t> | <td>v0</td> | |||
All authorization and accounting | <td>v0</td> | |||
and ASCII | <td>-</td> | |||
authentication | </tr> | |||
use | <tr> | |||
minor_version number | <td>PAP</td> | |||
of 0. | <td>v1</td> | |||
</t> | <td>-</td> | |||
<t> | <td>v1</td> | |||
</t> | </tr> | |||
<t> | <tr> | |||
PAP, CHAP and MS-CHAP login use m | <td>CHAP</td> | |||
inor_version 1. | <td>v1</td> | |||
The normal | <td>-</td> | |||
exchange is a single START packet | <td>v1</td> | |||
from the client and a single | </tr> | |||
REPLY from the server. | <tr> | |||
</t> | <td>MS-CHAPv1/2</td> | |||
<t> The removal of | <td>v1</td> | |||
SENDPASS was prompted by security | <td>-</td> | |||
concerns, | <td>v1</td> | |||
and | </tr> | |||
is | </tbody> | |||
no longer | </table> | |||
considered part of the TACACS+ | ||||
protocol. | <t>The '-' symbol represents that the option is not valid.</t> | |||
</t> | ||||
</section> | <t> | |||
<section anchor="CommonAuthenticationFlows" title | All authorization and accounting and ASCII authentication use | |||
="Common Authentication Flows"> | minor_version 0. | |||
<t> | </t> | |||
This section describes common aut | ||||
hentication flows. If the | <t> | |||
server does not implement an opti | PAP, CHAP, and MS-CHAP login use minor_version 1. The normal exchange | |||
on, it MUST respond with | is a single START packet from the client and a single REPLY from the | |||
TAC_PLUS_AUTHEN_STATUS_FAIL. | server. | |||
</t> | </t> | |||
<section anchor="ASCIILogin" title="ASCII | <t> The removal of SENDPASS was prompted by security concerns and | |||
Login"> | is no longer considered part of the TACACS+ protocol. | |||
<figure> | </t> | |||
<artwork><![CDATA[ | </section> | |||
<section anchor="CommonAuthenticationFlows" numbered="true" toc="default | ||||
"> | ||||
<name>Common Authentication Flows</name> | ||||
<t> | ||||
This section describes common authentication flows. If the server does | ||||
not implement an option, it <bcp14>MUST</bcp14> respond with | ||||
TAC_PLUS_AUTHEN_STATUS_FAIL. | ||||
</t> | ||||
<section anchor="ASCIILogin" numbered="true" toc="default"> | ||||
<name>ASCII Login</name> | ||||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
action = TAC_PLUS_AUTHEN_LOGIN | action = TAC_PLUS_AUTHEN_LOGIN | |||
authen_type = TAC_PLUS_AUTHEN_TYPE_ASCII | authen_type = TAC_PLUS_AUTHEN_TYPE_ASCII | |||
minor_version = 0x0 | minor_version = 0x0 | |||
]]> | ]]></artwork> | |||
</artwork> | <t> | |||
</figure> | This is a standard ASCII authentication. The START packet | |||
<t> | <bcp14>MAY</bcp14> contain the username. If the user does not include | |||
This is a standard ASCII | the username, then the server <bcp14>MUST</bcp14> obtain it from the | |||
authentication. The | client with a CONTINUE TAC_PLUS_AUTHEN_STATUS_GETUSER. If the user | |||
START packet MAY | does not provide a username, then the server can send another | |||
contain | TAC_PLUS_AUTHEN_STATUS_GETUSER request, but the server | |||
the username. If the user | <bcp14>MUST</bcp14> limit the number of retries that are permitted; | |||
does not include the username | the recommended limit is three attempts. When the server has the | |||
then the server MUST obta | username, it will obtain the password using a continue with | |||
in it from the client with a CONTINUE | TAC_PLUS_AUTHEN_STATUS_GETPASS. ASCII login uses the user_msg field | |||
TAC_PLUS_AUTHEN_STATUS_GE | for both the username and password. The data fields in both the START | |||
TUSER. If the user does not provide a | and CONTINUE packets are not used for ASCII logins; any content | |||
username then the server | <bcp14>MUST</bcp14> be ignored. The session is composed of a single | |||
can send another | START followed by zero or more pairs of REPLYs and CONTINUEs, followed | |||
TAC_PLUS_AUTHEN_STATUS_GE | by a final REPLY indicating PASS, FAIL, or ERROR. | |||
TUSER request, | </t> | |||
but the server MUST limit | </section> | |||
the number of retries tha | <section anchor="PAPLogin" numbered="true" toc="default"> | |||
t are permitted, | <name>PAP Login</name> | |||
recommended limit is | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
three attempts. When the | ||||
server has the | ||||
username, | ||||
it will obtain | ||||
the password using a cont | ||||
inue with | ||||
TAC_PLUS_AUTHEN_STATUS_GE | ||||
TPASS. | ||||
ASCII login uses the user | ||||
_msg | ||||
field | ||||
for both the username and | ||||
password. The data fields in both | ||||
the | ||||
START and | ||||
CONTINUE packets are not | ||||
used for ASCII logins, any | ||||
content MUST be ignored. | ||||
The session is composed o | ||||
f | ||||
a single START | ||||
followed by zero or more | ||||
pairs of REPLYs | ||||
and | ||||
CONTINUEs, followed by | ||||
a | ||||
final REPLY indicating PA | ||||
SS, FAIL or ERROR. | ||||
</t> | ||||
</section> | ||||
<section anchor="PAPLogin" title="PAP Log | ||||
in"> | ||||
<figure> | ||||
<artwork><![CDATA[ | ||||
action = TAC_PLUS_AUTHEN_LOGIN | action = TAC_PLUS_AUTHEN_LOGIN | |||
authen_type = TAC_PLUS_AUTHEN_TYPE_PAP | authen_type = TAC_PLUS_AUTHEN_TYPE_PAP | |||
minor_version = 0x1 | minor_version = 0x1 | |||
]]> | ]]></artwork> | |||
</artwork> | <t> | |||
</figure> | The entire exchange <bcp14>MUST</bcp14> consist of a single START | |||
<t> | packet and a single REPLY. The START packet <bcp14>MUST</bcp14> | |||
The entire exchange MUST | contain a username and the data field <bcp14>MUST</bcp14> contain the | |||
consist of a single | PAP ASCII password. A PAP authentication only consists of a username | |||
START packet and a | and password <xref target="RFC1334" format="default"/> (Obsolete). The | |||
single REPLY. The START p | REPLY from the server <bcp14>MUST</bcp14> be either a PASS, FAIL, or | |||
acket | ERROR. | |||
MUST contain a username a | </t> | |||
nd the | </section> | |||
data | <section anchor="CHAPlogin" numbered="true" toc="default"> | |||
field MUST | <name>CHAP Login</name> | |||
contain the PAP ASCII pas | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
sword. A PAP | ||||
authentication only | ||||
consists of a username an | ||||
d | ||||
password | ||||
<xref target="RFC1334">RF | ||||
C 1334</xref> | ||||
(Obsolete). The REPLY fro | ||||
m the server MUST be either a | ||||
PASS, FAIL | ||||
or ERROR. | ||||
</t> | ||||
</section> | ||||
<section anchor="CHAPlogin" title="CHAP l | ||||
ogin"> | ||||
<figure> | ||||
<artwork><![CDATA[ | ||||
action = TAC_PLUS_AUTHEN_LOGIN | action = TAC_PLUS_AUTHEN_LOGIN | |||
authen_type = TAC_PLUS_AUTHEN_TYPE_CHAP | authen_type = TAC_PLUS_AUTHEN_TYPE_CHAP | |||
minor_version = 0x1 | minor_version = 0x1 | |||
]]> | ]]></artwork> | |||
</artwork> | <t> | |||
</figure> | The entire exchange <bcp14>MUST</bcp14> consist of a single START | |||
<t> | packet and a single REPLY. The START packet <bcp14>MUST</bcp14> | |||
The entire exchange MUST | contain the username in the user field, and the data field is a | |||
consist of a single | concatenation of the PPP id, the challenge, and the response. | |||
START packet and a | </t> | |||
single REPLY. The START p | <t> | |||
acket | The length of the challenge value can be determined from the length of | |||
MUST contain the | the data field minus the length of the id (always 1 octet) and the | |||
username in the | length of the response field (always 16 octets). | |||
user | </t> | |||
field and | <t> | |||
the data field is a conca | To perform the authentication, the server calculates the PPP hash as defined | |||
tenation of the | in PPP Authentication <xref target="RFC1334" format="default"/> and then | |||
PPP | compares that value with the response. The MD5 algorithm option is always | |||
id, the | used. The REPLY from the server <bcp14>MUST</bcp14> be a PASS, FAIL, or | |||
challenge and the respons | ERROR. | |||
e. | </t> | |||
</t> | <t> | |||
<t> | The selection of the challenge and its length are not an aspect of the | |||
The length of the challen | TACACS+ protocol. However, it is strongly recommended that the | |||
ge value can be | client/endstation interaction be configured with a secure | |||
determined from the | challenge. The TACACS+ server can help by rejecting authentications | |||
length | where the challenge is below a minimum length (minimum recommended is | |||
of the data field minus | 8 bytes). | |||
the length of the id (alw | </t> | |||
ays 1 | </section> | |||
octet) | <section anchor="MS-CHAPv1login" numbered="true" toc="default"> | |||
and | <name>MS-CHAP v1 Login</name> | |||
the | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
length of the response fi | ||||
eld (always 16 octets). | ||||
</t> | ||||
<t> | ||||
To perform the authentica | ||||
tion, the server calculates the PPP hash | ||||
as defined in the PPP | ||||
Authentication | ||||
<xref target="RFC1334">RF | ||||
C 1334</xref> | ||||
and then compares that va | ||||
lue with the response. The MD5 algorithm | ||||
option is always used. | ||||
The REPLY from | ||||
the | ||||
server MUST be a PASS, | ||||
FAIL | ||||
or ERROR. | ||||
</t> | ||||
<t> | ||||
The selection of the chal | ||||
lenge and its | ||||
length | ||||
are not an aspect | ||||
of the TACACS+ protocol. | ||||
However, it is | ||||
strongly | ||||
recommended that | ||||
the client/endstation | ||||
interaction is | ||||
configured | ||||
with a secure | ||||
challenge. The | ||||
TACACS+ server can help b | ||||
y | ||||
rejecting authentications | ||||
where the | ||||
challenge is below a mini | ||||
mum | ||||
length (Minimum recommend | ||||
ed | ||||
is 8 bytes). | ||||
</t> | ||||
</section> | ||||
<section anchor="MS-CHAPv1login" title="M | ||||
S-CHAP v1 login"> | ||||
<figure> | ||||
<artwork><![CDATA[ | ||||
action = TAC_PLUS_AUTHEN_LOGIN | action = TAC_PLUS_AUTHEN_LOGIN | |||
authen_type = TAC_PLUS_AUTHEN_TYPE_MSCHAP | authen_type = TAC_PLUS_AUTHEN_TYPE_MSCHAP | |||
minor_version = 0x1 | minor_version = 0x1 | |||
]]> | ]]></artwork> | |||
</artwork> | <t> | |||
</figure> | The entire exchange <bcp14>MUST</bcp14> consist of a single START packet and a | |||
<t> | single REPLY. The START packet <bcp14>MUST</bcp14> contain the username in the | |||
The entire exchange MUST | user field, and the data field will be a concatenation of the PPP id, the | |||
consist of a single | MS-CHAP challenge, and the MS-CHAP response. | |||
START packet and a | </t> | |||
single REPLY. The START p | <t> | |||
acket | The length of the challenge value can be determined from the length of the | |||
MUST contain the | data field minus the length of the id (always 1 octet) and the length of the | |||
username in the | response field (always 49 octets). | |||
user | </t> | |||
field and | <t> | |||
the data field will be a | To perform the authentication, the server will use a combination of MD4 and | |||
concatenation of the | DES on the user's secret and the challenge, as defined in <xref | |||
PPP | target="RFC2433" format="default"/>, and then compare the | |||
id, | resulting value with the response. The REPLY from the server | |||
the | <bcp14>MUST</bcp14> be a PASS or FAIL. | |||
MS-CHAP challenge and the | </t> | |||
MS-CHAP | <t> | |||
response. | For best practices, please refer to <xref target="RFC2433" | |||
</t> | format="default"/>. The TACACS+ server <bcp14>MUST</bcp14> reject | |||
<t> | authentications where the challenge deviates from 8 bytes as defined | |||
The length of the challen | in the RFC. | |||
ge value can be | </t> | |||
determined from the | </section> | |||
length | <section anchor="MS-CHAPv2login" numbered="true" toc="default"> | |||
of the data field minus | <name>MS-CHAP v2 Login</name> | |||
the length of the id (alw | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
ays 1 | ||||
octet) | ||||
and | ||||
the | ||||
length of the response fi | ||||
eld (always 49 octets). | ||||
</t> | ||||
<t> | ||||
To perform the authentica | ||||
tion, the server will | ||||
use a combination | ||||
of | ||||
MD4 and DES on the user's | ||||
secret and the challenge, | ||||
as | ||||
defined | ||||
in | ||||
<xref target="RFC2433">RF | ||||
C 2433</xref> | ||||
and then compare the resu | ||||
lting value with the | ||||
response. The | ||||
REPLY | ||||
from the server MUST be a | ||||
PASS | ||||
or FAIL. | ||||
</t> | ||||
<t> | ||||
For best practices, pleas | ||||
e refer to | ||||
<xref target="RFC2433">RF | ||||
C 2433</xref>. The | ||||
TACACS+ server MUST rejec | ||||
t authentications where the | ||||
challenge deviates from 8 | ||||
bytes as defined in the RFC. | ||||
</t> | ||||
</section> | ||||
<section anchor="MS-CHAPv2login" title="M | ||||
S-CHAP v2 login"> | ||||
<figure> | ||||
<artwork><![CDATA[ | ||||
action = TAC_PLUS_AUTHEN_LOGIN | action = TAC_PLUS_AUTHEN_LOGIN | |||
authen_type = TAC_PLUS_AUTHEN_TYPE_MSCHAPV2 | authen_type = TAC_PLUS_AUTHEN_TYPE_MSCHAPV2 | |||
minor_version = 0x1 | minor_version = 0x1 | |||
]]> | ]]></artwork> | |||
</artwork> | <t> | |||
</figure> | The entire exchange <bcp14>MUST</bcp14> consist of a single START packet and a | |||
<t> | single REPLY. The START packet <bcp14>MUST</bcp14> contain the username in the | |||
The entire exchange MUST | user field, and the data field will be a concatenation of the PPP id, the | |||
consist of a single | MS-CHAP challenge, and the MS-CHAP response. | |||
START packet and a | </t> | |||
single REPLY. The START p | <t> | |||
acket | The length of the challenge value can be determined from the length of the | |||
MUST contain the | data field minus the length of the id (always 1 octet) and the length of the | |||
username in the | response field (always 49 octets). | |||
user | </t> | |||
field and | <t> | |||
the data field will be a | To perform the authentication, the server will use the algorithm specified | |||
concatenation of the | <xref target="RFC2759" format="default"/> on the user's secret and challenge, | |||
PPP | and then compare the resulting value with the response. The REPLY from the | |||
id, | server <bcp14>MUST</bcp14> be a PASS or FAIL. | |||
the | </t> | |||
MS-CHAP challenge and the | <t> | |||
MS-CHAP | For best practices for MS-CHAP v2, please refer to <xref target="RFC2759" | |||
response. | format="default">RFC2759</xref>. The TACACS+ server <bcp14>MUST</bcp14> reject | |||
</t> | authentications where the challenge deviates from 16 bytes as defined in the | |||
<t> | RFC. | |||
The length of the challen | </t> | |||
ge value can be | </section> | |||
determined from the | <section anchor="EnableRequests" numbered="true" toc="default"> | |||
length | <name>Enable Requests</name> | |||
of the data field minus | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
the length of the id (alw | ||||
ays 1 | ||||
octet) | ||||
and | ||||
the | ||||
length of the response fi | ||||
eld (always 49 octets). | ||||
</t> | ||||
<t> | ||||
To perform the authentica | ||||
tion, the server will | ||||
use the algorithm | ||||
specified | ||||
<xref target="RFC2759">RF | ||||
C 2759</xref> | ||||
on the user's secret and | ||||
challenge | ||||
and then | ||||
compare the resulting | ||||
value with the response. | ||||
The | ||||
REPLY | ||||
from the server MUST be a | ||||
PASS or | ||||
FAIL. | ||||
</t> | ||||
<t> | ||||
For best practices for MS | ||||
-CHAP v2, please refer to | ||||
<xref target="RFC2759">RF | ||||
C2759</xref>. The | ||||
TACACS+ server MUST rejec | ||||
t authentications where the | ||||
challenge deviates from 1 | ||||
6 bytes as defined in the RFC. | ||||
</t> | ||||
</section> | ||||
<section anchor="EnableRequests" title="E | ||||
nable Requests"> | ||||
<figure> | ||||
<artwork><![CDATA[ | ||||
action = TAC_PLUS_AUTHEN_LOGIN | action = TAC_PLUS_AUTHEN_LOGIN | |||
priv_lvl = implementation dependent | priv_lvl = implementation dependent | |||
authen_type = not used | authen_type = not used | |||
service = TAC_PLUS_AUTHEN_SVC_ENABLE | service = TAC_PLUS_AUTHEN_SVC_ENABLE | |||
]]> | ]]></artwork> | |||
</artwork> | <t> | |||
</figure> | This is an "ENABLE" request, used to change the current running | |||
<t> | privilege level of a user. The exchange <bcp14>MAY</bcp14> consist of | |||
This is an ENABLE request | multiple messages while the server collects the information it | |||
, used to change the | requires in order to allow changing the principal's privilege | |||
current running | level. This exchange is very similar to an ASCII login (<xref target="ASC | |||
privilege level of a user | IILogin" | |||
. | format="default"/>). | |||
The exchange MAY | </t> | |||
consist of | <t> | |||
multiple | In order to readily distinguish "ENABLE" requests from other types of request, | |||
messages | the value of the authen_service field <bcp14>MUST</bcp14> be set to | |||
while the server collects | TAC_PLUS_AUTHEN_SVC_ENABLE when requesting an ENABLE. It <bcp14>MUST | |||
the information it | NOT</bcp14> be set to this value when requesting any other operation. | |||
requires in | </t> | |||
order to allow changing t | </section> | |||
he | <section anchor="ASCIIchangepasswordrequest" numbered="true" toc="defa | |||
principal's privilege | ult"> | |||
level. This | <name>ASCII Change Password Request</name> | |||
exchange is | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
very similar to an | ||||
<xref target="ASCIILogin" | ||||
>ASCII login</xref>. | ||||
</t> | ||||
<t> | ||||
In order to readily disti | ||||
nguish enable requests | ||||
from other | ||||
types | ||||
of | ||||
request, the value of the | ||||
authen_service field MUST | ||||
be set to | ||||
TAC_PLUS_AUTHEN_SVC_ENABL | ||||
E when requesting an | ||||
ENABLE. It MUST | ||||
NOT | ||||
be | ||||
set to this value when | ||||
requesting any other oper | ||||
ation. | ||||
</t> | ||||
</section> | ||||
<section anchor="ASCIIchangepasswordreque | ||||
st" title="ASCII change password request"> | ||||
<figure> | ||||
<artwork><![CDATA[ | ||||
action = TAC_PLUS_AUTHEN_CHPASS | action = TAC_PLUS_AUTHEN_CHPASS | |||
authen_type = TAC_PLUS_AUTHEN_TYPE_ASCII | authen_type = TAC_PLUS_AUTHEN_TYPE_ASCII | |||
]]> | ]]></artwork> | |||
</artwork> | <t> | |||
</figure> | This exchange consists of multiple messages while the server collects | |||
<t> | the information it requires in order to change the user's password. It | |||
This exchange consists of | is very similar to an ASCII login. The status value | |||
multiple messages while | TAC_PLUS_AUTHEN_STATUS_GETPASS <bcp14>MUST</bcp14> only be used when | |||
the server | requesting the "new" password. It <bcp14>MAY</bcp14> be sent multiple | |||
collects | times. When requesting the "old" password, the status value | |||
the information it requir | <bcp14>MUST</bcp14> be set to TAC_PLUS_AUTHEN_STATUS_GETDATA. | |||
es in | </t> | |||
order to change the user' | </section> | |||
s | </section> | |||
password. It is very | <section anchor="AbortinganAuthenticationSession" numbered="true" toc="d | |||
similar to an ASCII login | efault"> | |||
. The status value | <name>Aborting an Authentication Session</name> | |||
TAC_PLUS_AUTHEN_STATUS_GE | <t> | |||
TPASS MUST only be used | ||||
when requesting | The client may prematurely terminate a session by setting the | |||
the "new" password. It MA | TAC_PLUS_CONTINUE_FLAG_ABORT flag in the CONTINUE message. If this flag is | |||
Y be | set, the data portion of the message may contain a text explaining the reason | |||
sent multiple times. When | for the abort. This text will be handled by the server according to the | |||
requesting | requirements of the deployment. For details of text encoding, see "Treatment | |||
the "old" | of Text Strings" (<xref target="TextEncoding" format="default"/>). For more | |||
password, the status valu | details about session termination, refer to "Session Completion" (<xref target=" | |||
e MUST be set to | SessionCompletion" | |||
TAC_PLUS_AUTHEN_STATUS_GE | format="default"/>). | |||
TDATA. | ||||
</t> | </t> | |||
</section> | <t> | |||
</section> | In cases of PASS, FAIL, or ERROR, the server can insert a message into | |||
<section anchor="AbortinganAuthenticationSession" | server_msg to be displayed to the user. | |||
title="Aborting an Authentication Session"> | </t> | |||
<t> | <t> | |||
The client may prematurely termin | "The Draft" <xref target="THE-DRAFT" format="default"></xref> | |||
ate a session by | defined a mechanism to direct authentication requests to an | |||
setting the | alternative server. This mechanism is regarded as insecure, is | |||
TAC_PLUS_CONTINUE_FLAG_ABORT flag | deprecated, and is not covered here. The client should treat | |||
in | TAC_PLUS_AUTHEN_STATUS_FOLLOW as TAC_PLUS_AUTHEN_STATUS_FAIL. | |||
the | </t> | |||
CONTINUE message. If | <t> | |||
this | If the status equals TAC_PLUS_AUTHEN_STATUS_ERROR, then the host is | |||
flag is set, the data | indicating that it is experiencing an unrecoverable error and the | |||
portion of the message may contai | authentication will proceed as if that host could not be contacted. | |||
n a | The data field may contain a message to be printed on an | |||
message | administrative console or log. | |||
explaining the reason for the abo | </t> | |||
rt. For details of | <t> | |||
<xref target="TextEncoding">text | If the status equals TAC_PLUS_AUTHEN_STATUS_RESTART, then the | |||
encoding, see</xref>. This information will | authentication sequence is restarted with a new START packet from the | |||
be handled by the server | client, with a new session Id and seq_no set to 1. This REPLY packet | |||
according to the | indicates that the current authen_type value (as specified in the | |||
requirements of the | START packet) is not acceptable for this session. The client may try | |||
deployment. The | an alternative authen_type. | |||
session is | </t> | |||
terminated, for more | <t> | |||
details about | If a client does not implement the TAC_PLUS_AUTHEN_STATUS_RESTART option, | |||
session termination, refer to | then it <bcp14>MUST</bcp14> process the response as if the status was | |||
<xref target="SessionCompletion"/ | TAC_PLUS_AUTHEN_STATUS_FAIL. | |||
>. | </t> | |||
</t> | </section> | |||
<t> | </section> | |||
In cases of PASS, FAIL or ERROR, | </section> | |||
the server can insert a | ||||
message | <section anchor="Authorization" numbered="true" toc="default"> | |||
into | <name>Authorization</name> | |||
server_msg to be displayed to the | <t>In the TACACS+ protocol, authorization is the action of determining | |||
user. | what a user is allowed to do. Generally, authentication precedes | |||
</t> | authorization, though it is not mandatory that a client use the same | |||
<t> | service for authentication that it will use for authorization. An | |||
The Draft | authorization request may indicate that the user is not authenticated | |||
<xref target="TheDraft">`The Draf | (we don't know who they are). In this case, it is up to the server to | |||
t'</xref> | determine, according to its configuration, if an unauthenticated user is | |||
defined a mechanism to direct aut | allowed the services in question.</t> | |||
hentication requests | <t> | |||
to an | Authorization does not merely provide yes or no answers, but it may also | |||
alternative server. This mechanis | customize the service for the particular user. A common use of authorization | |||
m is regarded as insecure, is | is to provision a shell session when a user first logs into a device to | |||
deprecated, and not covered here. | administer it. The TACACS+ server might respond to the request by allowing the | |||
The client should treat | service, but placing a time restriction on the login shell. For a list of | |||
TAC_PLUS_AUTHEN_STATUS_FOLLOW as | common arguments used in authorization, see "Authorization Arguments" (<xref | |||
TAC_PLUS_AUTHEN_STATUS_FAIL | target="AuthorizationAttributes" format="default"></xref>). | |||
</t> | </t> | |||
<t> | <t> | |||
If the status equals | In the TACACS+ protocol, an authorization is always a single pair of messages: | |||
TAC_PLUS_AUTHEN_STATUS_ERROR, the | a REQUEST from the client followed by a REPLY from the server. | |||
n the | </t> | |||
host | <t> | |||
is | The authorization REQUEST message contains a fixed set of fields that indicate | |||
indicating that it is experiencin | how the user was authenticated and a variable set of arguments that describe | |||
g an | the services and options for which authorization is requested. | |||
unrecoverable error | </t> | |||
and | <t> | |||
the | The REPLY contains a variable set of response arguments (argument-value pairs) | |||
authentication will | that can restrict or modify the client's actions. | |||
proceed as if that host could not | </t> | |||
be | ||||
contacted. | <section anchor="TheAuthorizationREQUESTPacketBody" numbered="true" toc="d | |||
The data field may contain a mess | efault"> | |||
age to be | <name>The Authorization REQUEST Packet Body</name> | |||
printed on | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
an | ||||
administrative console or log. | ||||
</t> | ||||
<t> | ||||
If the status equals | ||||
TAC_PLUS_AUTHEN_STATUS_RESTART, t | ||||
hen the | ||||
authentication sequence is restar | ||||
ted with | ||||
a new START | ||||
packet | ||||
from the | ||||
client, with new session Id, and | ||||
seq_no set to 1. This REPLY | ||||
packet indicates that the | ||||
current | ||||
authen_type | ||||
value (as specified in | ||||
the START packet) is | ||||
not | ||||
acceptable for this | ||||
session. The client may | ||||
try an alternative authen_type. | ||||
</t> | ||||
<t> | ||||
If a client does not implement TA | ||||
C_PLUS_AUTHEN_STATUS_RESTART | ||||
option, then it MUST process the | ||||
response as if the status was | ||||
TAC_PLUS_AUTHEN_STATUS_FAIL. | ||||
</t> | ||||
</section> | ||||
</section> | ||||
</section> | ||||
<section anchor="Authorization" title="Authorization"> | ||||
<t>In the TACACS+ Protocol, authorization is the action o | ||||
f | ||||
determining what a user is allowed to | ||||
do. Generally, | ||||
authentication | ||||
precedes authorization, though it is not mandator | ||||
y that a client use | ||||
the same service for authentication that it will | ||||
use for | ||||
authorization. An authorization request may indic | ||||
ate | ||||
that the user | ||||
is | ||||
not authenticated (we don't know who | ||||
they are). In | ||||
this case it | ||||
is | ||||
up to | ||||
the server | ||||
to determine, according to its configuration, if | ||||
an | ||||
unauthenticated | ||||
user | ||||
is allowed | ||||
the services in question.</t> | ||||
<t> | ||||
Authorization does not merely provide yes or | ||||
no answers, | ||||
but it may | ||||
also customize the service for the | ||||
particular user. | ||||
A common use of | ||||
authorization is to provision a shell session whe | ||||
n a user | ||||
first logs | ||||
into a device to administer it. The | ||||
TACACS+ | ||||
server might respond to | ||||
the request by allowing the | ||||
service, but placing a time restriction | ||||
on the login | ||||
shell. For a list of common | ||||
arguments used in | ||||
authorization, see | ||||
the | ||||
<xref target="AuthorizationAttributes">Authorizat | ||||
ion Arguments section</xref>. | ||||
</t> | ||||
<t> | ||||
In the TACACS+ protocol an | ||||
authorization is always a | ||||
single pair of | ||||
messages: a REQUEST from the client | ||||
followed by a REPLY from the | ||||
server. | ||||
</t> | ||||
<t> | ||||
The authorization REQUEST message contains a fixe | ||||
d set of | ||||
fields | ||||
that | ||||
indicate how the user was authenticated and a | ||||
variable | ||||
set | ||||
of | ||||
arguments that describe the | ||||
services and options for | ||||
which | ||||
authorization is requested. | ||||
</t> | ||||
<t> | ||||
The REPLY contains a variable set of response | ||||
arguments | ||||
(argument-value pairs) that can restrict or | ||||
modify the | ||||
client's | ||||
actions. | ||||
</t> | ||||
<section anchor="TheAuthorizationREQUESTPacketBody" title | ||||
="The Authorization REQUEST Packet Body"> | ||||
<figure> | ||||
<artwork><![CDATA[ | ||||
1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 | 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| authen_method | priv_lvl | authen_type | authen_service | | | authen_method | priv_lvl | authen_type | authen_service | | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| user_len | port_len | rem_addr_len | arg_cnt | | | user_len | port_len | rem_addr_len | arg_cnt | | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| arg_1_len | arg_2_len | ... | arg_N_len | | | arg_1_len | arg_2_len | ... | arg_N_len | | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| user ... | | user ... | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
skipping to change at line 1977 ¶ | skipping to change at line 1678 ¶ | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| arg_1 ... | | arg_1 ... | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| arg_2 ... | | arg_2 ... | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| ... | | ... | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| arg_N ... | | arg_N ... | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
]]></artwork> | ]]></artwork> | |||
</figure> | <t> | |||
<t> | ||||
authen_method | authen_method | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
This filed allows the | <li> | |||
client to indicate the authentication met | ||||
hod used by the | <t> | |||
acquire | This field allows the client to indicate the authentication method used to | |||
the user information. | acquire user information. | |||
</t> | </t> | |||
<t> | </li> | |||
<list> | <li> | |||
<t> | ||||
TAC_PLUS_AUTHEN_METH_NOT_ SET := 0x00 | TAC_PLUS_AUTHEN_METH_NOT_ SET := 0x00 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_METH_NONE := | TAC_PLUS_AUTHEN_METH_NONE := | |||
0x01 | 0x01 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_METH_KRB5 := 0x02 | TAC_PLUS_AUTHEN_METH_KRB5 := 0x02 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_METH_LINE := | TAC_PLUS_AUTHEN_METH_LINE := | |||
0x03 | 0x03 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_METH_ENAB LE := 0x04 | TAC_PLUS_AUTHEN_METH_ENAB LE := 0x04 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_METH_LOCA L | TAC_PLUS_AUTHEN_METH_LOCA L | |||
:= 0x05 | := 0x05 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_METH_TACA CSPLUS := 0x06 | TAC_PLUS_AUTHEN_METH_TACA CSPLUS := 0x06 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_METH_GUES T := 0x08 | TAC_PLUS_AUTHEN_METH_GUES T := 0x08 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_METH_RADI US := | TAC_PLUS_AUTHEN_METH_RADI US := | |||
0x10 | 0x10 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_METH_KRB4 := 0x11 | TAC_PLUS_AUTHEN_METH_KRB4 := 0x11 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_AUTHEN_METH_RCMD := | TAC_PLUS_AUTHEN_METH_RCMD := | |||
0x20 | 0x20 | |||
</t> | </li> | |||
</list> | ||||
</t> | <li> | |||
<t> As this information is not always | ||||
subject to | <t> As this information is not always subject to verification, it <bcp14 | |||
verification, it is recommended that this | >MUST | |||
field is | NOT</bcp14> be used in policy evaluation. LINE refers to a | |||
in policy evaluastion. | fixed password associated with the terminal line used to gain access. | |||
LINE | LOCAL is a client local user database. ENABLE is a command that | |||
refers to a | authenticates in order to grant new privileges. TACACSPLUS is, of | |||
fixed | course, TACACS+. GUEST is an unqualified guest authentication. RADIUS | |||
password associated with the terminal lin | is the RADIUS authentication protocol. RCMD refers to authentication | |||
e | provided via the R-command protocols from Berkeley Unix. | |||
used to gain access. | ||||
LOCAL | KRB5 <xref | |||
is a | target="RFC4120"/> and KRB4 <xref target="KERB"/> | |||
client local user | are Kerberos versions 5 and 4.</t> | |||
database. ENABLE is a command that | ||||
authenticates | </li> | |||
in | <li> <t> As mentioned above, this field is used by the client to indicate how | |||
order to grant new privileges. TACACSPLUS | it performed the authentication. One of the options | |||
is, of | (TAC_PLUS_AUTHEN_METH_TACACSPLUS := 0x06) is TACACS+ itself, and so the detail | |||
course, | of how the client performed this option is given in "Authentication" (<xref | |||
TACACS+. | target="Authentication" format="default"></xref>). For all other options, | |||
GUEST is an unqualified guest | such as KRB and RADIUS, the TACACS+ protocol did not play any part in the | |||
authentication. RADIUS | authentication phase; as those interactions were not conducted using the | |||
is | TACACS+ protocol, they will not be documented here. For implementers of | |||
the Radius authentication | clients who need details of the other protocols, please refer to the | |||
protocol. | respective Kerberos <xref target="RFC4120" format="default"></xref> and RADIUS | |||
RCMD | <xref target="RFC3579" format="default"></xref> RFCs. </t></li> | |||
refers to | </ul> | |||
authentication | <t> | |||
provided via the R-command | ||||
protocols | ||||
from | ||||
Berkeley | ||||
Unix. KRB5 and KRB4 are Kerberos version | ||||
5 and 4. | ||||
</t> | ||||
<t> | ||||
As mentioned above, this field is used | ||||
by the client to indicate how it performe | ||||
d the authentication. One of the | ||||
options (TAC_PLUS_AUTHEN_METH_TACACSPLUS | ||||
:= 0x06) | ||||
is TACACS+ itself, and so the detail of h | ||||
ow the client performed this | ||||
option is given in | ||||
<xref target="Authentication">Authenticat | ||||
ion Section</xref>. | ||||
For all other options, such as KRB and RA | ||||
DIUS, then | ||||
TACACS+ protocol did not play any part in | ||||
the authentication phase; as those interactions were not conducted using | ||||
the TACACS+ protocol they will not be doc | ||||
umented here. For | ||||
implementers of clients who need details | ||||
of the other protocols, please | ||||
refer to the respective <xref target="RFC | ||||
4120">Kerberos</xref> and <xref target="RFC3579">RADIUS</xref> RFCs. | ||||
</t> | ||||
<t> | ||||
priv_lvl | priv_lvl | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
This field is used in the same way as the | <li> | |||
priv_lvl field in | <t> | |||
authentication request and | This field is used in the same way as the priv_lvl field in authentication | |||
is described in the | request and is described in "Privilege Levels" (<xref target="PrivilegeLevel" | |||
<xref target="PrivilegeLevel">Privilege L | format="default"></xref>). It indicates the user's | |||
evel section</xref> | current privilege level. | |||
below. It indicates the users current pri | </t> | |||
vilege | </li> | |||
level. | </ul> | |||
</t> | <t> | |||
<t> | ||||
authen_type | authen_type | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
This field corresponds to the authen_type | ||||
field in the | <li> <t> This field corresponds to the authen_type field in "Authentication" (<x | |||
<xref target="Authentication">authenticat | ref | |||
ion section</xref> | target="Authentication" format="default"></xref>). It indicates | |||
above. It indicates the type of authentic | the type of authentication that was performed. If this information is not | |||
ation that | available, then the client will set authen_type to | |||
was | TAC_PLUS_AUTHEN_TYPE_NOT_SET := 0x00. This value is valid only in | |||
performed. If | authorization and accounting requests. | |||
this information is not available, then t | </t> | |||
he client will | </li> | |||
set | </ul> | |||
authen_type to: TAC_PLUS_AUTHEN_TYPE_NOT_ | <t> | |||
SET := 0x00. This | ||||
value is | ||||
valid only in authorization and accountin | ||||
g requests. | ||||
</t> | ||||
<t> | ||||
authen_service | authen_service | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
This field is the same as the authen_serv | <li> | |||
ice field in the | <t> | |||
<xref target="Authentication">authenticat | This field is the same as the authen_service field in "Authentication" (<xref | |||
ion section</xref> | target="Authentication" format="default"></xref>). It indicates | |||
above. It indicates the service through w | the service through which the user authenticated. | |||
hich the | </t> | |||
user | </li> | |||
authenticated. | </ul> | |||
</t> | ||||
<t> | <t> | |||
user, user_len | user, user_len | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
This field contains the user's account na | <li> | |||
me. The user_len MUST | <t> | |||
indicate the length of the user field, in | This field contains the user's account name. The user_len <bcp14>MUST</bcp14> | |||
bytes. | indicate the length of the user field, in bytes. | |||
</t> | </t> | |||
<t> | </li> | |||
</ul> | ||||
<t> | ||||
port, port_len | port, port_len | |||
</t> | </t> | |||
<t> | ||||
This field matches the port field in the | <ul empty="true"> | |||
<xref target="Authentication">authenticat | <li> | |||
ion section</xref> | <t> | |||
above. The port_len indicates the length | This field matches the port field in "Authentication" (<xref | |||
of the port field, in | target="Authentication" format="default"></xref>). The port_len | |||
bytes. | indicates the length of the port field, in bytes. | |||
</t> | </t> | |||
<t> | </li> | |||
</ul> | ||||
<t> | ||||
rem_addr, rem_addr_len | rem_addr, rem_addr_len | |||
</t> | </t> | |||
<t> | ||||
This field matches the rem_addr field in | <ul empty="true"> | |||
the | <li> | |||
<xref target="Authentication">authenticat | <t> | |||
ion section</xref> | This field matches the rem_addr field in "Authentication" (<xref target=" | |||
above. The rem_addr_len indicates the len | Authentication" | |||
gth of the port field, | format="default"></xref>). The rem_addr_len indicates the | |||
in | length of the port field, in bytes. | |||
bytes. | </t> | |||
</t> | </li> | |||
<t> | </ul> | |||
<t> | ||||
arg_cnt | arg_cnt | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
The number of authorization arguments to | <li> | |||
follow | <t> | |||
</t> | This represents the number of authorizati | |||
<t> | on arguments to follow. | |||
</t> | ||||
</li> | ||||
</ul> | ||||
<t> | ||||
arg_1 ... arg_N, arg_1_len .... arg_N_len | arg_1 ... arg_N, arg_1_len .... arg_N_len | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
The arguments are the primary elements of | <li> | |||
the authorization | ||||
interaction. In the request packet, they | <t> | |||
describe the specifics of | These arguments are the primary elements of the authorization | |||
the authorization that is being requested | interaction. In the request packet, they describe the specifics of the | |||
. | authorization that is being requested. Each argument is encoded in | |||
Each argument is encoded | the packet as a single arg field (arg_1... arg_N) with a | |||
in the packet as a single | corresponding length field (which indicates the length of each | |||
arg field (arg_1... | argument in bytes). | |||
arg_N) with a | </t> | |||
corresponding length fields | </li> | |||
(which | ||||
indicates the length | <li> <t> | |||
of each | The authorization arguments in both the REQUEST and the REPLY are | |||
argument in bytes). | argument-value pairs. The argument and the value are in a single | |||
</t> | string and are separated by either a "=" (0X3D) or a "*" (0X2A). The | |||
<t> | equals sign indicates a mandatory argument. The asterisk indicates an | |||
The authorization arguments in both the R | optional one. For details of text encoding, see "Treatment of Text String | |||
EQUEST and | s" (<xref target="TextEncoding" | |||
the REPLY | format="default"/>). | |||
are | </t> | |||
argument-value pairs. The argument | </li> | |||
and the value are in a | <li> | |||
single | ||||
string and are | <t> | |||
separated by either a "=" (0X3D) | An argument name <bcp14>MUST NOT</bcp14> contain either of the | |||
or a | separators. An argument value <bcp14>MAY</bcp14> contain the | |||
"*" | separators. This means that the arguments must be parsed until the | |||
(0X2A). The | first separator is encountered; all characters in the argument, after | |||
equals sign indicates a mandatory argumen | this separator, are interpreted as the argument value. | |||
t. The | </t> | |||
asterisk | </li> | |||
indicates an | <li> | |||
optional one. For details of | <t> | |||
<xref target="TextEncoding">text encoding | Optional arguments are ones that may be disregarded by either client | |||
, see</xref>. | or server. Mandatory arguments require that the receiving side can | |||
</t> | handle the argument, that is, its implementation and configuration | |||
<t> | includes the details of how to act on it. If the client receives a | |||
An argument name MUST NOT contain either | mandatory argument that it cannot handle, it <bcp14>MUST</bcp14> | |||
of the | consider the authorization to have failed. The value part of an | |||
separators. An | argument-value pair may be empty, that is, the length of the value may | |||
argument value MAY contain the | be zero. | |||
separators. This means that the | </t> | |||
arguments must be parsed until the | </li> | |||
first separator is encountered, | <li> | |||
all characters in the argument, | <t> | |||
after this separator, are | Argument-value strings are not NULL terminated; rather, their length | |||
interpreted as the argument value. | value indicates their end. The maximum length of an argument-value | |||
</t> | string is 255 characters. The minimum is two characters (one | |||
<t> | name-value character and the separator). | |||
Optional arguments are ones that may be d | </t> | |||
isregarded | </li> | |||
by either | <li> | |||
client or | <t> | |||
server. Mandatory arguments | Though the arguments allow extensibility, a common core set of authorization | |||
require that the receiving | arguments <bcp14>SHOULD</bcp14> be supported by clients and servers; these are | |||
side | listed in "Authorization Arguments" (<xref target="AuthorizationAttributes" | |||
can handle the argument, that is: its imp | format="default"></xref>). | |||
lementation and | </t> | |||
configuration includes the details of how | </li> | |||
to act on it. If the | </ul> | |||
client | </section> | |||
receives | <section anchor="TheAuthorizationREPLYPacketBody" numbered="true" toc="def | |||
a mandatory argument that it cannot handl | ault"> | |||
e, it | <name>The Authorization REPLY Packet Body</name> | |||
MUST | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
consider the authorization to | ||||
have failed. The value part of an | ||||
argument-value pair may be empty, that is | ||||
: the length of the value | ||||
may be zero. | ||||
</t> | ||||
<t> | ||||
Argument-value strings are not NULL termi | ||||
nated, | ||||
rather their | ||||
length value | ||||
indicates their end. The | ||||
maximum length of an | ||||
argument-value | ||||
string is 255 | ||||
characters. The minimum is two | ||||
characters (one name-value character and | ||||
the separator) | ||||
</t> | ||||
<t> | ||||
Though the arguments allow extensibility, | ||||
a common core set of | ||||
authorization arguments SHOULD be support | ||||
ed by clients and | ||||
servers, these are listed in the | ||||
<xref target="AuthorizationAttributes">Au | ||||
thorization Arguments</xref> | ||||
section below. | ||||
</t> | ||||
</section> | ||||
<section anchor="TheAuthorizationREPLYPacketBody" title=" | ||||
The Authorization REPLY Packet Body"> | ||||
<figure> | ||||
<artwork><![CDATA[ | ||||
1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 | 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| status | arg_cnt | server_msg len | | | status | arg_cnt | server_msg len | | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
+ data_len | arg_1_len | arg_2_len | | + data_len | arg_1_len | arg_2_len | | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| ... | arg_N_len | server_msg ... | | ... | arg_N_len | server_msg ... | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| data ... | | data ... | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| arg_1 ... | | arg_1 ... | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| arg_2 ... | | arg_2 ... | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| ... | | ... | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| arg_N ... | | arg_N ... | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
]]></artwork> | ]]></artwork> | |||
</figure> | <t> | |||
<t> | ||||
status This field indicates the authoriza | status | |||
tion status | </t> | |||
</t> | <ul empty="true" spacing="normal"> | |||
<t> | ||||
<list> | ||||
<t> | ||||
TAC_PLUS_AUTHOR_STATUS_PA | ||||
SS_ADD := 0x01 | ||||
</t> | ||||
<t> | ||||
TAC_PLUS_AUTHOR_STATUS_PA | ||||
SS_REPL := 0x02 | ||||
</t> | ||||
<t> | ||||
TAC_PLUS_AUTHOR_STATUS_FA | ||||
IL := 0x10 | ||||
</t> | ||||
<t> | ||||
TAC_PLUS_AUTHOR_STATUS_ER | ||||
ROR := | ||||
0x11 | ||||
</t> | ||||
<t> | ||||
TAC_PLUS_AUTHOR_STATUS_FO | ||||
LLOW := 0x21 | ||||
</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
server_msg, server_msg_len | <li> | |||
</t> | <t>This field indicates the authorization status. | |||
<t> | </t> | |||
This is a string that may be presented to | </li> | |||
the | <li> | |||
user. The | <t>TAC_PLUS_AUTHOR_STATUS_PASS_ADD := 0x01</t> | |||
server_msg_len indicates the length of th | <t indent="4"> If the status equals | |||
e server_msg | TAC_PLUS_AUTHOR_STATUS_PASS_ADD, then the arguments specified | |||
field, in | in the request are authorized and the arguments in the | |||
bytes. For details of | response <bcp14>MUST</bcp14> be applied according to the rules | |||
<xref target="TextEncoding">text encoding | described above. | |||
, see</xref>. | </t> | |||
</t> | <t indent="4">To approve the authorization with no modifications, | |||
<t> | the | |||
server sets the status to TAC_PLUS_AUTHOR_STATUS_PASS_ADD and | ||||
the arg_cnt to 0.</t> | ||||
</li> | ||||
<li> | ||||
<t>TAC_PLUS_AUTHOR_STATUS_PASS_REPL := 0x02</t> | ||||
<t indent="4">If the status equals | ||||
TAC_PLUS_AUTHOR_STATUS_PASS_REPL, then the client | ||||
<bcp14>MUST</bcp14> use the authorization argument-value pairs | ||||
(if any) in the response instead of the authorization | ||||
argument-value pairs from the request. | ||||
</t> | ||||
</li> | ||||
<li> | ||||
<t>TAC_PLUS_AUTHOR_STATUS_FAIL := 0x10</t> | ||||
<t indent="4">If the status equals | ||||
TAC_PLUS_AUTHOR_STATUS_FAIL, then the requested authorization | ||||
<bcp14>MUST</bcp14> be denied. | ||||
</t> | ||||
</li> | ||||
<li> | ||||
<t>TAC_PLUS_AUTHOR_STATUS_ERROR := 0x11</t> | ||||
<t indent="4">A status of TAC_PLUS_AUTHOR_STATUS_ERROR | ||||
indicates an error occurred on the server. For the differences | ||||
between ERROR and FAIL, refer to "Session Completion" (<xref | ||||
target="SessionCompletion" format="default"></xref>). None of | ||||
the arg values have any relevance if an ERROR is set and must | ||||
be ignored. | ||||
</t> | ||||
</li> | ||||
<li> | ||||
<t>TAC_PLUS_AUTHOR_STATUS_FOLLOW := 0x21</t> | ||||
<t indent="4">When the status equals | ||||
TAC_PLUS_AUTHOR_STATUS_FOLLOW, the arg_cnt <bcp14>MUST</bcp14> | ||||
be 0. In that case, the actions to be taken and the contents | ||||
of the data field are identical to the | ||||
TAC_PLUS_AUTHEN_STATUS_FOLLOW status for authentication. | ||||
</t> | ||||
</li> | ||||
</ul> | ||||
<t> | ||||
server_msg, server_msg_len | ||||
</t> | ||||
<ul empty="true"> | ||||
<li> | ||||
<t> | ||||
This is a string that may be presented to the user. The server_msg_len | ||||
indicates the length of the server_msg field, in bytes. For details of | ||||
text encoding, see "Treatment of Text Strings" (<xref | ||||
target="TextEncoding" format="default"/>). | ||||
</t> | ||||
</li> | ||||
</ul> | ||||
<t> | ||||
data, data_len | data, data_len | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
This is a string that may be presented on | <li> | |||
an | <t> | |||
administrative | ||||
display, | This is a string that may be presented on an administrative display, console, | |||
console or log. The | or log. The decision to present this message is client specific. The data_len | |||
decision | indicates the length of the data field, in bytes. For details of text | |||
to present | encoding, see "Treatment of Text Strings" (<xref target="TextEncoding" format="d | |||
this | efault"/>). | |||
message is | </t> | |||
client specific. | </li> | |||
The data_len indicates the length of | </ul> | |||
the | <t> | |||
data field, in bytes. For | ||||
details of | ||||
<xref target="TextEncoding">text encoding | ||||
, see</xref>. | ||||
</t> | ||||
<t> | ||||
arg_cnt | arg_cnt | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
The number of authorization arguments to | <li> | |||
follow. | <t> | |||
</t> | This represents the number of authorization arguments to follow. | |||
<t> | </t> | |||
</li> | ||||
</ul> | ||||
<t> | ||||
arg_1 ... arg_N, arg_1_len .... arg_N_len | arg_1 ... arg_N, arg_1_len .... arg_N_len | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
The arguments describe the specifics of | <li> | |||
the authorization that is | <t> | |||
being requested. For details of the | The arguments describe the specifics of the authorization that is | |||
content of the args, refer to: | being requested. For details of the content of the args, refer to | |||
<xref target="AuthorizationAttributes">Au | "Authorization Arguments" (<xref target="AuthorizationAttributes" | |||
thorization Arguments</xref> | format="default"></xref>). Each argument is encoded in the packet as a | |||
section below. | single arg field (arg_1... arg_N) with a corresponding length field | |||
Each argument is encoded in the packet as | (which indicates the length of each argument in bytes). | |||
a single | </t> | |||
arg field (arg_1... arg_N) with a corresp | ||||
onding length fields | ||||
(which | ||||
indicates the length of each argument in | ||||
bytes). | ||||
</t> | ||||
<t> | ||||
If the status equals TAC_PLUS_AUTHOR_STAT | ||||
US_FAIL, | ||||
then the | ||||
requested authorization MUST be denied. | ||||
</t> | ||||
<t> | ||||
If the status equals TAC_PLUS_AUTHOR_STAT | ||||
US_PASS_ADD, | ||||
then the | ||||
arguments specified in the request are | ||||
authorized | ||||
and the | ||||
arguments | ||||
in | ||||
the response MUST be applied according to | ||||
the rules described | ||||
above. | ||||
</t> | ||||
<t> | ||||
If the status equals TAC_PLUS_AUTHOR_STAT | ||||
US_PASS_REPL | ||||
then the | ||||
client MUST use the authorization argumen | ||||
t-value pairs (if any) in | ||||
the response, | ||||
instead of the authorization argument-val | ||||
ue pairs | ||||
from the request. | ||||
</t> | ||||
<t> | ||||
To approve the | ||||
authorization with no | ||||
modifications, the server sets | ||||
the status to | ||||
TAC_PLUS_AUTHOR_STATUS_PASS_ADD and | ||||
the arg_cnt | ||||
to | ||||
0. | ||||
</t> | ||||
<t> | ||||
A status of TAC_PLUS_AUTHOR_STATUS_ERROR | ||||
indicates an | ||||
error | ||||
occurred | ||||
on the server. For the differences betwee | ||||
n ERROR and FAIL, | ||||
refer to | ||||
<xref target="SessionCompletion">Session | ||||
Completion</xref>. None of | ||||
the | ||||
arg values have any | ||||
relevance if an | ||||
ERROR is set, and | ||||
must be | ||||
ignored. | ||||
</t> | ||||
<t> | ||||
When the status equals TAC_PLUS_AUTHOR_ST | ||||
ATUS_FOLLOW, | ||||
then the | ||||
arg_cnt | ||||
MUST be 0. In that case, the actions | ||||
to be taken and the | ||||
contents | ||||
of the data field are | ||||
identical to the | ||||
TAC_PLUS_AUTHEN_STATUS_FOLLOW status | ||||
for Authentication. | ||||
</t> | </li> | |||
</section> | </ul> | |||
</section> | ||||
<section anchor="Accounting" title="Accounting"> | </section> | |||
<t> | </section> | |||
Accounting is typically the third action after | <section anchor="Accounting" numbered="true" toc="default"> | |||
authentication and | <name>Accounting</name> | |||
authorization. But again, neither | <t> | |||
authentication nor authorization | Accounting is typically the third action after authentication and | |||
is | authorization. But again, neither authentication nor authorization is | |||
required. Accounting | required. Accounting is the action of recording what a user is doing | |||
is the action of recording what a user is | and/or has done. Accounting in TACACS+ can serve two purposes: it may | |||
doing, | be used as an auditing tool for security services, and it may also be | |||
and/or | used to account for services used such as in a billing | |||
has done. Accounting in TACACS+ can serve | environment. To this end, TACACS+ supports three types of accounting | |||
two | records: Start records indicate that a service is about to begin, Stop | |||
purposes: It | records indicate that a service has just terminated, and Update | |||
may be | records are intermediate notices that indicate that a service is still | |||
used as an auditing tool for security services. | being performed. TACACS+ accounting records contain all the | |||
It may also be used | information used in the authorization records and also contain | |||
to account for services used, such | accounting-specific information such as start and stop times (when | |||
as in a | appropriate) and resource usage information. A list of accounting | |||
billing environment. To | arguments is defined in "Accounting Arguments" (<xref target="AccountingA | |||
this end, TACACS+ | ttributes" | |||
supports three types of | format="default"/>). | |||
accounting records. Start | </t> | |||
records | <section anchor="TheAccountREQUESTPacketBody" numbered="true" toc="default | |||
indicate that a | "> | |||
service is about | <name>The Account REQUEST Packet Body</name> | |||
to begin. Stop records | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
indicate that a service has just terminated, | ||||
and Update | ||||
records are | ||||
intermediate notices that | ||||
indicate that a | ||||
service is still being | ||||
performed. TACACS+ accounting | ||||
records contain | ||||
all the information used | ||||
in the | ||||
authorization records, and also | ||||
contain accounting | ||||
specific | ||||
information such as start and stop times | ||||
(when | ||||
appropriate) and | ||||
resource usage information. A list of | ||||
accounting arguments is | ||||
defined in the | ||||
<xref target="Accounting">accounting section</xre | ||||
f>. | ||||
</t> | ||||
<section anchor="TheAccountREQUESTPacketBody" title="The | ||||
Account REQUEST Packet Body"> | ||||
<figure> | ||||
<artwork><![CDATA[ | ||||
1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 | 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| flags | authen_method | priv_lvl | authen_type | | | flags | authen_method | priv_lvl | authen_type | | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| authen_service | user_len | port_len | rem_addr_len | | | authen_service | user_len | port_len | rem_addr_len | | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| arg_cnt | arg_1_len | arg_2_len | ... | | | arg_cnt | arg_1_len | arg_2_len | ... | | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| arg_N_len | user ... | | arg_N_len | user ... | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
skipping to change at line 2464 ¶ | skipping to change at line 2096 ¶ | |||
| arg_1 ... | | arg_1 ... | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| arg_2 ... | | arg_2 ... | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| ... | | ... | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| arg_N ... | | arg_N ... | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
]]></artwork> | ]]></artwork> | |||
</figure> | <t> | |||
<t> | ||||
flags | flags | |||
</t> | </t> | |||
<t> | ||||
<ul empty="true" spacing="normal"> | ||||
<li> | ||||
<t> | ||||
This holds bitmapped flags. | This holds bitmapped flags. | |||
</t> | </t> | |||
<t> | </li> | |||
<list> | <li> | |||
<t> | <t>Valid values are: | |||
</t> | ||||
</li> | ||||
<li> | ||||
TAC_PLUS_ACCT_FLAG_START := 0x02 | TAC_PLUS_ACCT_FLAG_START := 0x02 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_ACCT_FLAG_STOP : = 0x04 | TAC_PLUS_ACCT_FLAG_STOP : = 0x04 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_ACCT_FLAG_WATCHD OG := 0x08 | TAC_PLUS_ACCT_FLAG_WATCHD OG := 0x08 | |||
</t> | </li> | |||
</list> | </ul> | |||
</t> | <t> | |||
<t> | All other fields are defined in "Authentication" (<xref | |||
All other fields are defined in the autho | target="Authentication"></xref>) and "Authorization" (<xref | |||
rization and | target="Authorization"></xref>) and have the same | |||
authentication | semantics. They provide details for the conditions on the client, and | |||
sections above and have the same | authentication context, so that these details may be logged for | |||
semantics. They | accounting purposes. | |||
provide details for the conditions on the | </t> | |||
client, and | ||||
authentication context, so that these det | <t> | |||
ails may be logged for | See "Accounting Arguments" (<xref target="AccountingAttributes" format="d | |||
accounting purposes. | efault"></xref>) for | |||
</t> | the dictionary of arguments relevant to accounting. | |||
<t> | </t> | |||
See the | </section> | |||
<xref target="AccountingAttributes">Accountin | <section anchor="TheAccountingREPLYPacketBody" numbered="true" toc="defaul | |||
g Arguments section</xref> for | t"> | |||
the | <name>The Accounting REPLY Packet Body</name> | |||
dictionary | <t> | |||
of | The purpose of accounting is to record the action that has occurred on | |||
arguments relevant to accounting. | the client. The server <bcp14>MUST</bcp14> reply with success only | |||
</t> | when the accounting request has been recorded. If the server did not | |||
</section> | record the accounting request, then it <bcp14>MUST</bcp14> reply with | |||
<section anchor="TheAccountingREPLYPacketBody" title="The | ERROR. | |||
Accounting REPLY Packet Body"> | </t> | |||
<t> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
The purpose of accounting is to record th | ||||
e action that has | ||||
occurred on the client. | ||||
The server | ||||
MUST | ||||
reply with success | ||||
only when | ||||
the accounting request | ||||
has been recorded. | ||||
If the server did not | ||||
record the accounting | ||||
request then it MUST | ||||
reply with ERROR. | ||||
</t> | ||||
<figure> | ||||
<artwork><![CDATA[ | ||||
1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 | 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| server_msg len | data_len | | | server_msg len | data_len | | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| status | server_msg ... | | status | server_msg ... | |||
+----------------+----------------+----------------+----------------+ | +----------------+----------------+----------------+----------------+ | |||
| data ... | | data ... | |||
+----------------+ | +----------------+ | |||
]]></artwork> | ]]></artwork> | |||
</figure> | <t> | |||
status | ||||
<t> | </t> | |||
status | <ul empty="true" spacing="normal"> | |||
</t> | <li> | |||
<t> | <t> | |||
This is the return status. Values are: | This is the return status. | |||
</t> | </t> | |||
<t> | </li> | |||
<list> | <li> | |||
<t> | <t> | |||
Values are: | ||||
</t> | ||||
</li> | ||||
<li> | ||||
TAC_PLUS_ACCT_STATUS_SUCC ESS := 0x01 | TAC_PLUS_ACCT_STATUS_SUCC ESS := 0x01 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_ACCT_STATUS_ERRO R := | TAC_PLUS_ACCT_STATUS_ERRO R := | |||
0x02 | 0x02 | |||
</t> | </li> | |||
<t> | <li> | |||
TAC_PLUS_ACCT_STATUS_FOLL | <t>TAC_PLUS_ACCT_STATUS_FOLLOW := 0x21</t | |||
OW := 0x21 | > | |||
</t> | <t indent="4">When the status equals | |||
</list> | TAC_PLUS_ACCT_STATUS_FOLLOW, the | |||
</t> | actions to be taken and the contents | |||
<t> | of the data field are identical to the | |||
server_msg, server_msg_len | TAC_PLUS_AUTHEN_STATUS_FOLLOW status | |||
</t> | for authentication. | |||
<t> | </t> | |||
This is a string that may be presented to | </li> | |||
the | </ul> | |||
user. The | <t> | |||
server_msg_len indicates the length of th | server_msg, server_msg_len | |||
e server_msg | </t> | |||
field, in | <ul empty="true"> | |||
bytes. For details of | <li> | |||
<xref target="TextEncoding">text encoding | <t> | |||
, see</xref>. | This is a string that may be presented to the user. The server_msg_len | |||
</t> | indicates the length of the server_msg field, in bytes. For details of | |||
<t> | text encoding, see "Treatment of Text Strings" (<xref target="TextEncodin | |||
g" format="default"/>). | ||||
</t> | ||||
</li> | ||||
</ul> | ||||
<t> | ||||
data, data_len | data, data_len | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
This is a string that may be presented on | <li> | |||
an | <t> | |||
administrative | This is a string that may be presented on an administrative display, | |||
display, | console, or log. The decision to present this message is client | |||
console or log. The decision | specific. The data_len indicates the length of the data field, in | |||
to present | bytes. For details of text encoding, see "Treatment of Text Strings" (<xr | |||
this | ef target="TextEncoding" | |||
message is | format="default"/>). | |||
client | </t> | |||
specific. The data_len indicates the leng | </li> | |||
th of | </ul> | |||
the | ||||
data field, in | <t> | |||
bytes. For details of | TACACS+ accounting is intended to record various types of events on clients, | |||
<xref target="TextEncoding">text encoding | for example: login sessions, command entry, and others as required by the | |||
, see</xref>. | client implementation. These events are collectively referred to in "The | |||
</t> | Draft" <xref target="THE-DRAFT" format="default"/> as "tasks". | |||
<t> | </t> | |||
When the status equals TAC_PLUS_ACCT_STAT | <t> | |||
US_FOLLOW, | The TAC_PLUS_ACCT_FLAG_START flag indicates that this is a start | |||
then the | accounting message. Start messages will only be sent once when a task | |||
actions to | is started. The TAC_PLUS_ACCT_FLAG_STOP indicates that this is a stop | |||
be taken and the contents of the | record and that the task has terminated. The | |||
data field are | TAC_PLUS_ACCT_FLAG_WATCHDOG flag means that this is an update record. | |||
identical | </t> | |||
to the | ||||
TAC_PLUS_AUTHEN_STATUS_FOLLOW status for | <table anchor="accounting-packets"> | |||
Authentication. | <name>Summary of Accounting Packets</name> | |||
</t> | <thead> | |||
<t> | <tr> | |||
TACACS+ accounting is intended to record | <th>Watchdog</th> | |||
various types of events | <th>Stop</th> | |||
on | <th>Start</th> | |||
clients, for example: login sessions, com | <th>Flags & 0xE</th> | |||
mand entry, and others | <th>Meaning</th> | |||
as | </tr> | |||
required by the client implementation. Th | </thead> | |||
ese events are | <tbody> | |||
collectively referred to in | <tr> | |||
<xref target="TheDraft">`The Draft'</xref | <td>0</td> | |||
> | <td>0</td> | |||
as "tasks". | <td>0</td> | |||
</t> | <td>0</td> | |||
<t> | <td>INVALID</td> | |||
The TAC_PLUS_ACCT_FLAG_START flag indicat | </tr> | |||
es that this | <tr> | |||
is a start | <td>0</td> | |||
accounting message. Start messages will | <td>0</td> | |||
only be | <td>1</td> | |||
sent once when | <td>2</td> | |||
a | <td>Start Accounting Record</td> | |||
task | </tr> | |||
is started. The | <tr> | |||
TAC_PLUS_ACCT_FLAG_STOP indicates that th | <td>0</td> | |||
is | <td>1</td> | |||
is | <td>0</td> | |||
a | <td>4</td> | |||
stop | <td>Stop Accounting Record</td> | |||
record and that the task has terminated. | </tr> | |||
The | <tr> | |||
TAC_PLUS_ACCT_FLAG_WATCHDOG flag means th | <td>0</td> | |||
at this is | <td>1</td> | |||
an update | <td>1</td> | |||
record. | <td>6</td> | |||
</t> | <td>INVALID</td> | |||
<t> | </tr> | |||
Summary of Accounting Packets | <tr> | |||
<figure> | <td>1</td> | |||
<artwork><![CDATA[ | <td>0</td> | |||
+----------+-------+-------+-------------+-------------------------+ | <td>0</td> | |||
| Watchdog | Stop | Start | Flags & 0xE | Meaning | | <td>8</td> | |||
+----------+-------+-------+-------------+-------------------------+ | <td>Watchdog, no update</td> | |||
| 0 | 0 | 0 | 0 | INVALID | | </tr> | |||
| 0 | 0 | 1 | 2 | Start Accounting Record | | ||||
| 0 | 1 | 0 | 4 | Stop Accounting Record | | <tr> | |||
| 0 | 1 | 1 | 6 | INVALID | | <td>1</td> | |||
| 1 | 0 | 0 | 8 | Watchdog, no update | | <td>0</td> | |||
| 1 | 0 | 1 | A | Watchdog, with update | | <td>1</td> | |||
| 1 | 1 | 0 | C | INVALID | | <td>A</td> | |||
| 1 | 1 | 1 | E | INVALID | | <td>Watchdog, with update</td> | |||
+----------+-------+-------+-------------+-------------------------+ | </tr> | |||
]]></artwork> | <tr> | |||
</figure> | <td>1</td> | |||
The START and STOP flags are mutually exc | <td>1</td> | |||
lusive. | <td>0</td> | |||
</t> | <td>C</td> | |||
<t>The WATCHDOG flag is used by the client to com | <td>INVALID</td> | |||
municate ongoing | </tr> | |||
status of a long-running task. Update rec | ||||
ords are sent at the | <tr> | |||
client's discretion. The frequency of the | <td>1</td> | |||
update depends upon the | <td>1</td> | |||
intended application: A watchdog to provi | <td>1</td> | |||
de progress indication | <td>E</td> | |||
will require higher frequency than a dail | <td>INVALID</td> | |||
y keep-alive. | </tr> | |||
When the | ||||
WATCHDOG | </tbody> | |||
flag is set along with the START | </table> | |||
flag, it indicates that the | ||||
update | <t> | |||
record provides additional or updated arg | The START and STOP flags are mutually | |||
uments from the | exclusive. | |||
original START record. If the | </t> | |||
START | <t>The WATCHDOG flag is used by the client to communicate ongoing | |||
flag | status of a long-running task. Update records are sent at the client's | |||
is not set, then this | discretion. The frequency of the update depends upon the intended | |||
indicates | application: a watchdog to provide progress indication will require | |||
only that | higher frequency than a daily keep-alive. When the WATCHDOG flag is | |||
task is still running, and no new informa | set along with the START flag, it indicates that the update record | |||
tion is | provides additional or updated arguments from the original START | |||
provided (servers MUST ignore any argumen | record. If the START flag is not set, then this indicates only that | |||
ts). The | task is still running, and no new information is provided (servers | |||
STOP flag MUST NOT | <bcp14>MUST</bcp14> ignore any arguments). The STOP flag <bcp14>MUST | |||
be set in | NOT</bcp14> be set in conjunction with the WATCHDOG flag. | |||
conjunction | </t> | |||
with the | <t> | |||
WATCHDOG flag. | The server <bcp14>MUST</bcp14> respond | |||
</t> | with TAC_PLUS_ACCT_STATUS_ERROR if the | |||
<t> | ||||
The Server MUST respond with TAC_PLUS_ACC | ||||
T_STATUS_ERROR if the | ||||
client requests an INVALID option. | client requests an INVALID option. | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="AttributeValuePairs" title="Argument-Value Pairs | <section anchor="AttributeValuePairs" numbered="true" toc="default"> | |||
"> | <name>Argument-Value Pairs</name> | |||
<t> | <t> | |||
TACACS+ is intended to be an extensible protocol. | TACACS+ is intended to be an extensible | |||
The | protocol. The arguments used in Authorization | |||
arguments | and Accounting are not limited by this | |||
used in | document. Some arguments are defined below | |||
Authorization and Accounting are not | for common use cases. Clients | |||
limited by this document. | <bcp14>MUST</bcp14> use these arguments when | |||
Some arguments | supporting the corresponding use cases. | |||
are | </t> | |||
defined below for common use | <section anchor="ValueEncoding" numbered="true" toc="default"> | |||
cases, clients MUST | <name>Value Encoding</name> | |||
use these | <t> | |||
arguments when supporting | All argument values are encoded as strings. For details of text | |||
the corresponding use cases. | encoding, see "Treatment of Text Strings" (<xref target="TextEncoding" fo | |||
</t> | rmat="default"/>). The | |||
<section anchor="ValueEncoding" title="Value Encoding"> | following type representations <bcp14>SHOULD</bcp14> be followed. | |||
<t> | </t> | |||
All argument values are encoded as string | <t>Numeric</t> | |||
s. For details of | ||||
<xref target="TextEncoding">text encoding | ||||
, see</xref>. | ||||
The following type representations SHOULD | ||||
be followed | ||||
</t> | ||||
<t>Numeric</t> | <ul empty="true"> | |||
<t> | <li> | |||
All numeric values in an argument-value s | <t> | |||
tring are | All numeric values in an argument-value string are provided as decimal | |||
provided as | numbers, unless otherwise stated. All arguments include a length | |||
decimal | field, and TACACS+ implementations <bcp14>MUST</bcp14> verify that | |||
numbers, unless otherwise | they can accommodate the lengths of numeric arguments before | |||
stated. All arguments include a length fi | attempting to process them. If the length cannot be accommodated, then | |||
eld, and | the argument <bcp14>MUST</bcp14> be regarded as not handled and the | |||
TACACS+ implementations MUST verify that | logic in "Authorization" (<xref target="TheAuthorizationREQUESTPacketBody | |||
they can accommodate the lengths of numeric | " | |||
arguments before attempting to process th | format="default"></xref>) regarding the processing | |||
em. | of arguments <bcp14>MUST</bcp14> be applied. | |||
If the length cannot be accommodated then | </t> | |||
the argument MUST be regarded as not handled and the | </li> | |||
logic in <xref target="TheAuthorizationRE | </ul> | |||
QUESTPacketBody">authorization section</xref> regarding the processing of argum | ||||
ents MUST be applied. | <t>Boolean</t> | |||
</t> | <ul empty="true"> | |||
<t>Boolean</t> | <li> | |||
<t> | <t> | |||
All Boolean arguments are encoded with | All Boolean arguments are encoded with | |||
values "true" or | values "true" or "false". | |||
"false". | ||||
</t> | </t> | |||
<t>IP-Address</t> | </li> | |||
<t> | </ul> | |||
It is recommended that hosts be specified | <t>IP-Address</t> | |||
as a IP | <ul empty="true"> | |||
address so | <li> | |||
as | <t> | |||
to | It is recommended that hosts be specified as an IP address so as to avoid any | |||
avoid any ambiguities. For details of | ambiguities. For details of text encoding, see "Treatment of Text Strings" (<xre | |||
<xref target="TextEncoding">text encoding | f target="TextEncoding" | |||
, see</xref>. IPv4 address are specified as octet | format="default"/>). IPv4 addresses are specified as octet numerics separated by | |||
numerics separated | dots ('.'). IPv6 address text representation is defined in <xref target="RFC5952 | |||
by dots | " | |||
('.'), IPv6 address text representation | format="default"/>. | |||
defined in | </t> | |||
<xref target="RFC5952">RFC 5952</xref>. | </li> | |||
</t> | </ul> | |||
<t>Date Time</t> | <t>Date Time</t> | |||
<t> | <ul empty="true"> | |||
Absolute date/times are specified in seco | <li> | |||
nds since the | <t> | |||
epoch, | Absolute date/times are specified in seconds since the epoch, 12:00am, | |||
12:00am Jan | January 1, 1970. The time zone <bcp14>MUST</bcp14> be UTC | |||
1 | unless a time zone | |||
1970. The timezone MUST be UTC unless | argument is specified. | |||
a timezone | </t> | |||
argument is | </li> | |||
specified. | </ul> | |||
</t> | <t>String</t> | |||
<t>String</t> | <ul empty="true"> | |||
<t>Many values have no specific type representati | <li> | |||
on and are | <t>Many values have no specific type representation and are | |||
interpreted as plain strings.</t> | interpreted as plain strings.</t> | |||
<t>Empty Values</t> | </li> | |||
<t> | </ul> | |||
Arguments may be submitted with no value, | <t>Empty Values</t> | |||
in which case they | <ul empty="true"> | |||
consist of the name and the mandatory or | <li> | |||
optional separator. For | <t> | |||
example, the argument "cmd" which has no | Arguments may be submitted with no value, in which case they consist of the | |||
value is transmitted as a | name and the mandatory or optional separator. For example, the argument "cmd", | |||
string of four characters "cmd=" | which has no value, is transmitted as a string of four characters "cmd=". | |||
</t> | </t> | |||
</section> | </li> | |||
<section anchor="AuthorizationAttributes" title="Authoriz | </ul> | |||
ation Arguments"> | </section> | |||
<t> | ||||
<section anchor="AuthorizationAttributes" numbered="true" toc="default"> | ||||
<name>Authorization Arguments</name> | ||||
<t> | ||||
service (String) | service (String) | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
The primary service. Specifying a service | <li> | |||
argument | <t> | |||
indicates | The primary service. Specifying a service argument indicates that this is a | |||
that | request for authorization or accounting of that service. For example: | |||
this is a request for authorization or | "shell", "tty-server", "connection", "system" and "firewall"; others may be | |||
accounting of that | chosen for the required application. This argument <bcp14>MUST</bcp14> always | |||
service. | be included. | |||
For example: "shell", "tty-server", | </t> | |||
"connection", "system" | </li> | |||
and | </ul> | |||
"firewall", others may be chosen for the | <t> | |||
required application. This | ||||
argument MUST always | ||||
be | ||||
included. | ||||
</t> | ||||
<t> | ||||
protocol (String) | protocol (String) | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
the protocol field may be used to indicat | <li> | |||
e a subset of a service. | <t>A field that may be used to indicate a subset of a service. | |||
</t> | </t> | |||
<t> | </li> | |||
</ul> | ||||
<t> | ||||
cmd (String) | cmd (String) | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
a shell (exec) command. This indicates th | <li> | |||
e command | <t> | |||
name of the | A shell (exec) command. This indicates the command name of the command that is | |||
command that is to be run. The "cmd" argu | to be run. The "cmd" argument <bcp14>MUST</bcp14> be specified if service | |||
ment MUST be specified | equals "shell". | |||
if | </t> | |||
service equals "shell". | </li> | |||
</t> | <li> | |||
<t>Authorization of shell commands is a common us | <t>Authorization of shell commands is a common use case for the | |||
e-case for the | TACACS+ protocol. Command Authorization generally takes one of two | |||
TACACS+ protocol. Command Authorization g | forms: session based or command based. | |||
enerally takes one of two | </t> | |||
forms: session-based and command-based. | </li> | |||
</t> | <li> | |||
<t>For session-based shell authorization, the "cm | <t>For session-based shell authorization, the "cmd" argument will have | |||
d" | an empty value. The client determines which commands are allowed in a | |||
argument will | session according to the arguments present in the authorization. | |||
have an empty | </t> | |||
value. The client determines | </li> | |||
which commands are allowed | <li> | |||
in a session according to the arguments | <t>In command-based authorization, the client requests that the server | |||
present in the | determine whether a command is allowed by making an authorization | |||
authorization. | request for each command. The "cmd" argument will have the command | |||
</t> | name as its value.</t> | |||
<t>In command-based authorization, the client req | </li> | |||
uests that | </ul> | |||
the | <t> | |||
server determine whether a command is all | ||||
owed by making an | ||||
authorization request for each command. T | ||||
he "cmd" argument will | ||||
have the command name as its value.</t> | ||||
<t> | ||||
cmd-arg (String) | cmd-arg (String) | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
an argument to a shell (exec) command. Th | <li> | |||
is indicates | <t> | |||
an | An argument to a shell (exec) command. This indicates an argument for | |||
argument | the shell command that is to be run. Multiple cmd-arg arguments may | |||
for | be specified, and they are order dependent. | |||
the shell command that is to be run. | </t> | |||
Multiple cmd-arg | </li> | |||
arguments | </ul> | |||
may be specified, and they | <t> | |||
are order dependent. | ||||
</t> | ||||
<t> | ||||
acl (Numeric) | acl (Numeric) | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
a number representing a connection access | <li> | |||
list. | <t> | |||
Applicable | A number representing a connection access list. Applicable only to | |||
only to | session-based shell authorization. For details of text encoding, see | |||
session-based shell authorization. For de | "Treatment of Text Strings" (<xref target="TextEncoding" | |||
tails of | format="default"/>). | |||
<xref target="TextEncoding">text encoding | </t> | |||
, see</xref>. | </li> | |||
</t> | </ul> | |||
<t> | <t> | |||
inacl (String) | inacl (String) | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
identifier (name) of an interface input a | <li> | |||
ccess | <t> | |||
list. For details of | The identifier (name) of an interface input access list. For details of text | |||
<xref target="TextEncoding">text encoding | encoding, see "Treatment of Text Strings" (<xref target="TextEncoding" format="d | |||
, see</xref>. | efault"/>). | |||
</t> | </t> | |||
<t> | </li> | |||
</ul> | ||||
<t> | ||||
outacl (String) | outacl (String) | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
identifier (name) of an interface output | <li> | |||
access | <t> | |||
list. For details of | The identifier (name) of an interface output access list. For details of text | |||
<xref target="TextEncoding">text encoding | encoding, see "Treatment of Text Strings" (<xref target="TextEncoding" format="d | |||
, see</xref>. | efault"/>). | |||
</t> | </t> | |||
<t> | </li> | |||
</ul> | ||||
<t> | ||||
addr (IP-Address) | addr (IP-Address) | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
a network address | <li> | |||
</t> | <t> | |||
<t> | A network address. | |||
</t> | ||||
</li> | ||||
</ul> | ||||
<t> | ||||
addr-pool (String) | addr-pool (String) | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
The identifier of an address pool from wh | <li> | |||
ich the | <t> | |||
client can | The identifier of an address pool from which the client can assign an | |||
assign | address. | |||
an address. | </t> | |||
</t> | </li> | |||
<t> | </ul> | |||
<t> | ||||
timeout (Numeric) | timeout (Numeric) | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
an absolute timer for the connection (in | <li> | |||
minutes). A | <t> | |||
value of | An absolute timer for the connection (in minutes). A value of zero | |||
zero | indicates no timeout. | |||
indicates no timeout. | </t> | |||
</t> | </li> | |||
<t> | </ul> | |||
<t> | ||||
idletime (Numeric) | idletime (Numeric) | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
an idle-timeout for the connection (in mi | <li> | |||
nutes). A | <t> | |||
value of zero | An idle-timeout for the connection (in minutes). A value of zero | |||
indicates no timeout. | indicates no timeout. | |||
</t> | </t> | |||
<t> | </li> | |||
</ul> | ||||
<t> | ||||
autocmd (String) | autocmd (String) | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
an auto-command to run. Applicable only t | <li> | |||
o session-based shell | <t> | |||
authorization. | An auto-command to run. Applicable only to session-based shell authorization. | |||
</t> | </t> | |||
<t> | </li> | |||
</ul> | ||||
<t> | ||||
noescape (Boolean) | noescape (Boolean) | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
Prevents user from using an escape | <li> | |||
character. Applicable | <t> | |||
only to | Prevents the user from using an escape character. Applicable only to | |||
session-based shell authorization. | session-based shell authorization. | |||
</t> | </t> | |||
<t> | </li> | |||
</ul> | ||||
<t> | ||||
nohangup (Boolean) | nohangup (Boolean) | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
Boolean. Do not disconnect after an autom | <li> | |||
atic command. | <t> | |||
Applicable | Boolean. Do not disconnect after an automatic command. Applicable | |||
only to session-based shell authorization | only to session-based shell authorization. | |||
. | </t> | |||
</t> | </li> | |||
<t> | </ul> | |||
<t> | ||||
priv-lvl (Numeric) | priv-lvl (Numeric) | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
privilege level to be assigned. Please re | <li> | |||
fer to the | <t> | |||
<xref target="PrivilegeLevel">Privilege L | The privilege level to be assigned. Please refer to "Privilege Levels" (<xref | |||
evel section</xref> | target="PrivilegeLevel" format="default"></xref>). | |||
below. | </t> | |||
</t> | </li> | |||
</section> | </ul> | |||
<section anchor="AccountingAttributes" title="Accounting | ||||
Arguments"> | </section> | |||
<t> | <section anchor="AccountingAttributes" numbered="true" toc="default"> | |||
The following arguments are defined for T | <name>Accounting Arguments</name> | |||
ACACS+ | <t> | |||
accounting | The following arguments are defined for TACACS+ accounting only. They | |||
only. | <bcp14>MUST</bcp14> precede any argument-value pairs that are defined | |||
They MUST precede any | in "Authorization" (<xref target="Authorization" format="default"></xref> | |||
argument-value pairs that | ). | |||
are | </t> | |||
defined | <t> | |||
in | ||||
the | ||||
<xref target="Authorization">authorizatio | ||||
n section</xref> | ||||
above. | ||||
</t> | ||||
<t> | ||||
task_id (String) | task_id (String) | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
Start and stop records for the same event | <li> | |||
MUST have | ||||
matching | <t> | |||
task_id | Start and stop records for the same event <bcp14>MUST</bcp14> have | |||
argument values. The client MUST ensure t | matching task_id argument values. The client <bcp14>MUST</bcp14> | |||
hat active | ensure that active task_ids are not duplicated; a client <bcp14>MUST | |||
task_ids are not duplicated: a client MUS | NOT</bcp14> reuse a task_id in a start record until it has sent a stop | |||
T NOT reuse | record for that task_id. Servers <bcp14>MUST NOT</bcp14> make | |||
a task_id a | assumptions about the format of a task_id. | |||
start record until it | </t> | |||
has sent a stop record for that | </li> | |||
task_id. | </ul> | |||
Servers MUST NOT make assumptions about t | <t> | |||
he format of a task_id. | ||||
</t> | ||||
<t> | ||||
start_time (Date Time) | start_time (Date Time) | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
The time the action started (in seconds s | <li> | |||
ince the | <t> | |||
epoch.). | The time the action started (in seconds since the epoch). | |||
</t> | </t> | |||
<t> | </li> | |||
</ul> | ||||
<t> | ||||
stop_time (Date Time) | stop_time (Date Time) | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
The time the action stopped (in seconds s | <li> | |||
ince the | <t> | |||
epoch.) | The time the action stopped (in seconds since the epoch). | |||
</t> | </t> | |||
<t> | </li> | |||
</ul> | ||||
<t> | ||||
elapsed_time (Numeric) | elapsed_time (Numeric) | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
<li> | ||||
<t> | ||||
The elapsed time in seconds for the actio n. | The elapsed time in seconds for the actio n. | |||
</t> | </t> | |||
<t> | </li> | |||
</ul> | ||||
<t> | ||||
timezone (String) | timezone (String) | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
The timezone abbreviation for all timesta | <li> | |||
mps included | <t> | |||
in this | The time zone abbreviation for all timestamps included in this packet. A | |||
packet. A database of timezones is mainta | database of time zones is maintained in <xref target="TZDB" | |||
ined here: | format="default">TZDB</xref>. | |||
<xref target="TZDB">TZDB</xref>. | </t> | |||
</t> | </li> | |||
<t> | </ul> | |||
<t> | ||||
event (String) | event (String) | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
Used only when "service=system". Current | <li> | |||
values are | <t> | |||
"net_acct", | Used only when "service=system". Current values are "net_acct", "cmd_acct", | |||
"cmd_acct", "conn_acct", "shell_acct" | "conn_acct", "shell_acct", "sys_acct", and "clock_change". These indicate | |||
"sys_acct" and | system-level changes. The flags field <bcp14>SHOULD</bcp14> indicate whether | |||
"clock_change". | the service started or stopped. | |||
These indicate system-level changes. | </t> | |||
The flags | </li> | |||
field SHOULD indicate | </ul> | |||
whether | <t> | |||
the service started or stopped. | ||||
</t> | ||||
<t> | ||||
reason (String) | reason (String) | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
Accompanies an event argument. It describ | <li> | |||
es why the | <t> | |||
event | Accompanies an event argument. It describes why the event occurred. | |||
occurred. | </t> | |||
</t> | </li> | |||
<t> | </ul> | |||
<t> | ||||
bytes (Numeric) | bytes (Numeric) | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
The number of bytes transferred by this a | <li> | |||
ction | <t> | |||
</t> | The number of bytes transferred by this action. | |||
<t> | </t> | |||
</li> | ||||
</ul> | ||||
<t> | ||||
bytes_in (Numeric) | bytes_in (Numeric) | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
The number of bytes transferred by this a | <li> | |||
ction from the | <t> | |||
endstation to the client port | The number of bytes transferred by this action from the endstation to | |||
</t> | the client port. | |||
<t> | </t> | |||
</li> | ||||
</ul> | ||||
<t> | ||||
bytes_out (Numeric) | bytes_out (Numeric) | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
The number of bytes transferred by this a | <li> | |||
ction from the client to | <t> | |||
the endstation | The number of bytes transferred by this action from the client | |||
port | to the endstation port. | |||
</t> | </t> | |||
<t> | </li> | |||
</ul> | ||||
<t> | ||||
paks (Numeric) | paks (Numeric) | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
<li> | ||||
<t> | ||||
The number of packets transferred by this action. | The number of packets transferred by this action. | |||
</t> | </t> | |||
<t> | </li> | |||
</ul> | ||||
<t> | ||||
paks_in (Numeric) | paks_in (Numeric) | |||
</t> | </t> | |||
<t> | ||||
The number of input packets transferred b | <ul empty="true"> | |||
y this | <li> | |||
action from the | <t> | |||
endstation to the client | The number of input packets transferred by this action from the endstation to | |||
port. | the client port. | |||
</t> | </t> | |||
<t> | </li> | |||
</ul> | ||||
<t> | ||||
paks_out (Numeric) | paks_out (Numeric) | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
The number of output packets transferred | <li> | |||
by this | <t> | |||
action from the | The number of output packets transferred by this action from the client port | |||
client | to the endstation. | |||
port to the endstation. | </t> | |||
</t> | </li> | |||
<t> | </ul> | |||
<t> | ||||
err_msg (String) | err_msg (String) | |||
</t> | </t> | |||
<t> | <ul empty="true"> | |||
string describing the status of the | <li> | |||
action. For details of | <t> | |||
<xref target="TextEncoding">text encoding | A string describing the status of the action. For details of text | |||
, see</xref>. | encoding, see "Treatment of Text Strings" (<xref target="TextEncoding" fo | |||
</t> | rmat="default"/>). | |||
</section> | </t> | |||
</section> | </li> | |||
<section anchor="PrivilegeLevel" title="Privilege Levels"> | </ul> | |||
<t> | <t>Where the TACACS+ deployment is used to support the Device Administration | |||
The TACACS+ Protocol supports flexible authorizat | use case, it is often required to log all commands entered into client | |||
ion | devices. To support this mode of operation, TACACS+ client devices <bcp14>MUST</ | |||
schemes | bcp14> be | |||
through the extensible arguments. | configured to send an accounting start packet for every command entered, | |||
</t> | irrespective of how the commands were authorized. These “Command Accounting” | |||
<t>One | packets <bcp14>MUST</bcp14> include the “service” and “cmd” arguments, and if ne | |||
scheme is | eded, the | |||
built into the | “cmd-arg” arguments detailed in <xref target="AuthorizationAttributes"/>. | |||
protocol and has been extensively used | </t> | |||
for Session-based shell authorization: Privilege | </section> | |||
Levels. | </section> | |||
Privilege | <section anchor="PrivilegeLevel" numbered="true" toc="default"> | |||
Levels are ordered values from | <name>Privilege Levels</name> | |||
0 | <t> | |||
to 15 with each level | The TACACS+ protocol supports flexible | |||
being a | authorization schemes through the extensible | |||
superset | arguments. | |||
of the | </t> | |||
next lower value. | ||||
Configuration and implementation of the | ||||
client will map actions (such as the | ||||
permission to execute of | ||||
specific commands) to different privilege levels. | ||||
The allocation of | ||||
commands to privilege levels is highly dependent | ||||
upon the | ||||
deployment. Common allocations are as follows: | ||||
</t> | ||||
<t> | ||||
<list> | ||||
<t> | ||||
TAC_PLUS_PRIV_LVL_MIN := 0x00. Th | ||||
e level normally allocated to | ||||
an unauthenticated session. | ||||
</t> | ||||
<t> | ||||
TAC_PLUS_PRIV_LVL_USER := 0x01. T | ||||
he level normally allocated to | ||||
a regular authenticated session | ||||
</t> | ||||
<t> | ||||
TAC_PLUS_PRIV_LVL_ROOT := 0x0f. T | ||||
he level normally allocated to | ||||
a session authenticated by a high | ||||
ly privileged user to allow | ||||
commands with significant system | ||||
impact. | ||||
</t> | ||||
<t> | ||||
TAC_PLUS_PRIV_LVL_MAX := 0x0f. Th | ||||
e highest privilege level. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
A Privilege level can be assigned to a shell (EXE | ||||
C) session when | ||||
it starts. The client | ||||
will | ||||
permit the actions associated with this | ||||
level to be executed. | ||||
This | ||||
privilege level is returned by the Server | ||||
in a session-based | ||||
shell | ||||
authorization | ||||
(when "service" | ||||
equals "shell" | ||||
and | ||||
"cmd" is empty). | ||||
When a | ||||
user required to perform actions that are | ||||
mapped to a higher | ||||
privilege level, then | ||||
an ENABLE type | ||||
reauthentication can | ||||
be initiated | ||||
by the client. | ||||
The client will insert | ||||
the required privilege level | ||||
into | ||||
the authentication header for | ||||
enable | ||||
authentication request. | ||||
</t> | ||||
<t> | ||||
The use of Privilege levels to determine session- | ||||
based | ||||
access to | ||||
commands and resources is not mandatory for | ||||
clients. Although the | ||||
privilege level scheme is widely supported, its l | ||||
ack of flexibility | ||||
in requiring a single monotonic hierarchy of perm | ||||
issions means that | ||||
other | ||||
session-based command authorization schemes | ||||
have evolved. However, it is still | ||||
common enough that it SHOULD be supported by | ||||
servers. | ||||
</t> | ||||
</section> | ||||
<section anchor="TACACSSecurity" title="Security Considerations"> | ||||
<t> | <t> The privilege levels scheme is built into the protocol and has been | |||
The original TACACS+ Draft | extensively used as an option for Session-based shell authorization. | |||
<xref target="TheDraft">`The Draft'</xref> | ||||
from 1998 did not address all of the | ||||
key security concerns which are | ||||
considered when designing modern | ||||
standards. This section addresses | ||||
known limitations and concerns | ||||
which will impact overall security of | ||||
the protocol and systems where | ||||
this protocol is deployed to manage | ||||
central authentication, | ||||
authorization or accounting for network | ||||
device administration. | ||||
</t> | Privilege levels are ordered values from 0 to 15 with each level being a | |||
<t> | superset of the next lower value. Configuration and implementation of the | |||
client will map actions (such as the permission to execute specific commands) | ||||
to different privilege levels. The allocation of commands to privilege levels | ||||
is highly dependent upon the deployment. Common allocations are as follows: | ||||
</t> | ||||
<ul empty="true" spacing="normal"> | ||||
<li> | ||||
TAC_PLUS_PRIV_LVL_MIN := | ||||
0x00. The level normally | ||||
allocated to an | ||||
unauthenticated session. | ||||
</li> | ||||
<li> | ||||
TAC_PLUS_PRIV_LVL_USER := | ||||
0x01. The level normally | ||||
allocated to a regular | ||||
authenticated session. | ||||
</li> | ||||
<li> | ||||
TAC_PLUS_PRIV_LVL_ROOT := | ||||
0x0f. The level normally | ||||
allocated to a session | ||||
authenticated by a highly | ||||
privileged user to allow | ||||
commands with significant | ||||
system impact. | ||||
</li> | ||||
<li> | ||||
TAC_PLUS_PRIV_LVL_MAX := | ||||
0x0f. The highest privilege | ||||
level. | ||||
</li> | ||||
</ul> | ||||
<t> | ||||
Multiple implementations of the protocol describe | A privilege level can be assigned to a shell (exec) session when it | |||
d in the original | starts. The client will permit the actions associated with this level to be | |||
TACACS+ Draft | executed. This privilege level is returned by the server in a session-based | |||
<xref target="TheDraft">`The Draft'</xref> | shell authorization (when "service" equals "shell" and "cmd" is empty). When | |||
have been | a user is required to perform actions that are mapped to a higher privilege | |||
deployed. As the protocol was never standardized, | level, an ENABLE-type reauthentication can be initiated by the client. | |||
current | The client will insert the required privilege level into the authentication | |||
implementations may be incompatible in non-obviou | header for ENABLE authentication requests. | |||
s ways, giving rise | </t> | |||
to additional security risks. This section does n | ||||
ot claim to | ||||
enumerate all possible security | ||||
vulnerabilities. | ||||
</t> | <t> | |||
<section anchor="SecurityofTheProtocol" title="General Se | The use of privilege levels to determine session-based access to | |||
curity of the Protocol"> | commands and resources is not mandatory for clients. Although the | |||
<t> | privilege-level scheme is widely supported, its lack of flexibility in | |||
TACACS+ protocol does not include a secur | requiring a single monotonic hierarchy of permissions means that other | |||
ity mechanism that would | session-based command authorization schemes have evolved. However, it | |||
meet | is still common enough that it <bcp14>SHOULD</bcp14> be supported by | |||
modern-day requirements. These security m | servers. | |||
echanisms would be | </t> | |||
best referred to | </section> | |||
as “obfuscation” and not “encryption” sin | <section anchor="TACACSSecurity" numbered="true" toc="default"> | |||
ce they | <name>Security Considerations</name> | |||
provide no | <t> | |||
meaningful | "The Draft" <xref target="THE-DRAFT" | |||
integrity, privacy or replay protection. | format="default"/> from 1998 did not address all of the key security concerns | |||
An | that are considered when designing modern standards. This section addresses | |||
attacker with access to the data | known limitations and concerns that will impact overall security of the | |||
stream should be assumed to be able | protocol and systems where this protocol is deployed to manage central | |||
to read and modify all TACACS+ | authentication, authorization, or accounting for network Device | |||
packets. | Administration. | |||
Without mitigation, a range | ||||
of risks such as the following are possib | ||||
le: | ||||
</t> | ||||
<t> | ||||
<list> | ||||
<t> | ||||
Accounting information ma | ||||
y be modified by the man-in-the-middle | ||||
attacker, | ||||
making such logs unsuitab | ||||
le and not trustable for | ||||
auditing | ||||
purposes. | ||||
</t> | ||||
<t> | ||||
Invalid or misleading val | ||||
ues may be inserted by the | ||||
man-in-the-middle attacke | ||||
r | ||||
in various fields at know | ||||
n offsets to | ||||
try and circumvent the | ||||
authentication or | ||||
authorization checks even | ||||
inside the obfuscated bod | ||||
y. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
While the protocol provides some measure | ||||
of transport privacy, it | ||||
is | ||||
vulnerable to at least the following atta | ||||
cks: | ||||
</t> | ||||
<t> | ||||
<list> | ||||
<t> | </t> | |||
Brute force attacks explo | <t> | |||
iting increased efficiency of MD5 | ||||
digest | ||||
computation. | ||||
</t> | ||||
<t> | ||||
Known plaintext attacks w | ||||
hich may decrease the cost of brute | ||||
force | ||||
attack. | ||||
</t> | ||||
<t> | ||||
Chosen plaintext attacks | ||||
which may decrease the cost of a brute | ||||
force | ||||
attack. | ||||
</t> | ||||
<t> | ||||
No forward secrecy. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
Even though, to the best knowledge of aut | ||||
hors, this method of | ||||
encryption | ||||
wasn’t rigorously tested, enough | ||||
information is | ||||
available | ||||
that it is best referred to as | ||||
“obfuscation” and not | ||||
“encryption”. | ||||
</t> | ||||
<t> | ||||
For these reasons, users deploying TACACS | ||||
+ protocol in their | ||||
environments | ||||
MUST limit access to known clients and MU | ||||
ST control the | ||||
security of | ||||
the entire transmission path. Attackers w | ||||
ho can guess | ||||
the | ||||
key or | ||||
otherwise break the obfuscation will gain | ||||
unrestricted and | ||||
undetected | ||||
access to all TACACS+ traffic. Ensuring t | ||||
hat a | ||||
centralized AAA system like TACACS+ is de | ||||
ployed on a secured | ||||
transport is essential to managing the se | ||||
curity risk of such | ||||
an | ||||
attack. | ||||
</t> | ||||
<t> | ||||
The following parts of this section enume | ||||
rate only the | ||||
session-specific | ||||
risks which are in addition to general ri | ||||
sk | ||||
associated with bare | ||||
obfuscation and lack of integrity checkin | ||||
g. | ||||
</t> | Multiple implementations of the protocol described in | |||
"The Draft" <xref target="THE-DRAFT" format="default"/> | ||||
have been deployed. As the protocol was never standardized, current | ||||
implementations may be incompatible in non-obvious ways, giving rise | ||||
to additional security risks. This section does not claim to enumerate | ||||
all possible security vulnerabilities. | ||||
</section> | </t> | |||
<section anchor="SecurityofAuthenticationSessions" title= | <section anchor="SecurityofTheProtocol" numbered="true" toc="default"> | |||
"Security of Authentication Sessions"> | <name>General Security of the Protocol</name> | |||
<t> | ||||
The TACACS+ protocol does not include a security mechanism that would mee | ||||
t | ||||
modern-day requirements. These security mechanisms would be best | ||||
referred to as "obfuscation" and not "encryption", since they provide | ||||
no meaningful integrity, privacy, or replay protection. An attacker | ||||
with access to the data stream should be assumed to be able to read | ||||
and modify all TACACS+ packets. Without mitigation, a range of risks | ||||
such as the following are possible: | ||||
</t> | ||||
<ul empty="false" spacing="normal"> | ||||
<li> | ||||
Accounting information may be modified by the man-in-the-middle | ||||
attacker, making such logs unsuitable and not trustable for auditing | ||||
purposes. | ||||
</li> | ||||
<li> | ||||
Invalid or misleading values may be inserted by the man-in-the-middle | ||||
attacker in various fields at known offsets to try and circumvent the | ||||
authentication or authorization checks even inside the obfuscated | ||||
body. | ||||
</li> | ||||
</ul> | ||||
<t> | ||||
While the protocol provides some measure of transport privacy, it is | ||||
vulnerable to at least the following attacks: | ||||
</t> | ||||
<ul empty="false" spacing="normal"> | ||||
<li> | ||||
Brute-force attacks exploiting increased efficiency of MD5 digest computation. | ||||
</li> | ||||
<li> | ||||
Known plaintext attacks that may decrease the cost of brute-force | ||||
attacks. | ||||
</li> | ||||
<li> | ||||
Chosen plaintext attacks that may decrease the cost of a brute-force | ||||
attacks. | ||||
</li> | ||||
<li> | ||||
No forward secrecy. | ||||
</li> | ||||
</ul> | ||||
<t> | ||||
Even though, to the best knowledge of the authors, this method of encryption | ||||
wasn't rigorously tested, enough information is available that it is best | ||||
referred to as "obfuscation" and not "encryption". | ||||
</t> | ||||
<t> | ||||
For these reasons, users deploying the TACACS+ protocol in their | ||||
environments <bcp14>MUST</bcp14> limit access to known clients and | ||||
<bcp14>MUST</bcp14> control the security of the entire transmission | ||||
path. Attackers who can guess the key or otherwise break the | ||||
obfuscation will gain unrestricted and undetected access to all | ||||
TACACS+ traffic. Ensuring that a centralized AAA system like TACACS+ | ||||
is deployed on a secured transport is essential to managing the | ||||
security risk of such an attack. | ||||
</t> | ||||
<t> | ||||
The following parts of this section | ||||
enumerate only the session-specific | ||||
risks that are in addition to general | ||||
risk associated with bare obfuscation | ||||
and lack of integrity checking. | ||||
<t> | </t> | |||
Authentication sessions SHOULD be used vi | </section> | |||
a a secure transport (see | <section anchor="SecurityofAuthenticationSessions" numbered="true" toc="de | |||
<xref target="Bestpractices">Best Practic | fault"> | |||
es section</xref>) | <name>Security of Authentication Sessions</name> | |||
as | <t> | |||
the | Authentication sessions <bcp14>SHOULD</bcp14> be used via a secure | |||
man-in-the-middle attack may completely s | transport (see "TACACS+ Best Practices" (<xref target="Bestpractices" | |||
ubvert them. Even | format="default"></xref>)) as the man-in-the-middle attack may | |||
CHAP, | completely subvert them. Even CHAP, which may be considered resistant to | |||
which may be considered resistant to pass | password | |||
word interception, is | interception, is unsafe as it does not protect the username from a | |||
unsafe | trivial man-in-the-middle attack. | |||
as it does not protect the username from | </t> | |||
a trivial | <t> | |||
man-in-the-middle | This document deprecates the redirection mechanism using the | |||
attack. | TAC_PLUS_AUTHEN_STATUS_FOLLOW option, which was included in "The Draft". As | |||
</t> | part of this process, the secret key for a new server was sent to the | |||
<t> | client. This public exchange of secret keys means that once one session is | |||
This document deprecates the redirection | broken, it may be possible to leverage that key to attacking connections to | |||
mechanism using the | other servers. This mechanism <bcp14>MUST NOT</bcp14> be used in modern | |||
TAC_PLUS_AUTHEN_STATUS_FOLLOW option whic | deployments. It <bcp14>MUST NOT</bcp14> be used outside a secured deployment. | |||
h was included in the | </t> | |||
original draft. As part of this process, | </section> | |||
the secret key for a new | <section anchor="SecurityofAuthorizationSessions" numbered="true" toc="def | |||
server was | ault"> | |||
sent to the client. This public exchange | <name>Security of Authorization Sessions</name> | |||
of secret keys | <t> | |||
means that once | Authorization sessions <bcp14>SHOULD</bcp14> be used via a secure | |||
one session is broken, it may be possible | transport (see "TACACS+ Best Practices" (<xref target="Bestpractices" | |||
to | format="default"></xref>)) as it's trivial to execute a successful | |||
leverage that key to | man-in-the-middle attack that changes well-known plaintext in either | |||
attacking connections to other servers. | requests or responses. | |||
This | </t> | |||
mechanism MUST NOT be used in | <t> | |||
modern deployments. It MUST NOT be | As an example, take the field "authen_method". It's not unusual in | |||
used outside a secured deployment. | actual deployments to authorize all commands received via the device | |||
</t> | local serial port (a console port), as that one is usually considered | |||
</section> | secure by virtue of the device located in a physically secure | |||
<section anchor="SecurityofAuthorizationSessions" title=" | location. If an administrator would configure the authorization system | |||
Security of Authorization Sessions"> | to allow all commands entered by the user on a local console to aid in | |||
<t> | troubleshooting, that would give all access to all commands to any | |||
Authorization sessions SHOULD be used via | attacker that would be able to change the "authen_method" from | |||
a secure transport (see | TAC_PLUS_AUTHEN_METH_TACACSPLUS to TAC_PLUS_AUTHEN_METH_LINE. In this | |||
<xref target="Bestpractices">Best Practic | regard, the obfuscation provided by the protocol itself wouldn't help | |||
es section</xref>) | much, because: | |||
as | </t> | |||
it’s | <ul empty="false" spacing="normal"> | |||
trivial to execute a successful man-in-th | <li> | |||
e-middle attacks | A lack of integrity means that any byte in the payload may be changed | |||
that | without either side detecting the change. | |||
changes | </li> | |||
well-known plaintext in either requests o | <li> | |||
r responses. | Known plaintext means that an attacker would know with certainty which | |||
</t> | octet is the target of the attack (in this case, first octet after the | |||
<t> | header). | |||
As an example, take the field “authen_met | </li> | |||
hod”. It’s not unusual | <li> | |||
in | In combination with known plaintext, the attacker can determine with | |||
actual deployments to authorize all comma | certainty the value of the crypto-pad octet used to obfuscate the | |||
nds received via the | original octet. | |||
device | ||||
local serial port (a console port) as tha | ||||
t one is usually | ||||
considered | ||||
secure by virtue of the device located in | ||||
a physically | ||||
secure | ||||
location. If an administrator would confi | ||||
gure the | ||||
authorization | ||||
system to allow all commands entered by t | ||||
he user on a | ||||
local console | ||||
to aid in troubleshooting, that would giv | ||||
e all access | ||||
to all | ||||
commands | ||||
to any attacker that would be able to cha | ||||
nge the | ||||
“authen_method” from | ||||
TAC_PLUS_AUTHEN_METH_TACACSPLUS to | ||||
TAC_PLUS_AUTHEN_METH_LINE. In | ||||
this | ||||
regard, the obfuscation provided | ||||
by the protocol itself wouldn’t help | ||||
much, because: | ||||
</t> | ||||
<t> | ||||
<list> | ||||
<t> | ||||
Lack of integrity means t | ||||
hat any byte in the payload may be | ||||
changed | ||||
without | ||||
either side detecting the | ||||
change. | ||||
</t> | ||||
<t> | ||||
Known plaintext means tha | ||||
t an attacker would know with | ||||
certainty which | ||||
octet is the target of th | ||||
e attack (in this case, | ||||
1st octet after | ||||
the | ||||
header). | ||||
</t> | ||||
<t> | ||||
In combination with known | ||||
plaintext, the attacker can determine | ||||
with | ||||
certainty the value of th | ||||
e crypto-pad octet used to obfuscate | ||||
the | ||||
original octet. | ||||
</t> | </li> | |||
</list> | </ul> | |||
</t> | </section> | |||
</section> | <section anchor="SecurityofAccountingSessions" numbered="true" toc="defaul | |||
<section anchor="SecurityofAccountingSessions" title="Sec | t"> | |||
urity of Accounting Sessions"> | <name>Security of Accounting Sessions</name> | |||
<t>Accounting sessions SHOULD be used via a secur | <t>Accounting sessions <bcp14>SHOULD</bcp14> be used via a secure | |||
e transport (see | transport (see "TACACS+ Best Practices" (<xref | |||
Best Practices section (Section 10.5). Al | target="Bestpractices"></xref>)). Although Accounting sessions are not | |||
though Accounting sessions | directly involved in authentication or authorizing operations on the | |||
are not directly involved in authenticati | device, man-in-the-middle attackers may do any of the following: | |||
on | </t> | |||
or | <ul empty="false" spacing="normal"> | |||
authorizing operations | <li> | |||
on the device, man-in-the-middle | ||||
attacker may do any of the | ||||
following: | ||||
</t> | ||||
<t> | ||||
<list> | ||||
<t> | ||||
Replace accounting data w | ||||
ith new valid or garbage which | ||||
can | ||||
confuse auditors or hide | ||||
information related to | ||||
their | ||||
authentication | ||||
and/or authorization atta | ||||
ck attempts. | ||||
</t> | ||||
<t> | ||||
Try and poison accounting | ||||
log with entries designed to make | ||||
systems | ||||
behave in unintended ways | ||||
(which includes TACACS+ server | ||||
and any | ||||
other systems that would | ||||
manage accounting entries). | ||||
</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
In addition to these direct manipulations | ||||
, different client | ||||
implementations pass different fidelity o | ||||
f accounting data. Some | ||||
vendors have been observed in the wild th | ||||
at pass sensitive data | ||||
like | ||||
passwords, encryption keys and similar as | ||||
part of the | ||||
accounting log. | ||||
Due to lack of strong encryption with per | ||||
fect | ||||
forward secrecy, this | ||||
data may be revealed in future, leading t | ||||
o a | ||||
security incident. | ||||
</t> | Replace accounting data with new valid values or garbage that can confuse | |||
</section> | auditors or hide information related to their authentication and/or | |||
authorization attack attempts. | ||||
</li> | ||||
<li> | ||||
<section anchor="Bestpractices" title="TACACS+ Best Pract | Try and poison an accounting log with entries designed to make systems | |||
ices"> | behave in unintended ways (these systems could be TACACS+ servers and any | |||
other | ||||
systems that would manage accounting entries). | ||||
</li> | ||||
</ul> | ||||
<t> | ||||
In addition to these direct manipulations, different client | ||||
implementations pass a different fidelity of accounting data. Some | ||||
vendors have been observed in the wild that pass sensitive data like | ||||
passwords, encryption keys, and the like as part of the accounting log. | ||||
Due to a lack of strong encryption with perfect forward secrecy, this | ||||
data may be revealed in the future, leading to a security incident. | ||||
<t>With respect to the observations about the sec | </t> | |||
urity issues | </section> | |||
described above, a network administrator | <section anchor="Bestpractices" numbered="true" toc="default"> | |||
MUST NOT rely on the | <name>TACACS+ Best Practices</name> | |||
obfuscation of the TACACS+ protocol. TACA | <t>With respect to the observations about the security issues | |||
CS+ MUST be used within a secure deployment: TACACS+ MUST be deployed | described above, a network administrator <bcp14>MUST NOT</bcp14> | |||
over networks which ensure privacy and in | rely on the obfuscation of the TACACS+ protocol. TACACS+ | |||
tegrity of the | <bcp14>MUST</bcp14> be used within a secure deployment; TACACS+ | |||
communication, and MUST be deployed over | <bcp14>MUST</bcp14> be deployed over networks that ensure privacy and | |||
a network which is separated | integrity of the communication and <bcp14>MUST</bcp14> be deployed | |||
from | over a network that is separated from other traffic. Failure to do | |||
other traffic. | so will impact overall network security.</t> | |||
Failure to do so will impact overall netw | <t>The following recommendations impose restrictions on how the | |||
ork security.</t> | protocol is applied. These restrictions were not imposed in "The | |||
Draft". New implementations, and upgrades of current implementations, | ||||
<bcp14>MUST</bcp14> implement these recommendations. Vendors | ||||
<bcp14>SHOULD</bcp14> provide mechanisms to assist the administrator | ||||
to achieve these best practices.</t> | ||||
<t>The following recommendations impose restricti | <section anchor="SharedSecrets" numbered="true" toc="default"> | |||
ons on how the | ||||
protocol is applied. These restrictions w | ||||
ere not imposed in the | ||||
original draft. New implementations, and | ||||
upgrades of current | ||||
implementations, MUST implement these rec | ||||
ommendations. Vendors | ||||
SHOULD provide mechanisms to assist the a | ||||
dministrator to achieve | ||||
these best practices.</t> | ||||
<section anchor="SharedSecrets" title="Shared Sec | <name>Shared Secrets</name> | |||
rets"> | <t>TACACS+ servers and clients <bcp14>MUST</bcp14> treat shared | |||
secrets as sensitive data to be managed securely, as would be | ||||
expected for other sensitive data such as identity credential | ||||
information. TACACS+ servers <bcp14>MUST NOT</bcp14> leak sensitive | ||||
data. | ||||
</t> | ||||
<t> | ||||
For example: | ||||
</t> | ||||
<t>TACACS+ servers and clients MUST treat | <ul> | |||
shared secrets as | <li> | |||
sensitive data to be managed secu | <t> TACACS+ servers <bcp14>MUST NOT</bcp14> expose shared secrets in | |||
rely, as would be expected for | logs. | |||
other sensitive data such as iden | </t> | |||
tity credential information. | ||||
TACACS+ servers MUST NOT leak sen | ||||
sitive data. For example, TACACS+ | ||||
servers MUST NOT expose shared se | ||||
crets in logs. | ||||
</t> | ||||
<t>TACACS+ servers MUST allow a dedicated | </li> | |||
secret key to be defined | <li> | |||
<t>TACACS+ servers <bcp14>MUST</bcp14> allow a dedicated secret key to | ||||
be defined | ||||
for each client. | for each client. | |||
</t> | </t> | |||
</li> | ||||
<t>TACACS+ server management systems MUST | <li> | |||
provide a mechanism to track secret | <t>TACACS+ server management systems <bcp14>MUST</bcp14> provide a | |||
key lifetimes and notify administrator | mechanism to track secret key lifetimes and notify administrators to | |||
s to update them periodically. TACACS+ | update them periodically. TACACS+ server administrators | |||
server administrators SHOULD change se | <bcp14>SHOULD</bcp14> change secret keys at regular intervals. </t> | |||
cret keys at regular intervals. </t> | </li> | |||
<li> | ||||
<t>TACACS+ servers SHOULD warn administra | ||||
tors if secret keys are | ||||
not unique per client.</t> | ||||
<t>TACACS+ server administrators SHOULD a | ||||
lways define a secret for | ||||
each client.</t> | ||||
<t>TACACS+ servers and clients MUST suppo | <t>TACACS+ servers <bcp14>SHOULD</bcp14> warn administrators if | |||
rt shared keys that are at | secret keys are not unique per client.</t> | |||
</li> | ||||
<li> | ||||
<t>TACACS+ server administrators <bcp14>SHOULD</bcp14> always define | ||||
a secret for each client.</t> | ||||
</li> | ||||
<li> | ||||
<t>TACACS+ servers and clients <bcp14>MUST</bcp14> support shared keys | ||||
that are at | ||||
least 32 characters long. | least 32 characters long. | |||
</t> | </t> | |||
</li> | ||||
<t>TACACS+ servers MUST support policy to | <li> | |||
define minimum complexity | <t>TACACS+ servers <bcp14>MUST</bcp14> support policy to define | |||
for shared keys. | minimum complexity for shared keys. | |||
</t> | </t> | |||
</li> | ||||
<t>TACACS+ clients SHOULD NOT allow serve | <li> | |||
rs to be configured | <t>TACACS+ clients <bcp14>SHOULD NOT</bcp14> allow servers to be | |||
without shared secret key, or sha | configured without a shared secret key or shared key that is less | |||
red key that is less than 16 | than 16 characters long.</t> | |||
characters long.</t> | </li> | |||
<li> | ||||
<t>TACACS+ server administrators SHOULD c | ||||
onfigure secret keys of | ||||
minimum 16 characters length.</t> | ||||
</section> | ||||
<section anchor="Connections" title="Connections | ||||
and Obfuscation"> | ||||
<t>TACACS+ servers MUST allow the definit | ||||
ion of individual clients. | ||||
The servers MUST only accept netw | ||||
ork connection attempts from | ||||
these defined, known clients.</t> | ||||
<t>TACACS+ servers MUST reject connection | ||||
s with | ||||
TAC_PLUS_UNENCRYPTED_FLAG set. Th | ||||
ere MUST always be a shared secret set | ||||
on the server for the client requ | ||||
esting the connection.</t> | ||||
<t>If an invalid shared secret is detecte | ||||
d when processing packets | ||||
for a client, TACACS+ servers MUS | ||||
T NOT accept any new sessions on | ||||
that connection. TACACS+ servers | ||||
MUST terminate the connection on | ||||
completion of any sessions that w | ||||
ere previously established with a | ||||
valid shared secret on that conne | ||||
ction.</t> | ||||
<t>TACACS+ clients MUST NOT set TAC_PLUS_ | ||||
UNENCRYPTED_FLAG. Clients MUST be implemented in a way that | ||||
requires explicit configuration t | ||||
o enable the use of | ||||
TAC_PLUS_UNENCRYPTED_FLAG, this o | ||||
ption MUST NOT be used when the client is in production </t> | ||||
<t>When a TACACS+ client receives respons | ||||
es from servers where:</t> | ||||
<t> | ||||
<list> | ||||
<t> the response packet w | ||||
as received from the server configured | ||||
with shared | ||||
key, but the pack | ||||
et has TAC_PLUS_UNENCRYPTED_FLAG | ||||
set. | ||||
</t> | ||||
<t> the response packet w | ||||
as received from the server configured | ||||
not to use | ||||
obfuscation, but | ||||
the packet has | ||||
TAC_PLUS_UNENCRYP | ||||
TED_FLAG not set. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
<t>then the TACACS+ client MUST close TCP | ||||
session, and process the | ||||
response in the same | ||||
way that a TAC_PLUS_AUTHEN_STATUS | ||||
_FAIL | ||||
(authentication sessions) | ||||
or TAC_PLUS_AUTHOR_STATUS_FAIL | ||||
(authorization sessions) was | ||||
received.</t> | ||||
</section> | ||||
<section anchor="AuthenticationRecommendations" t | ||||
itle="Authentication"> | ||||
<t>To help TACACS+ administrators select | ||||
less weak | ||||
authentication | ||||
options, | ||||
TACACS+ servers MUST allow the ad | ||||
ministrator | ||||
to configure | ||||
the | ||||
server to | ||||
only accept challenge/response op | ||||
tions for | ||||
authentication | ||||
(TAC_PLUS_AUTHEN_TYPE_CHAP or | ||||
TAC_PLUS_AUTHEN_TYPE_MSCHAP or | ||||
TAC_PLUS_AUTHEN_TYPE_MSCHAPV2 for | ||||
authen_type).</t> | ||||
<t>TACACS+ server administrators SHOULD e | ||||
nable the option mentioned | ||||
in the previous paragraph. TACACS | ||||
+ Server deployments SHOULD ONLY | ||||
enable other options (such as TAC | ||||
_PLUS_AUTHEN_TYPE_ASCII or | ||||
TAC_PLUS_AUTHEN_TYPE_PAP) when un | ||||
avoidable due to requirements of | ||||
identity/password systems.</t> | ||||
<t>TACACS+ server administrators SHOULD N | ||||
OT allow the same | ||||
credentials to be applied in chal | ||||
lenge-based | ||||
(TAC_PLUS_AUTHEN_TYPE_CHAP or TAC | ||||
_PLUS_AUTHEN_TYPE_MSCHAP or | ||||
TAC_PLUS_AUTHEN_TYPE_MSCHAPV2) an | ||||
d non challenge-based authen_type | ||||
options as the insecurity of the | ||||
latter will compromise the | ||||
security of the former.</t> | ||||
<t>TAC_PLUS_AUTHEN_SENDAUTH and TAC_PLUS_ | ||||
AUTHEN_SENDPASS options | ||||
mentioned in the original draft S | ||||
HOULD NOT be used, due to their | ||||
security implications. TACACS+ se | ||||
rvers SHOULD NOT implement them. | ||||
If they must be implemented, the | ||||
servers MUST default to the | ||||
options being disabled and MUST w | ||||
arn the administrator that these | ||||
options are not secure.</t> | ||||
</section> | ||||
<section anchor="AuthorizationRecommendations" ti | ||||
tle="Authorization"> | ||||
<t>The authorization and accounting featu | ||||
res are intended to | ||||
provide extensibility and flexibi | ||||
lity. There is a base dictionary | ||||
defined in this document, but it | ||||
may be extended in deployments by | ||||
using new argument names. The cos | ||||
t of the flexibility is that | ||||
administrators and implementers M | ||||
UST ensure that the argument and | ||||
value pairs shared between the cl | ||||
ients and servers have consistent | ||||
interpretation.</t> | ||||
<t>TACACS+ clients that receive an unreco | <t>TACACS+ server administrators <bcp14>SHOULD</bcp14> configure | |||
gnized mandatory argument | secret keys of a minimum of 16 characters in length.</t> | |||
MUST evaluate server response as | </li> | |||
if they received | </ul> | |||
TAC_PLUS_AUTHOR_STATUS_FAIL.</t> | ||||
</section> | </section> | |||
<section anchor="Connections" numbered="true" toc="default"> | ||||
<name>Connections and Obfuscation</name> | ||||
<t>TACACS+ servers <bcp14>MUST</bcp14> allow the definition of | ||||
individual clients. The servers <bcp14>MUST</bcp14> only accept | ||||
network connection attempts from these defined known clients.</t> | ||||
<t>TACACS+ servers <bcp14>MUST</bcp14> reject connections | ||||
that have | ||||
TAC_PLUS_UNENCRYPTED_FLAG set. There <bcp14>MUST</bcp14> always be a | ||||
shared secret set on the server for the client requesting the | ||||
connection.</t> | ||||
<t>If an invalid shared secret is detected when processing packets | ||||
for a client, TACACS+ servers <bcp14>MUST NOT</bcp14> accept any new | ||||
sessions on that connection. TACACS+ servers <bcp14>MUST</bcp14> | ||||
terminate the connection on completion of any sessions that were | ||||
previously established with a valid shared secret on that | ||||
connection.</t> | ||||
<t>TACACS+ clients <bcp14>MUST NOT</bcp14> set | ||||
TAC_PLUS_UNENCRYPTED_FLAG. Clients <bcp14>MUST</bcp14> be | ||||
implemented in a way that requires explicit configuration to enable | ||||
the use of TAC_PLUS_UNENCRYPTED_FLAG. This option <bcp14>MUST | ||||
NOT</bcp14> be used when the client is in production.</t> | ||||
<section anchor="RedirectionMechanism" title="Red | <t>When a TACACS+ client receives responses from servers where:</t> | |||
irection Mechanism"> | <ul empty="false" spacing="normal"> | |||
<li>the response packet was received from the server configured | ||||
with a shared key, but the packet has TAC_PLUS_UNENCRYPTED_FLAG | ||||
set, and | ||||
<t>The original draft described a redirec | </li> | |||
tion mechanism | <li>the response packet was received from the server configured | |||
(TAC_PLUS_AUTHEN_STATUS_FOLLOW). | not to use obfuscation, but the packet has | |||
This feature is difficult to | TAC_PLUS_UNENCRYPTED_FLAG not set, | |||
secure. The option to send secret | ||||
keys in the server list is | ||||
particularly insecure, as it can | ||||
reveal client shared secrets.</t> | ||||
<t>TACACS+ servers MUST deprecate the red | </li> | |||
irection mechanism.</t> | </ul> | |||
<t>the TACACS+ client <bcp14>MUST</bcp14> close the TCP | ||||
session, and process the response in the same way that a | ||||
TAC_PLUS_AUTHEN_STATUS_FAIL (authentication sessions) or | ||||
TAC_PLUS_AUTHOR_STATUS_FAIL (authorization sessions) was | ||||
received.</t> | ||||
</section> | ||||
<section anchor="AuthenticationRecommendations" numbered="true" toc="def | ||||
ault"> | ||||
<name>Authentication</name> | ||||
<t>To help TACACS+ administrators select stronger authentication | ||||
options, TACACS+ servers <bcp14>MUST</bcp14> allow the administrator | ||||
to configure the server to only accept challenge/response options | ||||
for authentication (TAC_PLUS_AUTHEN_TYPE_CHAP or | ||||
TAC_PLUS_AUTHEN_TYPE_MSCHAP or TAC_PLUS_AUTHEN_TYPE_MSCHAPV2 for | ||||
authen_type).</t> | ||||
<t>TACACS+ server administrators <bcp14>SHOULD</bcp14> enable the | ||||
option mentioned in the previous paragraph. | ||||
<t>If the redirection mechanism is implem | TACACS+ server deployments <bcp14>SHOULD</bcp14> only enable other | |||
ented then TACACS+ servers | options (such as TAC_PLUS_AUTHEN_TYPE_ASCII or | |||
MUST disable it by default, and M | TAC_PLUS_AUTHEN_TYPE_PAP) when unavoidable due to requirements of | |||
UST warn TACACS+ server | identity/password systems.</t> | |||
administrators that it must only | <t>TACACS+ server administrators <bcp14>SHOULD NOT</bcp14> allow the | |||
be enabled within a secure | same credentials to be applied in challenge-based | |||
deployment due to the risks of re | (TAC_PLUS_AUTHEN_TYPE_CHAP or TAC_PLUS_AUTHEN_TYPE_MSCHAP or | |||
vealing shared secrets.</t> | TAC_PLUS_AUTHEN_TYPE_MSCHAPV2) and non-challenge-based authen_type | |||
options, as the insecurity of the latter will compromise the security | ||||
of the former.</t> | ||||
<t>TACACS+ clients SHOULD deprecate this | <t>TAC_PLUS_AUTHEN_SENDAUTH and TAC_PLUS_AUTHEN_SENDPASS options | |||
feature by treating | mentioned in "The Draft" <bcp14>SHOULD | |||
NOT</bcp14> be used due to their security implications. TACACS+ | ||||
servers <bcp14>SHOULD NOT</bcp14> implement them. If they must be | ||||
implemented, the servers <bcp14>MUST</bcp14> default to the options | ||||
being disabled and <bcp14>MUST</bcp14> warn the administrator that | ||||
these options are not secure.</t> | ||||
</section> | ||||
<section anchor="AuthorizationRecommendations" numbered="true" toc="defa | ||||
ult"> | ||||
<name>Authorization</name> | ||||
<t>The authorization and accounting features are intended to provide | ||||
extensibility and flexibility. There is a base dictionary defined in | ||||
this document, but it may be extended in deployments by using new | ||||
argument names. The cost of the flexibility is that administrators | ||||
and implementers <bcp14>MUST</bcp14> ensure that the argument and | ||||
value pairs shared between the clients and servers have consistent | ||||
interpretation.</t> | ||||
<t>TACACS+ clients that receive an unrecognized mandatory argument | ||||
<bcp14>MUST</bcp14> evaluate server response as if they received | ||||
TAC_PLUS_AUTHOR_STATUS_FAIL.</t> | ||||
</section> | ||||
<section anchor="RedirectionMechanism" numbered="true" toc="default"> | ||||
<name>Redirection Mechanism</name> | ||||
<t>"The Draft" described a redirection mechanism | ||||
(TAC_PLUS_AUTHEN_STATUS_FOLLOW). This feature is difficult to | ||||
secure. The option to send secret keys in the server list is | ||||
particularly insecure, as it can reveal client shared secrets.</t> | ||||
<t>TACACS+ servers <bcp14>MUST</bcp14> deprecate the redirection mecha | ||||
nism.</t> | ||||
<t>If the redirection mechanism is implemented, then TACACS+ servers | ||||
<bcp14>MUST</bcp14> disable it by default and <bcp14>MUST</bcp14> | ||||
warn TACACS+ server administrators that it must only be enabled | ||||
within a secure deployment due to the risks of revealing shared | ||||
secrets.</t> | ||||
<t>TACACS+ clients <bcp14>SHOULD</bcp14> deprecate this feature by tre | ||||
ating | ||||
TAC_PLUS_AUTHEN_STATUS_FOLLOW as TAC_PLUS_AUTHEN_STATUS_FAIL. | TAC_PLUS_AUTHEN_STATUS_FOLLOW as TAC_PLUS_AUTHEN_STATUS_FAIL. | |||
</t> | </t> | |||
</section> | ||||
</section> | </section> | |||
</section> | ||||
</section> | <section anchor="IANAConsiderations" numbered="true" toc="default"> | |||
</section> | <name>IANA Considerations</name> | |||
<section anchor="IANAConsiderations" title="IANA Considerations"> | <t>This document has no IANA actions. | |||
<t>This informational document describes TACACS+ protocol | </t> | |||
and its | ||||
common | ||||
deployments. There is no further consideration re | ||||
quired from | ||||
IANA. | ||||
</t> | ||||
</section> | ||||
<section anchor="Acknowledgements" title="Acknowledgements"> | ||||
<t>The authors would like to thank the following reviewer | ||||
s whose | ||||
comments and contributions made considerable impr | ||||
ovements to the | ||||
document: Alan DeKok, Alexander Clouter, Chris Ja | ||||
nicki, Tom Petch, | ||||
Robert Drake, John Heasley, among many others. | ||||
</t> | ||||
<t> | ||||
The authors would particularly like to thank Alan | ||||
DeKok, who | ||||
provided significant insights and recommendations | ||||
on all aspects of | ||||
the document and the protocol. Alan DeKok has ded | ||||
icated considerable | ||||
time and effort | ||||
to help improve | ||||
the | ||||
document, identifying weaknesses | ||||
and providing remediation. | ||||
</t> | ||||
<t>The authors would also like to thank the support from | ||||
the OPSAWG | ||||
Chairs and advisors, especially Joe Clarke.</t> | ||||
</section> | ||||
</middle> | ||||
<back> | ||||
<references title="Normative References"> | ||||
<reference anchor="RFC0020" target="https://www.rfc-edito | ||||
r.org/info/rfc20"> | ||||
<front> | ||||
<title>ASCII format for network interchan | ||||
ge</title> | ||||
<author initials="V.G." surname="Cerf" fu | ||||
llname="V.G. Cerf"> | ||||
<organization /> | ||||
</author> | ||||
<date year="1969" month="October" /> | ||||
</front> | ||||
<seriesInfo name="STD" value="80" /> | ||||
<seriesInfo name="RFC" value="20" /> | ||||
<seriesInfo name="DOI" value="10.17487/RFC0020" / | ||||
> | ||||
</reference> | ||||
<reference anchor='RFC1321'> | ||||
<front> | ||||
<title abbrev='MD5 Message-Digest Algorit | ||||
hm'>The MD5 Message-Digest Algorithm</title> | ||||
<author initials='R.' surname='Rivest' fu | ||||
llname='Ronald L. Rivest'> | ||||
<organization>Massachusetts Insti | ||||
tute of | ||||
Technology, (MIT) | ||||
Laboratory for Computer | ||||
Science</organization> | ||||
<address> | ||||
<postal> | ||||
<street>545 Techn | ||||
ology Square</street> | ||||
<street>NE43-324< | ||||
/street> | ||||
<city>Cambridge</ | ||||
city> | ||||
<region>MA</regio | ||||
n> | ||||
<code>02139-1986< | ||||
/code> | ||||
<country>US</coun | ||||
try> | ||||
</postal> | ||||
<phone>+1 617 253 5880</p | ||||
hone> | ||||
<email>rivest@theory.lcs. | ||||
mit.edu</email> | ||||
</address> | ||||
</author> | ||||
<date year='1992' month='April' /> | ||||
</front> | ||||
<seriesInfo name='RFC' value='1321' /> | ||||
<format type='TXT' octets='35222' | ||||
target='http://www.rfc-editor.org/rfc/rfc | ||||
1321.txt' /> | ||||
</reference> | ||||
<reference anchor="RFC1334" target="http://www.rfc-editor | ||||
.org/info/rfc1334"> | ||||
<front> | ||||
<title>PPP Authentication Protocols</titl | ||||
e> | ||||
<author initials="B." surname="Lloyd" ful | ||||
lname="B. Lloyd"> | ||||
<organization /> | ||||
</author> | ||||
<author initials="W." surname="Simpson" f | ||||
ullname="W. Simpson"> | ||||
<organization /> | ||||
</author> | ||||
<date year="1992" month="October" /> | ||||
<abstract> | ||||
<t>This document defines two prot | ||||
ocols for | ||||
Authentication: the | ||||
Password Authentication | ||||
Protocol and the Challeng | ||||
e-Handshake | ||||
Authentication Protocol. | ||||
[STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="1334" /> | ||||
<seriesInfo name="DOI" value="10.17487/RFC1334" / | ||||
> | ||||
<format type="ASCII" octets="33248" /> | ||||
</reference> | ||||
<reference anchor='RFC2119' target='https://www.rfc-edito | ||||
r.org/info/rfc2119'> | ||||
<front> | ||||
<title>Key words for use in RFCs to Indic | ||||
ate Requirement Levels</title> | ||||
<author initials='S.' surname='Bradner' f | ||||
ullname='S. Bradner'> | ||||
<organization /> | ||||
</author> | ||||
<date year='1997' month='March' /> | ||||
<abstract> | ||||
<t>In many standards track docume | ||||
nts several words are used to | ||||
signify the requirements | ||||
in the specification. These words are | ||||
often capitalized. This d | ||||
ocument defines these words as they | ||||
should be interpreted in | ||||
IETF documents. This document specifies | ||||
an Internet Best Current | ||||
Practices for the Internet Community, | ||||
and requests discussion a | ||||
nd suggestions for improvements.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name='BCP' value='14' /> | ||||
<seriesInfo name='RFC' value='2119' /> | ||||
<seriesInfo name='DOI' value='10.17487/RFC2119' / | ||||
> | ||||
</reference> | ||||
<reference anchor="RFC2433" target="http://www.rfc-editor | </section> | |||
.org/info/rfc2433"> | ||||
<front> | ||||
<title>Microsoft PPP CHAP Extensions</tit | ||||
le> | ||||
<author initials="G." surname="Zorn" full | ||||
name="G. Zorn"> | ||||
<organization /> | ||||
</author> | ||||
<author initials="S." surname="Cobb" full | ||||
name="S. Cobb"> | ||||
<organization /> | ||||
</author> | ||||
<date year="1998" month="October" /> | ||||
<abstract> | ||||
<t>The Point-to-Point Protocol (P | ||||
PP) provides a | ||||
standard method | ||||
for | ||||
transporting | ||||
multi-protocol datagrams | ||||
over point-to-point | ||||
links. | ||||
PPP defines an extensible | ||||
Link Control | ||||
Protocol and a | ||||
family of | ||||
Network Control | ||||
Protocols (NCPs) for esta | ||||
blishing and | ||||
configuring | ||||
different network-layer | ||||
protocols. This memo prov | ||||
ides | ||||
information | ||||
for | ||||
the Internet community.</ | ||||
t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="2433" /> | ||||
<seriesInfo name="DOI" value="10.17487/RFC2433" / | ||||
> | ||||
<format type="ASCII" octets="34502" /> | ||||
</reference> | ||||
<reference anchor="RFC2759" target="http://www.rfc-editor | </middle> | |||
.org/info/rfc2759"> | <back> | |||
<front> | ||||
<title>Microsoft PPP CHAP Extensions, Ver | ||||
sion 2</title> | ||||
<author initials="G." surname="Zorn" full | ||||
name="G. Zorn"> | ||||
<organization /> | ||||
</author> | ||||
<date year="2000" month="January" /> | ||||
<abstract> | ||||
<t>This document describes versio | ||||
n two of | ||||
Microsoft's PPP CHAP | ||||
dialect (MS-CHAP-V2). | ||||
MS-CHAP-V2 is similar to, | ||||
but incompatible | ||||
with, MS-CHAP version one | ||||
(MS-CHAP-V1). This | ||||
memo provides | ||||
information for the Inter | ||||
net | ||||
community.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="2759" /> | ||||
<seriesInfo name="DOI" value="10.17487/RFC2759" / | ||||
> | ||||
<format type="ASCII" octets="34178" /> | ||||
</reference> | ||||
<reference anchor="RFC3579" target="https://www.rfc-edito | <displayreference target="KERB" to="1"/> | |||
r.org/info/rfc3579"> | ||||
<front> | ||||
<title> | ||||
RADIUS (Remote Authentication Dia | ||||
l In User Service) Support For Extensible | ||||
Authentication Protocol (EAP) | ||||
</title> | ||||
<author initials="B." surname="Aboba" ful | ||||
lname="B. Aboba"> | ||||
<organization /> | ||||
</author> | ||||
<author initials="P." surname="Calhoun" f | ||||
ullname="P. Calhoun"> | ||||
<organization /> | ||||
</author> | ||||
<date year="2003" month="September" /> | ||||
<abstract> | ||||
<t> | ||||
This document defines Rem | ||||
ote Authentication Dial In User Service | ||||
(RADIUS) support for the | ||||
Extensible Authentication Protocol (EAP), | ||||
an authentication framewo | ||||
rk which supports multiple authentication | ||||
mechanisms. In the propos | ||||
ed scheme, the Network Access Server (NAS) | ||||
forwards EAP packets to a | ||||
nd from the RADIUS server, encapsulated | ||||
within EAP-Message attrib | ||||
utes. This has the advantage of allowing | ||||
the NAS to support any EA | ||||
P authentication method, without the need | ||||
for method- specific code | ||||
, which resides on the RADIUS server. While | ||||
EAP was originally develo | ||||
ped for use with PPP, it is now also in use | ||||
with IEEE 802. This memo | ||||
provides information for the Internet | ||||
community. | ||||
</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="3579" /> | ||||
<seriesInfo name="DOI" value="10.17487/RFC3579" / | ||||
> | ||||
</reference> | ||||
<reference anchor="RFC4086" target="http://www.rfc-editor | <references> | |||
.org/info/rfc4086"> | <name>References</name> | |||
<front> | <references> | |||
<title>Randomness Requirements for Securi | <name>Normative References</name> | |||
ty</title> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
<author initials="D." surname="Eastlake 3 | FC.0020.xml"/> | |||
rd" fullname="D. Eastlake 3rd"> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
<organization /> | FC.1321.xml"/> | |||
</author> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
<author initials="S." surname="Crocker" f | FC.1334.xml"/> | |||
ullname="S. Crocker"> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
<organization /> | FC.8174.xml"/> | |||
</author> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
<author initials="J." surname="Schiller" | FC.2119.xml"/> | |||
fullname="J. Schiller"> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
<organization /> | FC.2433.xml"/> | |||
</author> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
<date year="2005" month="June" /> | FC.2759.xml"/> | |||
<abstract> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
<t>Security systems are built on | FC.3579.xml"/> | |||
strong cryptographic algorithms | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
that foil pattern analysi | FC.4086.xml"/> | |||
s attempts. However, the security of | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
these systems is dependen | FC.4120.xml"/> | |||
t on generating secret quantities | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
for | FC.5952.xml"/> | |||
passwords, cryptographic | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
keys, and similar quantities. | FC.8265.xml"/> | |||
The use of | </references> | |||
pseudo-random processes t | <references> | |||
o generate secret | <name>Informative References</name> | |||
quantities can result | ||||
in pseudo-security. A sop | ||||
histicated | ||||
attacker may find it easi | ||||
er to | ||||
reproduce the environment | ||||
that | ||||
produced the secret quant | ||||
ities and | ||||
to search the resulting | ||||
small set of possibilitie | ||||
s than to locate | ||||
the quantities in | ||||
the whole of the potentia | ||||
l number space. | ||||
Choosing random | ||||
quantities to foil a reso | ||||
urceful and motivated | ||||
adversary is | ||||
surprisingly difficult. T | ||||
his document points out many | ||||
pitfalls in using poor en | ||||
tropy sources or traditional | ||||
pseudo-random number gene | ||||
ration techniques for generating | ||||
such | ||||
quantities. It recommends | ||||
the use of truly random | ||||
hardware | ||||
techniques and shows that | ||||
the existing hardware on | ||||
many systems | ||||
can be used for this purp | ||||
ose. It provides | ||||
suggestions to | ||||
ameliorate the problem wh | ||||
en a hardware | ||||
solution is not available | ||||
, | ||||
and it gives examples of | ||||
how | ||||
large such quantities nee | ||||
d to be for | ||||
some applications. This | ||||
document specifies an Int | ||||
ernet Best | ||||
Current Practices for | ||||
the Internet Community, a | ||||
nd requests | ||||
discussion and | ||||
suggestions for improveme | ||||
nts.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="4086" /> | ||||
<seriesInfo name="DOI" value="10.17487/RFC4086" / | ||||
> | ||||
<format type="ASCII" octets="25082" /> | ||||
</reference> | ||||
<reference anchor="RFC4120" target="https://www.rfc-edito | ||||
r.org/info/rfc4120"> | ||||
<front> | ||||
<title>The Kerberos Network Authenticatio | ||||
n Service (V5)</title> | ||||
<author initials="C." surname="Neuman" fu | ||||
llname="C. Neuman"> | ||||
<organization /> | ||||
</author> | ||||
<author initials="T." surname="Yu" fullna | ||||
me="T. Yu"> | ||||
<organization /> | ||||
</author> | ||||
<author initials="S." surname="Hartman" f | ||||
ullname="S. Hartman"> | ||||
<organization /> | ||||
</author> | ||||
<author initials="K." surname="Raeburn" f | ||||
ullname="K. Raeburn"> | ||||
<organization /> | ||||
</author> | ||||
<date year="2005" month="July" /> | ||||
<abstract> | ||||
<t> | ||||
This document provides an | ||||
overview and specification of Version 5 of the | ||||
Kerberos protocol, and it | ||||
obsoletes RFC 1510 to clarify aspects of | ||||
the protocol and its inte | ||||
nded use that require more detailed or | ||||
clearer explanation than | ||||
was provided in RFC 1510. This document is | ||||
intended to provide a det | ||||
ailed description of the protocol, suitable | ||||
for implementation, toget | ||||
her with descriptions of the appropriate | ||||
use of protocol messages | ||||
and fields within those messages. | ||||
[STANDARDS-TRACK] | ||||
</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="4120" /> | ||||
<seriesInfo name="DOI" value="10.17487/RFC4120" / | ||||
> | ||||
</reference> | ||||
<reference anchor="RFC5952" target="https://www.rfc-edito | <reference anchor='THE-DRAFT' target="https://tools.ietf.org/html/draft-grant-ta | |||
r.org/info/rfc5952"> | cacs-02"> | |||
<front> | <front> | |||
<title>A Recommendation for IPv6 Address | <title>The TACACS+ Protocol Version 1.78</title> | |||
Text Representation</title> | <author initials="D." surname="Carrel" fullname="D. Carrel"/> | |||
<author initials="S." surname="Kawamura" | <author initials="L." surname="Grant" fullname="Lol Grant"/> | |||
fullname="S. Kawamura"> | <date month="January" year="1997"/> | |||
<organization /> | </front> | |||
</author> | <seriesInfo name='Internet-Draft' value='draft-grant-tacacs-02' /> | |||
<author initials="M." surname="Kawashima" | </reference> | |||
fullname="M. Kawashima"> | ||||
<organization /> | ||||
</author> | ||||
<date year="2010" month="August" /> | ||||
<abstract> | ||||
<t>As IPv6 deployment increases, | ||||
there will be a dramatic increase | ||||
in the need to use IPv6 a | ||||
ddresses in text. While the IPv6 address | ||||
architecture in Section 2 | ||||
.2 of RFC 4291 describes a flexible | ||||
model for text representa | ||||
tion of an IPv6 address, this | ||||
flexibility has been caus | ||||
ing problems for operators, system | ||||
engineers, and users. Thi | ||||
s document defines a canonical textual | ||||
representation format. It | ||||
does not define a format for internal | ||||
storage, such as within a | ||||
n application or database. It is | ||||
expected that the canonic | ||||
al format will be followed by humans and | ||||
systems when representing | ||||
IPv6 addresses as text, but all | ||||
implementations must acce | ||||
pt and be able to handle any legitimate | ||||
RFC 4291 format. [STANDAR | ||||
DS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="5952" /> | ||||
<seriesInfo name="DOI" value="10.17487/RFC5952" / | ||||
> | ||||
</reference> | ||||
<reference anchor="RFC8265" target="https://www.rfc-edito | <reference anchor="TZDB" target="https://www.iana.org/time-zones"> | |||
r.org/info/rfc8265"> | <front> | |||
<front> | <title>Sources for Time Zone and Daylight Saving Time Data</title> | |||
<title>Preparation, Enforcement, and Comp | <author initials="P." surname="Eggert" fullname="Paul Eggert"/> | |||
arison of | <author initials="A." surname="Olson" fullname="Arthur Olson"/> | |||
Internationalized Strings Represe | <date year="1987"/> | |||
nting Usernames and Passwords</title> | </front> | |||
<author initials="P." surname="Saint-Andr | </reference> | |||
e" fullname="P. Saint-Andre"> | ||||
<organization /> | ||||
</author> | ||||
<author initials="A." surname="Melnikov" | ||||
fullname="A. Melnikov"> | ||||
<organization /> | ||||
</author> | ||||
<date year="2017" month="October" /> | ||||
<abstract> | ||||
<t>This document describes update | ||||
d methods for handling Unicode | ||||
strings representing user | ||||
names and passwords. The previous | ||||
approach was known as SAS | ||||
Lprep (RFC 4013) and was based on | ||||
Stringprep (RFC 3454). Th | ||||
e methods specified in this document | ||||
provide a more sustainabl | ||||
e approach to the handling of | ||||
internationalized usernam | ||||
es and passwords. This document | ||||
obsoletes RFC 7613.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8265" /> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8265" / | ||||
> | ||||
</reference> | ||||
</references> | <reference anchor="KERB"> | |||
<references title="Informative References"> | <front> | |||
<reference anchor="TheDraft" | <title>Section E.2.1: Kerberos Authentication and Authorization System</title> | |||
target="https://tools.ietf.org/html/draft-grant-t | <author initials="S." surname="Miller" fullname="Steven Miller"/> | |||
acacs-02"> | <author initials="C." surname="Neuman" fullname="Clifford Neuman"/> | |||
<front> | <author initials="J." surname="Schiller" fullname="Jeffrey Schiller"/> | |||
<title>The TACACS+ Protocol Version 1.78< | <author initials="J." surname="Saltzer" fullname="Jerry Saltzer"/> | |||
/title> | ||||
<author initials="D." surname="Carrel" fu | ||||
llname="D. Carrel" /> | ||||
<author initials="L." surname="Grant" ful | <date month="December" year="1987"/> | |||
lname="Lol Grant" /> | </front> | |||
<refcontent>MIT Project Athena</refcontent> | ||||
<refcontent>Cambridge, Massachusetts</refcontent> | ||||
<date month="June" year="1997" /> | </reference> | |||
</front> | ||||
</reference> | ||||
<reference anchor="TZDB" target="https://www.iana.org/tim | </references> | |||
e-zones"> | </references> | |||
<front> | ||||
<title>Sources for Time Zone and | ||||
Daylight Saving Time Data</title> | ||||
<author initials="P." surname="Eggert" fu | ||||
llname="D. Carrel" /> | ||||
<author initials="A." surname="Olson" ful | ||||
lname="Lol Grant" /> | ||||
<date year="1987" /> | ||||
</front> | ||||
</reference> | ||||
</references> | <section anchor="Acknowledgements" numbered="false" toc="default"> | |||
</back> | <name>Acknowledgements</name> | |||
<t>The authors would like to thank the following reviewers whose | ||||
comments and contributions made considerable improvements to this | ||||
document: <contact fullname="Alan DeKok"/>, <contact fullname="Alexander | ||||
Clouter"/>, <contact fullname="Chris Janicki"/>, <contact fullname="Tom Pe | ||||
tch"/>, | ||||
<contact fullname="Robert Drake"/>, and <contact fullname="John Heasley"/> | ||||
, among many others. | ||||
</t> | ||||
<t> | ||||
The authors would particularly like to thank | ||||
<contact fullname="Alan DeKok"/>, who provided | ||||
significant insights and recommendations on | ||||
all aspects of the document and the | ||||
protocol. <contact fullname="Alan DeKok"/> has | ||||
dedicated considerable time and effort to help | ||||
improve the document, identifying weaknesses | ||||
and providing remediation. | ||||
</t> | ||||
<t>The authors would also like to thank the support from the OPSAWG | ||||
Chairs and advisors, especially <contact fullname="Joe Clarke"/>.</t> | ||||
</section> | ||||
</back> | ||||
</rfc> | </rfc> | |||
End of changes. 209 change blocks. | ||||
4495 lines changed or deleted | 3025 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |