0X0:简介

Windows 环境下的两种安全认证模式:

NT Lan Manager ,基于哈希算法的认证,用于 Windows NT 和 Windows 2000 Server(or Later) 。

kerberos,基于 Ticket 的认证,用于 Windows 2000 Server(or Later) 和域环境,域环境下常用 Domain Controller 担任 Key Distribution Center 角色。

0X1:NTLM

先介绍有那么几个定义:无法通过哈希值逆推出明文;哈希算法具有抗碰撞特点;Domain Controller 拥有所有用户的密码哈希值的记录;密码在任何地方都不会以明文的形式体现。m 表示 Plaintext,C 表示 Ciphertext,k 表示 key,E 表示 Encryption,D 表示 Decryption。那么就重温一次 NTLM 的认证流程

step1,client 请求登录 server,于是向 server 发送包含 mclient_username 的请求数据;

step2,server 得知 client 发起请求之后,生成16位随机数 Challenge 或称 Nonce 。发送mChallenge 到 client,挑战鉴定 client 是否是说它宣称的用户;

step3,client 接受挑战,先得出 C Challenge= E k1(mChallenge),这里的 Key1 就是 client 本机记录的密码哈希值,最后将 C Challenge 发送给 server;

step4,server 将m Challenge 、 mclient_username 和 C Challenge 转交给Domain Controller 验证;

step5,Domain Controller 收到验证请求,于是在域记录中找到 mclient_username 用户记录的密码哈希值 Key2。基于哈希的雪崩性原理,明文单个比特的修改将会导致密文大幅的变动。因此如果 C Challenge= E k1(mChallenge)= E k2(mChallenge) 成立,那么认为 Key1 = Key2, client 通过验证。如果 Key1 ≠ Key2,则client 不通过验证。Domain Controller 将是否通过验证的结果转告 server 。

总结关于 NTLM 的特点,便于学习更为复杂的 berberos:
  1. 想确认 client 是否是它属宣称的用户,告诉 server 一个只有 client 和 server 才知道秘密(比如密码)就行了;
  2. 这个秘密在传输的时候需要保证安全,不被窃听,所以采用了对称加密算法,加密和解密的密钥都是 client 密码的哈希值。

0X2:kerberos

助于读者咀嚼文章,简单介绍扫盲:

  • Long-term Key(亦称Master Key)指的是由密码或者密码直接派生的值,由于 Long-term Key 可能长期不被修改,一旦被截获可以有很长时间进行破解,因此 Long-term Key 不适用于网络传输。密码的哈希值属于Long-term Key。
  • Short-term Key(亦称Session Key)是为了解决 Long-term Key 不适用于网络传输的问题,所以 Short-term Key 常常是通信双方进行协商之后得出的密钥,一般 Short-term Key 的生效时间都很短,甚至结束通信后就失效。

类似于 NTLM 的特点和上面两点概念,很明显 kerberos 需要 Short-term Key 作为加密的密钥,所以需要引入Key Distribution Center 这个角色,域环境下一般使用 Domain Controller 担任 Key Distribution Center 角色。下文以域环境讲述 kerberos 认证,所以下文的 AD 亦指 KDC。

AD 首先会维护域内的 Account Databas,里面就包括了用户名和对应的Long-term Key ( 一般就是哈希值 ) ,其次 AD 还需要负责分发 Short-term Key,分发的流程大概是这样的:

  1. client1 声明自己的身份并请求访问 server1,因此它需要向 AD 申请 Short-term Key ,假设是SKc&s

  2. 为了保证 Short-term Key 只能被 client1 和 server1 安全使用,AD 在 Account Databas 里找到 client1 和 server1 对应的 Long-term Key,假设就是它们密码对应生成的哈希值 hash-c 和 hash-s。然后 AD 会将SKc&s = E hash-c( SKc&s) 的加密结果发送给 client,将 Session Ticket = E hash-s( SKc&s+部分 client 的信息) 的加密结果同样发送给 client;

    为什么将 Session Ticket 发送给 client ?因为 client 不知道 hash-s 的值,它是无法解密获取 SKc&s和部分 client 的信息。原因一是因为 AD 面对不同的 client 可能需要处理很多步骤一的内容,原因二是基于网络通信的考虑,如果 client 已经解密获得 SKc&s,但 server 的网络或者负载出现了问题,迟迟没有完成解密获得SKc&s,那么认证流程还是没办法往下走,所以带有 SKc&s 的两个加密数据包都发送给 client,client 再把属于 server 的加密数据包发送给 server。这个代替 AD(或者KDC)包括凭证的做法就是 TGT(Ticket Granting Ticket), client 再次需要和 AD 通信的时候,把 TGT 一并发送过去即可。

  3. client 解密hash-c 作为密钥加密的数据包,获得SKc&s。client 将自己的部分信息和 Timestamp 利用 SKc&s 执行加密,即 Authenticator = E SKc&s(部分client的信息+ Timestamp)。把 Authenticator 和 AD那里得到的 Session Ticket 都转发给 server1;

  4. server1 利用 hash-s 解开Session Ticke 得到SKc&s,表达式就是:SKc&s +部分 client 的信息= D hash-s( Session Ticke )。再有 D SKc&s ( Authenticator ) 得到来自 client1 的信息和 Timestamp。

  5. server1 在比较来自 Session Ticke 和 Authenticator 都包含的 client1 信息是否一致之前,会先检查 Timestamp 的时间和当前系统时间做比较,如果两者的时间相差超过设定阈值就认为数据包失效,不再进行比较 client1 的信息而直接拒绝认证,防止重放攻击。为此,server1 中会维护一张时间表,里面记录许多 client 最近一次的认证时间,如果 Timestamp 时间晚于最近认证的时间,server1 才会继续后续验证,所以域环境下的Time Synchronization 也会干预认证结果。

  6. ( optional ) 如果 client1 需要确认通信的 server 是否就是我想要访问的 server1,那么就需要在向 server1 发送的登录凭证里设置 Flag 字段信息。当 server 1 看到有 Flag 字段信息时,就会把来自 client1 的Timestamp 信息用 SKc&s 做加密并把结果发送给 client1 ,client1 解密之后如果 Timestamp 和本机记录一样,则认为 server1 就是我想访问的 server 。因为要拿到 Timestamp 信息需要解开 Authenticator 数据包,解开Authenticator 需要 SKc&s,而获得 SKc&s 要么拥有hash-c,要么拥有hash-s。

0X3:kerberos 的优势

1.较高的Performance

虽然我们一再地说Kerberos是一个涉及到3方的认证过程:Client、Server、KDC。但是一旦Client获得用过访问某个Server的Ticket,该Server就能根据这个Ticket实现对Client的验证,而无须KDC的再次参与。和传统的基于Windows NT 4.0的每个完全依赖Trusted Third Party的NTLM比较,具有较大的性能提升。

2.实现了双向验证(Mutual Authentication)

传统的NTLM认证基于这样一个前提:Client访问的远程的Service是可信的、无需对于进行验证,所以NTLM不曾提供双向验证的功能。这显然有点理想主义,为此Kerberos弥补了这个不足:Client在访问Server的资源之前,可以要求对Server的身份执行认证。

3.对Delegation的支持

Impersonation和Delegation是一个分布式环境中两个重要的功能。Impersonation允许Server在本地使用Logon 的Account执行某些操作,Delegation需用Server将logon的Account带入到另过一个Context执行相应的操作。NTLM仅对Impersonation提供支持,而Kerberos通过一种双向的、可传递的(Mutual 、Transitive)信任模式实现了对Delegation的支持。

4.互操作性(Interoperability)

Kerberos最初由MIT首创,现在已经成为一行被广泛接受的标准。所以对于不同的平台可以进行广泛的互操作。

参考资料:

https://www.ichunqiu.com/course/51459 固若金汤的 Kerberos

https://blog.csdn.net/wulantian/article/details/42418231 Kerberos 的认证原理

http://www.cnblogs.com/artech/archive/2011/01/24/kerberos.html Windows 的安全认证