Kerberos域网络安全从入门到精通
上QQ阅读APP看书,第一时间看更新

1.1 Kerberos协议

Kerberos是希腊语单词。在希腊神话中,Kerberos是守护地狱大门的神犬的名字,这只神犬有3个头,非常厉害,由其守护的地狱大门非常安全可靠。Kerberos协议主要涉及3个角色,对应守护神犬的3个头,协议名称寓意“非常安全可靠”。Kerberos协议由麻省理工学院(Massachusetts Institute of Technology, MIT)提出,目前主流版本为RFC 4120定义的V5版,Windows、Linux和Mac这3大主流操作系统均支持Kerberos协议,其中应用最广泛的是Windows操作系统,故本书聚焦Windows操作系统。Windows 2016系统集成了ARMOR强化版的Kerberos协议,即Kerberos ARMOR,需要手动配置才能启用该版本的协议。

Kerberos协议涉及3个主要角色,分别是域控制器(Domain Controller, DC)、域客户端(Client)和提供应用服务的AS(App Server,应用服务器),在实际应用中,域控制器常称为域服务器。域服务器中主要涉及Kerberos的KDC(Key Distribution Center,密钥分发中心),在没有特殊说明时,本书将KDC等同于域控制器。KDC包含AS(Authenticate Service,认证服务模块)和TGS(Ticket Grant Service,票据授予服务模块)两个主要功能模块,如图1-1所示。

图1-1 Kerberos协议

Kerberos协议的认证过程主要包括6个步骤,应用场景为域内客户端通过域认证,访问域内应用服务。为了更好地让读者理解、掌握Kerberos协议,本章先介绍原理,后续结合实际案例对比分析Kerberos协议。如图1-1所示,右下角是应用服务器,下文用“S”表示;左边是客户端,用于发起访问应用服务的请求,下文用“C”表示;右上角的AS、TGS表示Kerberos域服务器KDC。Kerberos协议是身份认证协议,会涉及加密协议等,对这方面不熟悉的读者不必担心,只需要了解与加密算法有关的概念和应用即可,无须关注加密算法的原理等。Kerberos协议的认证过程如下。

Step 01 C向AS发起认证请求AS_REQ(身份验证服务票据),具体内容为{C_principal_name, TGS_principal_name,……}。其中,C_principal_name为发起认证的C账号名;TGS_principal_name为TGS的主体名,即Krbtgt账号。

02 AS收到请求后,随机生成一个C与TGS之间的临时会话密钥kc, tgs,并回复2个票据Tc和Ttgs给客户端,二者共同组成AS_REP。第1个票据Tc={kc, tgs,TGS_principal_name,……}kc,使用C账号的口令NTLM值kc加密。注意,域服务器储存了所有域内账号的口令NTLM值,所以可以使用C账号的口令NTLM值进行加密。第2个票据Ttgs={kc, tgs,C_principal_name,……}ktgs使用Krbtgt账号的口令NTLM值ktgs加密,Ttgs代表票据授予票据(Ticket Granted Ticket, TGT)。第1步和第2步中所述的AS_REQ、AS_REP组成一次TCP(Transmission Control Protocol,传输控制协议)会话。

Step 03 C收到AS发来的2个票据后,使用C账号的口令NTLM值kc解密Tc,获取临时会话密钥kc, tgs,使用kc, tgs加密由时间戳、票据Ttgs申请访问的AS共同组成的内容,生成认证因子Authenticator={time_stamp, Ttgs,……}kc, tgs,C将生成的认证因子及Ttgs发送给TGS,即TGS_REQ。

Step 04 TGS收到C发送的内容后,首先使用Krbtgt账号的口令NTLM值ktgs解密Ttgs,从中获取临时会话密钥kc, tgs;然后利用kc, tgs解密认证因子,比较认证因子中的Ttgs和独立的Ttgs是否相同,如果相同表示账号认证成功,否则认证失败,流程结束。认证成功后,TGS随机生成一个C与AS之间的临时会话密钥kc, s,并回复客户端2个票据Tcs和Ts,2个票据共同组成TGS_REP。第1个票据Tcs={kc, s,S_principal_name,……}kc, tgs,使用第2步生成的临时会话密钥kc, tgs加密;第2个票据Ts={kc, sC_principal_name,……}ks,使用AS的口令NTLM值ks加密。Ts表示服务票据TGS,这里的服务票据TGS和KDC中的票据授予服务模块TGS虽然同名,但意义完全不一样,服务票据TGS由票据授予服务模块TGS颁发。TGS_REQ、TGS_REP组成一次TCP会话。

Step 05 客户端收到TGS_REP后,使用kc, tgs解密第1个票据Ts,获得kc, s,生成服务请求因子Authenticator={time_stamp, Ts,……}kc, s,使用kc, s加密服务请求因子,与第2个票据Ts一起发送给S。

Step 06 S收到C发送的服务请求因子Authenticator和Ts后,首先使用自身的口令NTLM值ks解密获取kc, s,用kc, s解密认证因子获取Ts,比较2个Ts是否一致,一致表示认证成功,不一致表示认证失败,流程结束。如果认证成功,AS返回一个确认值{time_stamp}kc, s给C,通知允许访问,该值使用临时会话。

Step 07 S将收到的Ts发送给域服务器,进行PAC(权限属性证书)校验。这一步为可选步骤,默认情况下不发生,所以常说Kerberos协议主要包含6个步骤。

从上述步骤中可以看出,Kerberos协议的认证包括至少3次TCP会话。认证过程涉及的票据比较多,和加密紧密相关,看起来比较枯燥、复杂,事实也确实如此。不过读者不用担心,后文会反复提到Kerberos协议原理,读者会越来越熟悉Kerberos协议。

为了加深读者的理解,这里使用更简单的方式介绍Kerberos协议。简化后的Kerberos协议原理包含6个主要步骤,如图1-2所示。对比前面的介绍,图1-2所述原理非常清晰明了,不再进行详细解释。

图1-2 简化版Kerberos协议