security - 为什么kerberos需要计算机时钟同步?
问题描述
客户端节点时钟故意设置为 kdc 前 10 小时
然后从客户端节点运行kinit和klist
kinit 不报错,klist 可以看到 Ticket 缓存
~date -s 19:20:38
~kinit -kt /etc/kuduclient.keytab kuduclient@INFO2.COM
~klist
Ticket cache: KEYRING:persistent:0:0
Default principal: kuduclient@INFO2.COM
Valid starting Expires Service principal
11/11/2020 09:49:23 11/12/2020 09:11:00 krbtgt/INFO2.COM@INFO2.COM
renew until 11/18/2020 09:11:00
解决方案
Kerberos 中的时间是相对的。首先,它应该基于 UTC 时区。如果 10 小时的差异只是与时区有关,那么 Kerberos 堆栈会很高兴地转换为 UTC,一切都很好。
其次,许多(大多数?)Kerberos 堆栈并不关心确切的时间,他们关心的是相对于 KDC 认为的时间。我的意思是,客户端可以向 KDC 发出请求,如果时间过长,KDC 将返回一个错误,包括它认为的当前时间。客户端可以自由地重新发送请求,并将时间延长到 KDC 的窗口内。这仍然保证了安全的正确性,因为从权威机构——KDC 的角度来看,时间限制仍然得到满足。