Windows NT挑战/响应(Challenge/Response)
Windows NT挑战/响应是确定发送请求的人员的最安全的方式。挑战/响应的处理流程是所有使用IIS的人员必须掌握的。(我们实际是围绕着Windows NT委托(delegation)过程进行,但在挑战/响应后有委托的最好说明。)
现在说明一个完全不同的技术: "散列(Hash)"
Windows NT挑战/响应验证过程中并不通过网络发送密码,因为密码可能会被截获和破译。Windows NT使用的是一个类似于绞肉机的不可逆算法。输入内容后得到一个散列内容。Windows NT使用Internet标准MD4散列算法生成16字节(128位)的散列值。(理论上)不可能使用散列值和算法在数学上逆转加密过程而得到原密码。也就是说,密码作为了一个“私人密钥(private key)”。只有拥有该密钥的人才能产生一个特定的散列值。Windows NT域控制器有一个数据库存储了由用户密码产生的用户散列值,但并未存储用户密码。 (注意密码和散列值的分离不会使域控制器减少受到黑客攻击的可能,因为有时散列值也可以用作密码的等效物。)
IIS与挑战/响应验证过程
如果下面条件满足时,IIS将使用挑战/响应验证:
如果Internet服务管理器的WWW属性对话框的“允许匿名”选项没有被选中,IUSR帐户没有足够的许可权访问所请求的资源,或者执行代码禁止访问。 在Internet服务管理器的WWW属性对话框中选择Windows NT Challenge/Response 浏览器在挑战/响应验证方式下发送请求 (当前浏览器中只有Internet Explorer支持挑战/响应验证) 当我们说IIS尝试验证用户时,IIS所做的工作非常简单。它向浏览器发回一个"HTTP 401 Access Denied"消息,以及它接受的验证方法列表。与一个高级俱乐部的保镖非常相似, IIS这时会说:"You can't get what you want without identifying yourself. By the way, I accept the following methods of identification.(没有确认您的身份,您不能获得所需要的内容。另外,我支持下列验证方法)"。IIS接受的两种验证方法是挑战/响应验证和基本验证。具体使用哪种方法取决于在IIS的Internet服务管理器WWW属性对话框中的选择。如果两种验证方法都被启用,对于Internet Explorer将一定会使用挑战/响应验证,而对其它浏览器则会使用基本验证。
图1从包的角度显示了如何在没有看到用户密码的情况下对他(她)进行Windows 挑战/响应验证。
图1. Windows NT 挑战/响应验证过程
使用随机散列的挑战信息的原因
增加使用密码散列值加密挑战信息的额外步骤,而不是将简单的散列值传送到域,可以使散列值更难以被截获破译而作为密码使用。因为挑战需要用户密码散列值来产生新的散列值,它证实了用户至少拥有用户散列值 (而且可能还有用户密码)。所有的这些不用通过电线传送密码。实质上,密码成为了私人密钥而随机值成为了不断变化的公共密钥。
委托(Delegation)!
委托是大多数实现Windows NT安全和IIS验证的人员所遗漏的内容,甚至当委托对于其考虑的安全Web服务器环境十分关键的人员,或是简单希望Web服务器能够运行的人员也是如此。当IIS Web服务器扮演一个使用挑战/响应验证的用户时,IIS服务器并没有用户的密码或密码散列值。IIS只看到了传送到域控制器的加密的挑战。当使用ASP页访问另一台Windows NT计算机(比如远程数据库服务器)的资源时很可能遇到这种情况。远程服务器向IIS发送挑战信息以验证自己所扮演的用户,而IIS由于无法使用用户散列值加密任何发送给它的挑战信息,所以无法进行验证。因而远程服务器被禁止访问,而你的数据库驱动的Web页将运行失败。这是Windows NT 4.0 (和以前版本)安全模型的一个限制,不是IIS的原因。使用Windows NT挑战/响应验证,一个依靠扮演的进程将无法像一个文本文件一样访问另一台Windows NT计算机上的太多内容。
如果你希望确定何时需要考虑委托,而如果Web服务器拥有用户密码或散列值,请询问自己。在政策上,你应“根据财力(follow the money)”。在委托上,你应“根据密码(follow the password)”!
对此可以有一个类比,行政主管委托一个秘书代其签名并在其它方面替其行使职责。当用户使用挑战/响应验证时,用户无法委托IIS完全按照其利益工作。这个特别的限制可能在Windows NT 5.0发布后会得到完美解决,因为那时Windows NT集成了Kerberos 验证系统 (该系统为MIT的Athena 项目(Project Athena)开发)。
|