"Windows和活动目录安全"培训小记
盆盆非常荣幸,能够给来自江南所的学员们主讲三天的“Windows和活动目录安全”课程。学员们无论技术还是素质都非常高,都是素有经验的高级开发人员。课堂的技术讨论氛围非常好,这帮助盆盆发挥出最好的本领。整个三天我们的感觉非常愉快,对盆盆自己来说,也加深了对于微软安全技术的理解。
这三天的培训,盆盆介绍了以下内容:
1. Windows Vista/longhorn Server的最新安全技术,包括UAC、IE保护模式、MIC和UIPI,总共讲述了近四个多小时,盆盆自己也觉得非常过瘾。
2. 活动目录的验证和授权技术,包括客户端访问网络服务,其背后发生的Kerberos验证的实质性过程。还有信任关系,其低层的实质是什么,等等。
3. 组策略的意义和实现。如何借助组策略,锁定用户桌面,同时让桌面的进程符合最小特权的要求,等等。
4. PKI和EFS的实现,介绍了EFS的内在实现原理,以及出现问题,如何进行最后的修复。
在讨论Kerberos验证时,盆盆用乘飞机作比方。把TGT比喻为所购买的机票,然而光凭机票(TGT)是无法登机的(获得目标服务),必须得拿到登机牌(服务票据)。而要获得登机牌,我们需要出示身份证(时间戳),来证明自己的机票不是捡别人的(防止replay攻击)。
在学习Kerberos时,盆盆自己的体会是:
一定要理解TGT也是一个普通票据,从本质上讲,它没有任何特殊性,TGT也是用服务方(KDC)的长期密钥所加密的会话密钥副本(还包括客户端的授权信息)。
而访问其他服务(例如Bob)所需的会话票据,也是由服务方(Bob)的长期密钥所加密的会话密钥副本(包括客户端的授权信息,取自TGT)。Bob验证并解密客户端发来的会话票据,取出其中的客户端授权信息,就可以在Bob上生成客户端的网络登录会话和访问令牌。
注意 网络登录会话,默认不会缓存任何的凭据信息,如果不能理解这一点,就不能理解为什么Bob不会为客户端缓存访问凭据。
也就是说,TGT无非就是一种“特殊”的服务票据,客户端也是为了用它来请求服务,只不过所请求的服务比较特殊,用来获取新的服务票据。
Kerberos的优点是:并不是由服务方向DC请求验证客户端的身份(NTLM必须这样),同时服务方不需要缓存和客户端的票据。所有的一切都由客户端去完成,这大大减少服务器的压力。就好比我们去买电影票,很显然电影票由我们自己(客户端)保存,而不可能由售票处(服务方)保存。
域之间的信任是什么?盆盆的个人理解,信任并不神秘,信任无非就是一种服务。域会把自己的TGS服务,作为一个安全主体(Security Principal),在其他域中注册,也就是域只是把其他域的TGS服务简单的看成普通的服务(和文件访问服务没有区别)。也就是说,如果域无法验证客户端的服务请求,就会给客户端发一个TGT(带forward标记),客户端用这张TGT简单地申请另外一个域的TGT(按照信任路径一直走)…并最终获得目标服务的会话票据。
为什么是这样?因为Kerberos根本不管什么叫信任、什么叫AD、什么叫DC,它只认会话密钥(当然还有时间戳)。什么叫会话密钥?想像一下革命电影里的常见场景,两位地下党碰头,一个说“天王盖地虎”,另一个说出“宝塔镇河妖”,如果口令对榫,两人就会痛哭流涕,终于找到党了…,这就是“会话密钥”。
盆盆的个人看法:开发人员同样需要特别注意安全问题,因为随着Windows的安全要求越来越严格,开发人员必须更新自己的安全意识,这样才能确保自己的产品满足Windows的安全要求,满足Windows的兼容性要求。这次的谷歌输入法事件告诉我们,开发者的安全意识,是多么的重要!
然而由于技术水平的限制,盆盆肯定会存在理解不到位、甚至错误的地方,所幸技术知识是开放的,盆盆自己也会不断地吸收消化,一有新的技术心得,将会毫不犹豫,第一时间发表在ITECN博客上。
所幸,ITECN博客就是我们的“TGT”,有了这张“TGT”,我们就可以很容易获得新的知识。