RADIUS 和 TACACS+ 是否曾在符合 FIPS 140-2 的场景中被允许?

信息安全 思科 菲普斯 半径
2021-09-01 23:47:59

RADIUS 和 TACACS+ 是否曾在符合 FIPS 140-2 的场景中被允许?

我知道 RADIUS 使用 MD5 散列算法,而且我很确定 TACACS+ 也这样做,而且我不相信有任何使用 MD5 散列算法的RADIUS 或 TACACS+实现。如果我错了,请纠正我。

FIPS 140-2 标准中禁止使用 MD5。

但是,我发现这个Cisco 文档提到了一个叫做“RADIUS Keywrap”的东西,它似乎暗示如果你启用密钥包装,你将能够使用 RADIUS,而且你仍然是 FIPS 兼容的。

那么... 什么是 RADIUS 密钥包装?是不是意味着根本不再使用MD5算法了?或者,如果您将不安全的算法“包装”在安全算法中,是否仍然可以保持 FIPS 合规性?

编辑:在 mfinni 链接的文档中找到:

RADIUS 密钥包装

RADIUS 密钥包装支持是 RADIUS 协议的扩展。它为Cisco 访问控制服务器 (ACS)提供了一种FIPS 可认证的方法来验证 RADIUS 消息并分发会话密钥。

RADIUS 密钥包装通过使用高级加密标准 (AES) 密钥包装算法来传输密钥,同时使用 HMAC-SHA1 算法来保护数据包完整性,从而提高了 RADIUS 协议的安全性。它指定密钥加密密钥 (KEK) 和散列密钥必须彼此不同,不应基于密码,并且必须在加密上独立于用于计算响应身份验证器的 RADIUS 共享密钥。

好的......这回答了这个问题。

3个回答

RADIUS 和 TACACS+ 是否曾在符合 FIPS 140-2 的场景中被允许?

半径:

Microsoft 为其最近的操作系统提供了 FIPS 认证的加密模块(搜索“Microsoft”)。

通过组策略启用 FIPS 模式将强制使用该加密模块。但是,正如一个答案所指出的,大多数 RADIUS 协议在 FIPS 下都是不允许的。PAP、CHAP、MS-CHAP、MS-CHAPv2 都使用无/受限加密或某种形式的 MD 哈希(FIPS 下不允许)。有一些协议使用 FIPS 级加密:EAP 方法(PEAP、EAP-TLS)。

TACACS+:

思科通过 FIPS 采用了他们的 AAA 服务器。但是,从答案之一链接的文档中,它仅适用于 802.11i(使用 RADIUS 的无线安全),不适用于 TACACS+ 部分。

TACACS+ 的一个问题(很难找到)是它显然使用 MD5 来保护 TACACS+ 流量。搜索“TACACS+ MD5”,您应该会找到一份 SANS Institute 文档,其中包含此声明。思科没有在其网站上说明 TACACS+ 使用什么加密。

底线: FIPS 模式下的 TACACS+?不可以,除非有人可以证明 TACACS+ 流量正在使用 3DES 或更高的加密。FIPS 模式下的 RADIUS?是的,只要您使用的是 EAP 方法。

鉴于 NIST 有一份 Cisco 文档的副本专门指出了这一点,我认为答案是肯定的。IANASA(我不是安全审计员)

http://csrc.nist.gov/groups/STM/cmvp/documents/140-1/140sp/140sp948.pdf

为了后代:TACACS+“加密”是https://datatracker.ietf.org/doc/html/draft-grant-tacacs-02 中的文档

相关文字:

在这种情况下[ed:使用加密],数据包主体通过使用伪随机填充按字节进行异或来加密。

加密 {数据} == 数据 ^ 伪垫

填充是通过连接一系列 MD5 哈希(每个 16 字节长)并将其截断为输入数据的长度而生成的。

在本文档中使用时,MD5 指的是 [3] 中指定的“RSA Data Security, Inc. MD5 Message-Digest Algorithm”。

pseudo_pad = {MD5_1 [,MD5_2 [ ... ,MD5_n]]} 截断为 len(data)

第一个 MD5 散列是通过连接 session_id、密钥、版本号和序列号生成的,然后在该流上运行 MD5。所有这些输入值都在数据包头中可用,除了作为 TACACS+ 客户端和守护程序之间共享秘密的密钥。

版本号是主要和次要版本号的一字节组合。

会话 ID 以它出现在 TACACS+ 标头中的字节顺序使用。(即按网络字节顺序,而不是主机字节顺序)。

后续哈希是通过使用相同的输入流生成的,但在输入流的末尾连接上一个哈希值。

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}