跳到主要内容

1.1. The Kerberos Protocol (Kerberos 协议)

Kerberos 提供了一种在开放 (未受保护) 网络上验证主体 (principals) 身份的方法, 例如工作站用户或网络服务器。这是在不依赖主机操作系统的断言、不基于对主机地址的信任、不需要网络上所有主机的物理安全性的情况下实现的, 并且假设沿着网络传输的数据包可以被任意读取、修改和插入。Kerberos 通过使用传统 (共享密钥) 密码学作为可信第三方认证服务在这些条件下执行认证。Kerberos 的扩展 (不在本文档范围内) 可以在认证协议的某些阶段提供公钥密码学的使用。这些扩展支持向公钥证书颁发机构注册的用户进行 Kerberos 认证, 并在需要的情况下提供公钥密码学的某些优势。

基本的 Kerberos 认证过程如下进行: 客户端向认证服务器 (Authentication Server, AS) 发送对给定服务器的 "凭证 (credentials)" 的请求。AS 使用这些凭证进行响应, 这些凭证使用客户端的密钥加密。凭证由服务器的 "票据 (ticket)" 和一个临时加密密钥 (通常称为 "会话密钥 (session key)") 组成。客户端将票据 (其中包含客户端的身份和会话密钥的副本, 全部使用服务器的密钥加密) 传输到服务器。会话密钥 (现在由客户端和服务器共享) 用于认证客户端, 并且可以选择性地用于认证服务器。它还可以用于加密双方之间的进一步通信, 或交换一个单独的子会话密钥 (sub-session key) 以用于加密进一步的通信。请注意, 许多应用程序仅在启动基于流的网络连接时使用 Kerberos 的功能。除非应用程序对数据流执行加密或完整性保护, 否则身份验证仅适用于连接的启动, 并且不能保证连接上的后续消息来自同一主体。

基本协议的实现由在物理安全主机上运行的一个或多个认证服务器组成。认证服务器维护一个主体 (即用户和服务器) 及其密钥的数据库。代码库提供加密并实现 Kerberos 协议。为了向其事务添加认证, 典型的网络应用程序直接调用 Kerberos 库或通过单独文档 [RFC4121] 中描述的通用安全服务应用程序编程接口 (Generic Security Services Application Programming Interface, GSS-API) 进行调用。这些调用导致传输实现认证所需的消息。

Kerberos 协议由几个子协议 (或交换) 组成。客户端可以通过两种基本方法向 Kerberos 服务器请求凭证。在第一种方法中, 客户端向 AS 发送对所需服务器的票据的明文请求。回复使用客户端的密钥加密发送。通常这个请求是为了获得票据授予票据 (Ticket-Granting Ticket, TGT), 它稍后可以与票据授予服务器 (Ticket-Granting Server, TGS) 一起使用。在第二种方法中, 客户端向 TGS 发送请求。客户端使用 TGT 向 TGS 认证自己, 就像它联系任何其他需要 Kerberos 认证的应用程序服务器一样。回复使用 TGT 中的会话密钥加密。尽管协议规范将 AS 和 TGS 描述为单独的服务器, 但在实践中它们被实现为单个 Kerberos 服务器中的不同协议入口点。

一旦获得, 凭证可用于验证事务中主体的身份、确保它们之间交换的消息的完整性或保持消息的隐私性。应用程序可以自由选择可能需要的任何保护。

要验证事务中主体的身份, 客户端将票据传输到应用程序服务器。因为票据是 "明文" 发送的 (它的部分是加密的, 但这种加密不能阻止重放), 并且可能被攻击者拦截并重用, 所以发送额外的信息以证明消息来自票据所颁发给的主体。这些信息 (称为认证器 (authenticator)) 使用会话密钥加密并包含时间戳。时间戳证明消息是最近生成的而不是重放。使用会话密钥加密认证器证明它是由拥有会话密钥的一方生成的。由于除了请求主体和服务器之外没有人知道会话密钥 (它从不在网络上以明文形式发送), 这保证了客户端的身份。

主体之间交换的消息的完整性也可以通过使用会话密钥 (在票据中传递并包含在凭证中) 来保证。这种方法提供了对重放攻击和消息流修改攻击的检测。它通过生成和传输客户端消息的防碰撞校验和 (在其他地方称为散列或摘要函数), 使用会话密钥加密来实现。主体之间交换的消息的隐私性和完整性可以通过使用票据中包含的会话密钥或认证器中找到的子会话密钥加密要传递的数据来保护。

上述认证交换需要对 Kerberos 数据库的只读访问。然而, 有时必须修改数据库中的条目, 例如在添加新主体或更改主体的密钥时。这是使用客户端和第三个 Kerberos 服务器 (Kerberos 管理服务器 (Kerberos Administration Server, KADM)) 之间的协议来完成的。还有一个用于维护 Kerberos 数据库的多个副本的协议。本文档不描述这两个协议。