本文档列举出一些建议和最佳做法,以保证 Web 上运行 Microsoft Windows 2000 和 Internet Information Services (IIS) 5 的服务器的安全。这些设置侧重于安全性而不是性能方面。因此认真阅读以下的建议并运用它们来获得适用于自己企业的设置是很重要的。
注意 本文档是由“Designing Secure Web-Based Applications for Microsoft Windows 2000”,Microsoft Press,ISBN: 0735609950 改编而来。
那些熟悉 Internet Information Server 4 清单的客户将注意到本列表要远短于 Internet Information Server 4 的清单。这是因为以下两点原因:
- 许多 Windows 2000 系统范围的设置可以通过提供的安全模板 (hisecweb,inf) 进行配置;所以不需要手动配置注册表设置。
- 在 Windows 2000 和 IIS 5 的默认状态下,将禁用 Microsoft Windows NT 4 和 Internet Information Server 4 上的某些低安全级别的默认设置。
本文档的其余部分分为以下几个部分:
- 一般性安全考虑事项
- Windows 2000 安全考虑事项
- IIS 5 安全考虑事项
一般性安全考虑事项 |
本部分内容讲述一般性安全问题。
阅读您企业的安全策略
拥有安全策略是十分重要的。对以下问题,您需要有现成的答案:
- 如何对入侵作出反应?
- 备份存储在何处?
- 允许谁访问服务器?
在 SANS Institute、Baseline Software, Inc. 和 Practical Unix & Internet Security (O'Reilly Books, 1996) 中可以找到有关策略信息的比较好资源。
预订 Microsoft 安全通知服务
您可以在 http://www.microsoft.com/technet/treeview/default.asp?url=/technet/security/bulletin/notify.asp 上预定 Microsoft 安全通知服务,使自己能够及时知道有关 Microsoft 安全问题和修补程序的信息。您将通过电子邮件获得有关安全问题的自动通知。
您还应当考虑在桌面上放置 Microsoft 安全顾问程序的快捷方式。要完成此操作,请执行下列步骤:
- 打开 Internet Explorer。
- 导航到 http://www.microsoft.com/technet/security/bulletin/notify.asp。
- 从“收藏”菜单中选择“添加到收藏夹”。
- 选中“允许脱机使用”复选框。
- 单击“自定义”。
- 在“脱机收藏夹向导”中单击“下一步”。
- 选中“是”选项按钮并指定下载与该页链接的 2 层网页。
- 单击“下一步”。
- 选中“创建新的计划”选项按钮,然后单击“下一步”。
- 接受默认设置,再单击“下一步”。
- 单击“完成”。
- 单击“确定”。
- 从“收藏”菜单中选中“整理收藏夹”。
- 在“整理收藏夹”对话框中选择“Microsoft TechNet Security”快捷方式。
- 单击“属性”。
- 单击“Microsoft TechNet Security 属性”对话框的“下载”选项卡。
- 取消选中“跟踪本页 Web 站点之外的链接”复选框。
- 单击“确定”,然后单击“关闭”。
现在您可以将 Microsoft TechNet Security 快捷方式从“收藏”菜单拖到桌面上。如果有新的安全消息,图标上将出现一个小红标记。
要点 如果出现了新的安全问题,您必须非常重视它们。这一点再怎么强调也不为过。
Windows 2000 安全考虑事项 |
本部分内容专门讲述有关 Windows 2000 的安全问题。
检查、更新及部署提供的 Hisecweb.inf 安全模板
我们已经包括了名为 Hisecweb.inf 的安全模板,作为适用于大多数安全网站的基准。该模板配置了基本的 Windows 2000 系统范围策略。
Hisecweb.inf 可以从如下地址下载:
http://download.microsoft.com/download/win2000srv/SCM/1.0/NT5/EN-US/hisecweb.exe
执行下列步骤来使用模板:
- 将模板复制到 %windir%\security\templates 目录。
- 打开“安全模板”工具,并查看设置。
- 打开“安全配置和分析”工具,并加载模板。
- 右键单击“安全配置和分析”工具,并从上下文菜单中选择“立即分析计算机”。
- 等待工作完成。
- 检查查找结果并按需要更新模板。
- 如果您对模板满意,请右键单击“安全配置和分析”工具,并从上下文菜单中选择“立即配置计算机”。
配置 IPSec 策略
您应当认真考虑在每一个 Web 服务器上设置 Internet 协议安全性 (IPSec) 包筛选器策略。如果您的防火墙被攻破,该策略将提供额外的安全级别。多级别安全技术通常被认为是很好的做法。
一般而言,除了那些您明显希望支持的协议与希望打开的端口以外,应当阻止其他所有 TCP/IP 协议。您可以使用 IPSec 管理工具或 IPSecPol 命令行工具来部署 IPSec 策略。
保护 Telnet 服务器安全
如果您打算使用包含在 Windows 2000 中的 Telnet 服务器,您应当考虑限制能够访问该服务的用户。要完成此操作,请执行下列步骤:
- 打开“本地用户和组”工具。
- 右键单击“组”节点,并从上下文菜单中选择“新建组”。
- 在“组名”框中输入 TelnetClients。
- 单击“添加”以添加对该计算机有 telnet 访问权限的用户。
- 单击“创建”,再单击“关闭”。
当存在 TelnetClients 组时,Telnet 服务将仅允许那些在组中定义的用户访问服务器。
IIS 5 安全考虑事项 |
本部分内容专门讲述有关 Internet Information Services 5 的安全问题。
为虚拟目录设置适当的 ACL
虽然此步骤从某种程度上来说取决于应用程序,但一些主要规则仍然适用,如表 F-1 所示。
文件类型 | 访问控制列表 |
---|---|
CGI (.exe, .dll, .cmd, .pl)
| Everyone (X) Administrators(完全控制) System(完全控制)
|
脚本文件 (.asp)
| Everyone (X) Administrators(完全控制) System(完全控制)
|
包含文件 (.inc, .shtm, .shtml)
| Everyone (X) Administrators(完全控制) System(完全控制)
|
静态内容 (.txt, .gif, .jpg, .html)
| Everyone (R) Administrators(完全控制) System(完全控制)
|
推荐使用的各文件类型的默认 ACL
与为每一个文件单独设置 ACL 相比,更好的办法是为每一种文件类型创建新的目录,在这些目录上设置 ACL,并允许 ACL 继承到文件。例如,目录结构可能如下所示:
- c:\inetpub\wwwroot\myserver\static (.html)
- c:\inetpub\wwwroot\myserver\include (.inc)
- c:\inetpub\wwwroot\myserver\script (.asp)
- c:\inetpub\wwwroot\myserver\executable (.dll)
- c:\inetpub\wwwroot\myserver\images (.gif, .jpeg)
此外,有两个目录需要特别注意:
- c:\inetpub\ftproot (FTP server)
- c:\inetpub\mailroot (SMTP server)
这两个目录上的 ACL 都是“Everyone(完全控制)”,应当根据您的功能级别覆盖为更加严格的设置。如果要支持“Everyone(写入)”,请将该文件夹放置到与 IIS 服务器不同的卷中,或者使用 Windows 2000 磁盘空间配额来限制可以写入这些目录的数据量。
设置适当的 IIS 日志文件 ACL
请确保 IIS 生成的日志文件 (%systemroot%\system32\LogFiles) 上的 ACL 是:
- Administrators(完全控制)
- System(完全控制)
- Everyone (RWC)
这有助于防止恶意用户删除文件以掩饰他们的踪迹。
启用日志记录
当您希望确定服务器是否正受到攻击时,日志记录是非常重要的。应当通过下列步骤使用 W3C 扩展日志记录格式:
- 加载 Internet Information Services 工具。
- 右键单击怀疑有问题的站点,然后从上下文菜单中选择“属性”。
- 单击“网站”选项卡。
- 选中“启用日志”复选框。
- 从“活动日志格式”下拉列表中选择“W3C 扩展日志文件格式”。
- 单击“属性”。
- 单击“扩展属性”选项卡,然后设置下列属性:
- 客户端 IP 地址
- 用户名
- 方法
- URI 资源
- HTTP 状态
- Win32 状态
- 用户代理
- 服务器 IP 地址
- 服务器端口
仅当您将多个 Web 服务器设置在同一计算机上时,后两个属性才有用。Win32 Status 属性非常适合于调试。当您检查日志时,请注意错误 5,即被拒绝的访问。您可以通过在命令行中输入 net helpmsg err (其中 err 代表您感兴趣的错误号码)来找出其他 Win32 错误是什么含义。
设置 IP 地址/DNS 地址限制
这并非要设置的普通选项,但是如果希望限制某些用户访问您的网站,这将是一个有用的选项。请注意如果您输入域名系统 (DNS) 名称,那么 IIS 将必须执行 DNS 检查,这将很费时间。
验证可执行内容的可信度
要了解可执行内容是否可信是很难的。有一个小测试是用 DumpBin 工具来查看可执行内容是否调用了某些 API。许多 Win32 开发工具都含有 DumpBin。例如,如果您希望查看名为 MyISAPI.dll 的文件是否调用 RevertToSelf,请使用下列语法:
dumpbin /imports MyISAPI.dll | find "RevertToSelf"
如果屏幕上未出现结果,MyISAPI.dll 将不直接调用 RevertToSelf。它将可能通过 LoadLibrary 来调用该 API,在此情况下您也可以使用相似的命令来进行查找。
在 IIS 服务器上更新根目录的 CA 证书
该过程包括两个步骤:第一步:添加所有信任的新根目录证书颁发机构 (CA) 证书—尤其是任何通过使用 Microsoft Certificate Services 2.0 创建的新根目录 CA 证书。第二步:删除所有不信任的根目录 CA 证书。请注意如果您不知道发布根目录证书的公司名称,那么就不应当信任他们!
所有 IIS 使用的根目录 CA 证书都存放在计算机的机器存储中。可以通过下列步骤来访问该机器存储:
- 打开 Microsoft Management Console (MMC)。
- 从“控制台”菜单中选择“添加/删除管理单元”,然后单击“添加”。
- 选择“证书”并单击“添加”。
- 单击“计算机帐户”选项按钮。
- 单击“下一步”。
- 选中所指机器。
- 单击“完成”。
- 单击“关闭”,再单击“确定”。
- 展开证书节点。
- 扩展信任的根目录证书颁发机构。
- 选择证书。
右窗格将显示当前信任的全部根目录 CA 证书。如果需要,可以删除多个证书。
注意: 不要删除 Microsoft 或 VeriSign 根目录。操作系统会大量使用它们。
禁用或删除所有示例应用程序
示例仅仅是示例;默认情况下并不安装它们,并且永远不应在产品服务器上安装。请注意,某些示例是安装的,使它们只能通过 http://localhost 或 127.0.0.1 进行访问,即使这样也应将其删除。
F-2 表列举了某些示例的默认位置。
示例 | 虚拟目录 | 位置 |
---|---|---|
IIS 示例
| \IISSamples
| c:\inetpub\iissamples
|
IIS 文档
| \IISHelp
| c:\winnt\help\iishelp
|
数据访问
| \MSADC
| c:\program files\common files\system\msadc
|
包含在 Internet Information Server 5 中的示例文件。
禁用或删除不需要的 COM 组件
某些 COM 组件对于多数应用程序都是不需要的,应当将其删除。尤其需要考虑禁用“文件系统对象”组件,但请注意这样也会删除 Dictionary 对象。请注意某些程序可能需要您禁用的组件。例如:Site Server 3.0 使用“文件系统对象”。下列命令将禁用“文件系统对象”:
regsvr32 scrrun.dll /u
删除 IISADMPWD 虚拟目录
该目录允许您重新设置 Windows NT 和 Windows 2000 密码。这主要是为 Intranet 方案设计的,并且不作为 IIS 5 的一部分来安装,但是在 IIS 4 服务器升级到 IIS 5 时将不会被删除。如果您不使用 Intranet 或者您将服务器连接到网站上,则应当将其删除。有关此功能的详细信息,请参考 Microsoft Knowledge Base 文章 Q184619。
删除不使用的脚本映射
IIS 预配置为支持常见的文件扩展名,如 .asp 和 .shtm 文件。当 IIS 接收到针对其中某一类型文件的请求时,该调用由 DLL 进行处理。如果您不会用到其中某些扩展名或功能,请按照如下步骤进行删除:
- 打开 Internet 服务管理器。
- 右键单击 Web 服务器,并从上下文菜单中选择“属性”。
- 主属性
- 选择“WWW 服务”|“编辑”|“HomeDirectory”|“配置”
删除下列引用:
如果您不使用... | 请删除项目: |
---|---|
基于网站的密码重置
| .htr
|
Internet 数据库连接器(所有 IIS 5 网站应当使用 ADO 或相似技术)
| .idc
|
服务器端包含程序
| .stm, .shtm 和 .shtml
|
Internet 打印
| .printer
|
索引服务器
| .htw, .ida and .idq
|
注意: “Internet 打印”可以通过组策略和 Internet 服务管理器来配置。如果组策略设置和 Internet 管理器设置有冲突,那么组策略设置优先。如果您通过 Internet 服务管理器删除“Internet 打印”,请务必验证不能通过本地或域的组策略重新启用它。(默认组策略既不启用也不禁用“Internet 打印”)。请在 MMC 组策略管理单元中,选择“计算机配置”|“管理模板”|“打印”|“基于 Web 的打印”。
注意: 除非出于危急任务的原因要使用 .htr 功能,否则应当删除 .htr 扩展名。
检查 ASP 代码中的 <FORM> 和查询字符串输入
许多站点使用从用户那得到的输入来直接调用其他代码或创建 SQL 声明。换句话说,它们将该输入当作有效的、格式良好的、无恶意的输入。但为了安全起见,却不应当这样。因为实际工作中存在很多这样的攻击,其中用户输入被错误的当作有效输入,使用户能够获得服务器的访问权限或者产生损害。您应当在将其传送给另一个过程或方法调用(它们可能会使用外部资源,比如文件系统或数据库)前,检查每个 <FORM> 输入和查询字串。
您可以使用 JScript V5 和 VBScript V5 常规表达式功能来执行文本检查。下列示例代码将去掉那些只包含无效字符(不是 0-9a-zA-Z 或 _ 的字符)的字符串:
Set reg = New RegExp
reg.Pattern = "\W+" ' One or more characters which
' are NOT 0-9a-zA-Z or '_'
strUnTainted = reg.Replace(strTainted, "")
下列示例将去掉 | 运算符后的所有文本:
Set reg = New RegExp
reg.Pattern = "^(.+)\|(.+)" ' Any character from the start of
' the string to a | character.
strUnTainted = reg.Replace(strTainted, "$1")
同样,使用“脚本文件系统对象”打开或创建文件时请小心。如果文件名是基于用户输入,那么用户可能企图打开一系列端口或打印机。下列 JScript 代码会去掉无效文件名:
var strOut = strIn.replace(/(AUX|PRN|NUL|COM\d|LPT\d)+\s*$/i,"");
版本 5 脚本引擎中的模式语法与 Perl 5.0 中的相同。请参考位于 http://msdn.microsoft.com/scripting/default.htm 的 V5 脚本引擎文档获取详细信息,有关范例请访问 http://msdn.microsoft.com/workshop/languages/clinic/scripting051099.asp。
禁用父路径
父路径允许您在调用诸如 MapPath 等功能时使用“..”。默认状态下,该选项是启用的,您应当禁用它。按照以下步骤禁用该选项:
- 右键单击网站的根目录,然后从上下文菜单中选择“属性”。
- 单击“主目录”选项卡。
- 单击“配置”。
- 单击“App 选项”选项卡。
- 取消选中“启用父路径”复选框。
在“内容 – 位置”中禁用 IP 地址
“内容 – 位置”首部会暴露通常隐藏在网络地址转换 (NAT) 防火墙或代理服务器后的内部 IP 地址。