文章目录
- TACACS+ 简介
- 技术定义
- Tacacs+ Packets and Sessions,报文和会话
- Authentication,认证
- Authorization,授权
- Accounting,计费
- Argument-Value Pairs,属性-值对
- Privilege Levels, 权限级别
- Security Considerations, 安全注意事项
- TACACS+ Best Practices, TACACS+最佳实践:
- Tacacs+总结
参考资料:https://tools.ietf.org/html/draft-ietf-opsawg-tacacs-18
TACACS+ 简介
本文档介绍了(Terminal Access Controller Access-Control
System Plus )终端访问控制器访问控制系统增强版(TACACS +)协议。 它最初被构想为通用的身份验证,授权和计费(AAA)协议。 它在当今得到了广泛的部署,但主要限于AAA(Authentication, Authorization and Accounting )的特定子集:设备管理,即:验证对网络设备的访问,提供操作的集中授权以及审核这些操作。
大量的TACACS+客户端和服务器已经部署在生产网中。它们所基于的TACACS+协议是在一个最初打算用于IETF发布的草案文档中定义的,但从未标准化。该草案被称为“草案(The Draft)”。
该草案是时代的产物,并没有解决设计现代标准时考虑的所有关键安全问题。因此,部署必须谨慎执行。后续安全部分讨论了这些问题。
此信息性文档的主要目的是阐明“草案”的子集,这是支持设备管理的实现常见的子集。所有符合本文档的实现都将符合“草案”。然而,并不是所有符合“草案”的实现都将符合本文档。《草案》的以下功能已被删除:
- 出于安全原因,本文档正式删除了SENDPASS。
- 对遗留特性(如ARAP和outbound authtication)的规范描述已被删除。
TACACS+协议允许任意长度和内容的身份验证交换,以支持其他身份验证机制。它是可扩展的,可以提供站点定制和未来的开发特性,并且它使用TCP来确保可靠的交付。该协议允许TACACS+客户端请求(fine-grained)细粒度的访问控制,并允许服务器响应该请求的每个组件。
**认证、授权和计费的分离是TACACS+协议设计的关键。**从本质上说,它使TACACS+成为一套三种协议。本文档将分别在不同的部分对每一个问题进行讨论。尽管TACACS+定义了这三种方法,但实现或部署并不需要采用这三种方法。分离元素对于设备管理用例非常有用,特别是对于会话中单个命令的授权。请注意,在协议级别没有为认证与授权请求关联作出规定。
技术定义
本节提供了一些适用于本文档的基本定义。
-
Client,客户端
Client(客户端)是发起TACACS+协议请求以进行访问的任何设备,主要用于设备管理用例。
-
Server,服务端
服务器根据其业务模型接收TACACS+协议请求,并根据本文档中定义的流进行应答。
-
Packet,包
除非另有明确说明,否则在本文档中,Packet(包)一词的所有用法都指TACACS+协议数据单元。非正式术语“Packet”已经成为定义的一部分。
-
Connection,连接
TACACS+使用TCP进行传输。TCP服务器端口49是由IANA分配给TACACS+流量的。
-
Session,会话
整个文档都使用了会话的概念。TACACS+会话是单个认证序列、单个授权交换或单个计费交换。
一个计费和授权会话将由一对数据包(请求和它的应答)组成。认证会话可能涉及正在交换的任意数量的数据包。会话是维护在TACACS+客户机和服务器之间的操作概念。它不一定对应于给定的用户或用户操作。
-
Treatment of Enumerated Protocol Values,枚举协议值的处理
此文档描述了信息包报头中的各种枚举值以及特定信息包类型的报头。例如,在身份验证启动包类型中,本文档用三个值定义动作字段TAC_PLUS_AUTHEN_LOGIN、TAC_PLUS_AUTHEN_CHPASS和TAC_PLUS_AUTHEN_SENDAUTH。
如果服务器没有实现它所接收的包中所定义的选项之一,或者它遇到了未在该文档中列出的头字段的选项,那么它应该以错误响应并终止会话。这将允许客户端尝试不同的选项。
如果发生错误,但无法确定传入数据包的类型,则必须返回具有相同的明文报头但序列号增加1且长度设置为0的数据包来表示错误。
-
Treatment of Text Strings,文本字符串的处理
TACACS+协议大量使用了文本字符串。最初的草案打算将这些字符串作为字节数组处理,其中每个字节代表一个US-ASCII字符。
最近,服务器实现已经扩展到与外部标识服务交互,因此需要更细致的方法。Usernames必须使用RFC8265 [RFC8265]中指定的UsernameCasePreserved 配置文件进行编码和处理。
特别提到的地方,数据字段包含协议处理所需的任意字节数组。它们不打算通过用户界面对用户可见。TACACS+中的所有其他文本字段必须作为RFC 20 [RFC0020]定义的US-ASCII的可打印字节数组处理。这里使用的术语“printable,可打印”意味着字段必须排除rfc20 [RFC0020]第5.2节中定义的“控制字符”。
Tacacs+ Packets and Sessions,报文和会话
Tacacs+的报文头:
所有的TACACS+数据包都以以下12字节的头开始。报头描述了包的其余部分:
以下通用规则适用于所有TACACS+报文类型:
- 若要表示任何可变长度数据字段未使用,则将相应的长度值设置为零。这些字段必须被忽略,并像不存在一样处理。
- 数据包中的数据和消息字段的长度由它们对应的长度字段指定(不以null终止)。
- 所有长度值都是unsigned无符号的,按网络字节顺序排列。
Tacscs+报文头字端解释:
-
major_version: TACACS协议主版本号,当前版本号为0xc
TAC_PLUS_MAJOR_VER := 0xc
-
minor_version: Tacscs协议次版本号,当前版本号为0x0.
TAC_PLUS_MINOR_VER_DEFAULT := 0x0;
TAC_PLUS_MINOR_VER_ONE := 0x1
-
type:Tacacs协议报文类型,包括认证(0x01)、授权(0x02)和计费(0x03)。
TAC_PLUS_AUTHEN := 0x01 (Authentication)
TAC_PLUS_AUTHOR := 0x02 (Authorization)
TAC_PLUS_ACCT := 0x03 (Accounting) -
seq_no:
这是当前数据包的序列号。会话中的第一个包必须具有序列号1,随后的每个包将增加序列号1。TACACS+客户端只发送包含奇数序列号的数据包,而TACACS+服务器只发送包含偶数序列号的数据包。序列号永远不能换行,也就是说,如果达到序列号2^8-1,该会话必须终止并以序列号1重新启动。
对于同一个会话,当前报文的序列号,取值范围为1~254。
-
flags : 此字段包含各种位图标志。
-
TAC_PLUS_UNENCRYPTED_FLAG := 0x01
报文主体加密标记,0表示对报文主体加密,1表示不对报文主体加密。
此标志表明发送方没有加密包的主体。在生产中不能使用此选项。安全部分将介绍此标志的应用。
这个标志在所有部署中都应该是清晰的。现代网络流量工具在配置共享密钥时支持加密流量,因此即使在测试期间也可以而且应该使用加密模式。
-
The single-connection flag:
TAC_PLUS_SINGLE_CONNECT_FLAG := 0x04
此标志用于允许客户端和服务器协商单一连接模式。
读取时必须忽略所有其他位,写入时应设置为零。
-
-
session_id: 会话ID,当前会话的唯一标识。
此TACACS+会话的Id。此字段在TACACS+会议期间不会更改。此数字必须由加密的强随机数生成方法生成。如果不这样做,将危及会话的安全性。
-
length: TACACS报文主体的长度,不包括报文头。
Tacacs+ 报文主体:
在数据包报头中定义了TACACS+主体类型。本文档的下一部分将介绍不同TACACS+正文的内容。
单连接模式:
单连接模式( Single Connection Mode)是为了提高性能,有很多客户端和服务器之间的流量通过允许复用多个会话在一个TCP连接。
数据包头包含客户端和服务器用来协商使用单连接模式的TAC_PLUS_SINGLE_CONNECT_FLAG。
客户端设置此标志,以表明它支持在单个TCP连接上多路传输TACACS+会话。在单连接状态建立之前,客户端不能在连接上发送第二个数据包。
为了表示它将支持单一连接模式,服务器将在响应客户端的第一个请求的第一个应答包中设置此标志(Flag)。即使客户端没有设置该标志,服务器也可以设置该标志,但是客户端可以忽略该标志并在会话完成后关闭连接。
该标志只与连接上的前两个包相关,以允许客户端和服务器建立单一连接模式。在前两个包之后没有更改单个连接模式的规定:客户端和服务器必须忽略连接上第二个包之后的标志。
如果在TCP连接的前两个包中没有建立单连接模式,那么客户端和服务器都会在第一次会话结束时关闭连接。
客户端采用单连接模式,提高了效率。服务器可能拒绝允许客户端使用单连接模式。例如,在某些部署中,可能不适合将持久的TCP连接分配给特定的客户端。即使服务器被配置为允许特定客户端使用单一连接模式,服务器也可以关闭连接。例如:服务器必须配置为在一段特定的不活动时期后超时单个连接模式TCP连接,以保留其资源。即使建立了单个连接模式,客户端也必须在TCP会话上适应这种终止。
由于服务器或中间连接的超时,单连接模式下的TCP连接最终将关闭。如果一个会话正在进行,当客户端检测到断开连接,那么客户端应该处理它。如果会话没有进行,那么客户端将需要检测它,并在它启动下一个会话时重新启动单连接模式。
Session Completion,会话完成
在下面的小节(认证、授权和计费)中为包类型定义的应答包包含一个状态字段。此字段的完整选项集取决于包类型,但所有三种应答包类型都定义了表示PASS、ERROR和FAIL的值,这些值表明常规会话(未中止的会话)的最后一个包。
服务器以PASS或FAIL响应,表明请求的处理已经完成,客户端可以回应结果(PASS或FAIL)来控制提示将请求发送到服务器的操作的执行。
服务器响应一个EEROR,表明该请求的处理没有完成。客户端无法回应结果,并且它的行为必须与服务器无法连接一样。例如,客户端尝试其他方法(如果有的话),比如将请求发送到备份服务器,或者使用本地配置来确定是否应该执行提示请求的操作。
当会话完成,那么TCP连接应该处理如下,根据单连接模式是否协商:
- 如果没有协商成单连接模式,连接应该关闭。
- 如果单连接模式被启用,那么连接应该打开,但仍可能被关闭在超时时间保存部署资源。
- 如果启用了单连接模式,但是由于连接问题(比如不正确的密码,而出现错误,那么该连接上不能接受任何新的会话。如果有任何会议已经建立,那么他们可能会完成。一旦所有活动会话完成,则必须关闭连接。
建议客户端实现提供健壮的方案来处理无法连接到的服务器。选项包括提供用于冗余的服务器列表,以及在无法到达服务器时提供本地回退配置的选项。具体细节将是特定于实现的。
客户端应该管理连接并处理服务器建立连接但不响应的情况。确切的行为是特定于实现的。建议客户端在出现可配置的超时后关闭连接。
Data Obfuscation,数据混淆(加密):
数据包的主体可以被混淆。下面的章节描述了协议中支持的混淆方法。在“草案”中,这一过程实际上被称为加密,但该算法不符合现代标准,因此在本文档中不会被称为加密。
混淆机制依赖于一个私密的密钥,一个客户端和服务器都知道的共享密钥值。密钥必须保密。
服务器实现必须允许与每个客户机关联唯一的密钥。使用单独密钥的是否合适,这取决于站点。
标志(flag)字段必须配置如下位如下:
TAC_PLUS_UNENCRYPTED_FLAG = 0x0
因此,数据包的主体是混淆的做(byte-wise)逐字节 XOR-ing与(pseudo-random pad)伪随机载荷。
ENCRYPTED {data} = data ^ pseudo_pad
然后,包体可以通过用伪随机载荷按字节对其进行XOR-ing来消除混淆。
data = ENCRYPTED {data} ^ pseudo_pad
该(pad)载荷是通过连接一系列MD5散列(每个16字节长)并将其截断为输入数据的长度而生成的。
在本文档中,MD5指的是“RSA数据安全公司”。MD5消息摘要算法”,在RFC1321 [RFC1321]中指定。
pseudo_pad = {MD5_1 [,MD5_2 [ ... ,MD5_n]]} truncated to len(data)
第一个MD5哈希是通过连接session_id、secret key、版本号和序列号,然后在这些数据上运行MD5生成的。除了在TACACS+客户端和服务器之间共享的密钥之外,所有这些输入值都可以在数据包报头中使用。
版本号和session_id是从报文头中提取的,后续的散列是通过使用相同的输入流生成的,但是将之前的散列值连接到输入流的末尾。
MD5_1 = MD5{session_id, key, version, seq_no} MD5_2 = MD5{session_id,
key, version, seq_no, MD5_1} .... MD5_n = MD5{session_id, key,
version, seq_no, MD5_n-1}
当服务器检测到它为设备配置的密钥不匹配时,它必须返回ERROR。
TAC_PLUS_UNENCRYPTED_FLAG == 0x1
不赞成使用此选项,不能在生产中使用。在这种情况下,整个数据包主体是明文的。如果TAC_PLUS_UNENCRYPTED_FLAG设置为True,则必丢弃请求。
在包体去混淆之后,对包中字段值的长度进行求和。 如果总和与报头中的明文数据长度值不同,则必须丢弃该分组,并发出错误信号。
当客户端和TACACS+服务器之间的密钥不匹配时,通常会出现这样的故障。
Authentication,认证
认证是确定用户(或实体)是谁的动作。 认证可以采用多种形式。 传统身份验证使用name和固定密码。 但是,固定密码是易受攻击,因此许多现代身份验证机制都使用“one-time,一次性”密码或质询响应查询。 TACACS +旨在支持所有这些功能,并且足够灵活以处理将来的任何机制。
认证通常在用户首次登录到计算机或请求其服务时进行。 认证不是强制性的; 它是一个站点配置的选项。 一些站点不需要它。 其他人仅对某些服务需要它(请参阅下面的授权)。 当用户尝试获得额外的特权时,还必须