Kerberos 是一种身份认证协议,被广泛运用在大数据生态中,甚至可以说是大数据身份认证的事实标准。本文将详细说明 Kerberos 原理。
Kerberos 一词来源于古希腊神话中的 Cerberus —— 守护地狱之门的三头犬。下图是 Kerberos 的 LOGO。
一句话来说,Kerberos 是一种基于加密 Ticket 的身份认证协议。Kerberos 主要由三个部分组成:Key Distribution Center(KDC)、Client 和 Service。 大致关系如下图所示:
客户端会先访问两次 KDC,然后再访问目标 Service,如:HTTP 服务。
(1)Principal:大致可以认为是 Kerberos 世界的用户名,用于标识身份。Principal
主要由三部分构成:primary
,instance
(可选)和 realm
。
instance
的 Principal
,一般会作为 Server
端的 Principal
,如:NameNode,HiverServer2,Presto Coordinator 等。instance
的 Principal
,一般会作为 Client
端的 Principal
,用于身份认证。
(2)Keytab:密码本。包含了多个 principal
与密码的文件,用户可以利用该文件进行身份认证。
(3)Ticket Cache:客户端与 KDC 交互完成后,包含身份认证信息的文件,短期有效,需要不断 renew
。
(4)Realm:Kerberos 系统中的一个 namespace
。不同 Kerberos 环境,可以通过 realm
进行区分。
Key Distribution Center(KDC),是 Kerberos 的核心组件,主要由三个部分组成:
Ticket Granting Tickets
(TGT
)。Service Tickets
。在深入了解 Kerberos 原理之前,先介绍一下 Kerberos 协议的几个大前提,帮助大家理解:
下面,我们将以客户端访问 HTTP
服务为例,解释整个认证过程。
第一步,客户端通过 kinit USERNAME
或其他方式,将 客户端 ID,目标 HTTP 服务 ID,网络地址(可能是多个机器的 IP 地址列表,如果想在任何机器上使用,则可能为空),以及 TGT 有效期的寿命 等信息发送给 Authentication Service。
第二步,Authentication Server 将检查客户端 ID 是否在 KDC 数据库中。
如果 Authentication Server 检查操作没有异常,那么 KDC 将随机生成一个 Key,用于客户端与 Ticket Granting Service(TGS)通信。这个 Key,一般被称为 TGS Session Key。随后 Authentication Server 将发送 两条信息 给客户端。示意图如下:
其中一条信息被称为 TGT,由 TGS 的密钥加密,客户端无法解密,包含 客户端 ID,TGS Session Key 等信息。
另一条信息由客户端密钥加密,客户端可以正常解密,包含 目标 HTTP 服务 ID,TGS Session Key 等信息。
第三步,客户端利用本地的密钥解密出第二条信息。如果本地密钥无法解密出信息,那么认证失败。示意图如下:
这时候,客户端有了 TGT(由于本地没有 TGS 的密钥,导致无法解密出其数据)与 TGS Session Key。
第四步,客户端将:
第五步,TGS 将利用自身的密钥从 TGT 中解密出 TGS Session Key,然后利用 TGS Session Key 从 Authenticator 中解密出客户端的信息。
当所有检查都通过后, TGS 随机生成一个 Key 用于后续客户端与 HTTP 服务交互时进行通信加密使用,即 HTTP Session Key。同样地,TGS 将发送 两条信息 给客户端:其中一条是 HTTP Ticket,由 HTTP 服务的密钥进行加密;另一条则由 TGS Session Key 加密,包含了客户端信息与时间戳。
第六步,客户端将利用 TGS Session Key 解密出其中一条信息,另一条信息由于是由目标 HTTP 服务加密,无法解密。
这时候,客户端有了 HTTP Ticket(由于本地没有 HTTP 服务的密钥,导致无法解密出其数据)与 HTTP Service Session Key。
第七步,客户端将:
注:上图中 Ticket for HTTP Service 中装的应该是 HTTP Service Session Key,而不是 TGS Session Key,有一点小错误,注意甄别。
第八步,HTTP 服务首先利用自身的密钥解密出 HTTP Ticket 的信息,得到 HTTP Service Session Key;随后,利用 HTTP Service Session Key 解密出用户的 Authenticator 信息。
信息解密完成后,HTTP 服务同样需要做一些信息检查:
然后,HTTP 服务会发送包含其 ID 和时间戳的身份验证器消息,以便向您确认其身份,并使用 HTTP Service Session Key 进行加密。
您的机器通过使用缓存的 HTTP Service Session Key 解密来读取身份验证器消息,并知道它必须接收带有 HTTP 服务 ID 和时间戳的消息。
现在,您已通过身份验证,可以使用 HTTP 服务。未来的请求将使用缓存的 HTTP Service Ticket,只要它没有按照生命周期属性中的定义过期即可。
参考如下: