摘要:由 Microsoft 工程师使用 Microsoft .NET Framework、Microsoft Windows 2000 Advanced Server、Internet 信息服务 5.0 和 Microsoft SQL Server 2000 构建的 Web 站点,在 eWeek OpenHack 4 竞赛中成功顶住了 82,500 多次攻击,并一举胜出。本文介绍此解决方案的构建和配置方法,并为软件开发人员和系统管理员确保自己的解决方案的安全性提供了最佳方案。(本文包含一些指向英文站点的链接。)
简介
Web 应用程序 Internet 信息服务 (IIS) 5.0 Windows 2000 Advanced Server 操作系统 IP 安全标准 (IPSec) 策略 远程管理与监视 SQL Server 2000 密码 小结 更多信息
简介
eWeek Labs 举行了第四届年度 OpenHack 联机安全性竞赛。此次年度竞赛(这是 Microsoft® 第三次参加此项赛事)旨在通过将系统暴露在 Web 真实而险恶的环境中来测试企业的安全性。eWeek 向 Microsoft 和 Oracle 提供了 Web 应用程序示例,要求双方使用各自的技术重新开发此应用程序。随后,eWeek 又邀请美国各地的计算机用户破坏最终站点的安全性,成功者可领取一定数额的奖金。可接受的破坏包括跨站点的脚本攻击、动态 Web 页面源代码泄漏、破坏 Web 页面、向数据库发送恶意 SQL 命令以及窃取所用数据库中的信用卡数据。
Microsoft 使用 Microsoft® .NET Framework 开发其应用程序。Microsoft® .NET Framework 是一个完整的 Windows 组件,支持构建和运行下一代应用程序和 XML Web Service。此应用程序以 Microsoft® Internet 信息服务 (IIS) 5.0 为宿主,并使用 Microsoft® SQL Server™ 2000 作为其数据库。所有服务器都运行在 Microsoft® Windows® 2000 Advanced Server 操作系统上。(值得注意的是,如果竞赛时已发布带有 IIS 6.0 的 Microsoft® Windows Server 2003,则当时会使用此版本的操作系统。如果使用 Windows Server 2003,则可以省去竞赛中用于“锁定”操作系统和 Web 服务器的几个步骤。)
此应用程序本身模拟 eWeek eXcellence Awards Web 站点。在此站点中,用户可以登记其公司的产品或服务以参与获奖评选。用户可以设置一个帐户,以输入产品或服务进行评选,可以提交信用卡号支付报名费,还可以获取有关奖项本身的信息。Microsoft 使用 .NET Framework 构建其解决方案,.NET Framework 是一个完整的 Windows 组件,用于构建和运行应用程序及 XML Web Service。大多数开发均围绕 Framework 的 ASP.NET、ADO.NET 和加密类库进行,这三项技术提供的功能分别用于构建基于 Web 的应用程序,访问和使用数据,以及加密、解密和确保数据完整性。
窗体身份验证
Microsoft® ASP.NET 类提供了几个用于验证用户身份的选项(即,使用一些凭据,如用户名和密码,来确认给定用户的身份)。这些选项包括集成的 Windows 身份验证、基本身份验证、摘要身份验证、Microsoft® .NET Passport 以及客户证书等。对于每个 eWeek 请求,OpenHack 解决方案选择了基于窗体的或自定义的身份验证。
当用户通过窗体身份验证登录时,系统将创建一个加密的 cookie,用于在整个站点中跟踪用户。(从技术角度而言,cookie 是一个由 Web 站点生成的纯文本字符串,可进入用户的 Web 浏览器内存,用于对浏览站点的用户进行标识。)
如果用户在未登录的情况下请求一个安全页面,系统会将此用户重定向到登录页面,所有这些都只需要使用应用程序的基于 XML 的 Web.config 文件进行配置就可以实现。该文件由 Microsoft® Visual Studio® .NET(用于构建基于 .NET Framework 的应用程序的集成开发环境)自动生成,用于存储 ASP.NET Web 应用程序的配置。
此应用程序中的所有数据访问均通过参数化存储过程完成,这些存储过程是使用 T-SQL 语言开发的,并且根据定义在数据库内运行。将与数据库的交互限制到存储过程,这通常是一个最佳方案。如果不存在存储过程,则 SQL 查询必须由 Web 应用程序动态构造。如果 Web 层遭到破坏,攻击者就可以向数据库查询中插入恶意命令,以检索、更改或删除数据库中存储的数据。使用存储过程,Web 应用程序与数据库的交互操作仅限于通过存储过程发送的几个特定的严格类型参数。每当开发人员使用 .NET Framework 调用存储过程时,系统都会对发送到此存储过程的参数进行检查,以确保它们是存储过程可接受的类型(如整数、8 个字符的字符串等)。这是 Web 层有效性验证上的又一个保护层,可确保所有输入数据格式正确,而且不能自行构造为可操作的 SQL 语句。
任何数据在返回给用户前均采用 HTML 编码。这只需使用 System.Web.HttpServerUtility 类中的HtmlEncode 方法即可实现,如下所示。 SomeLabel.Text = Server.HtmlEncode(username);
HTML 编码有助于防止跨站点的脚本攻击。攻击者一旦破坏了数据库,便可向记录中输入脚本,此脚本随后返回给用户并在浏览器中执行。通过 HTML 编码,大多数脚本命令都自动转换为无害文本。
存储机密信息
安全地存储机密信息(如提供数据库登录信息的数据库连接字符串)很重要,这样可以防止攻击者访问并使用这些机密信息来读取、操作数据或重新配置解决方案。由于本解决方案使用了集成的 Windows 身份验证来访问数据库,因此连接字符串的价值对于攻击者来说已经显著降低,这是因为连接字符串只包含服务器的位置和数据库名称,而不包括特定的凭据(如密码)。
默认情况下,Visual Studio .NET 中的数据库连接向导将把连接字符串作为属性值存储在“内含代码”文件(此文件包含应用程序的核心逻辑,这与提供用户界面定义的文件不同)中。
为了防止攻击者攻击 Web 服务器本身,我们对 Windows 2000 Advanced Server 中的 Internet 信息服务 (IIS) 5.0 Web 服务器进行了适当的更改。首先,安装了 TechNet Web 站点上列出的所有公用安全性修补程序,以确保拥有最新的增强功能。运行任何软件时,安装最新的 Service Pack 和修补程序是一种非常关键的安全方案。
然后,将磁盘上的默认 Web 站点位置从默认位置 c:\inetpub\ 更改到其他卷。因此,一旦系统在某些方面遭到破坏,攻击者将很难导航到此目录树,除非确实了解此目录树的实际位置,也就是说,攻击者无法通过输入 ..\ 作为位置说明来轻松地访问 C: 驱动器。
接着,使用静态 Web 服务器附带的模板运行 IIS 锁定工具。此操作删除了此应用程序中未使用的所有其他动态内容类型。以这种方式减少暴露给潜在攻击者的表面区域通常是很重要的最佳方案。可以免费获得 IIS Lockdown Tool。它是一个很出色的资源,所有运行 IIS 的系统管理员都应该使用它。
本次竞赛使用的服务器全部运行安装了 Service Pack 3(它是竞赛时最新的 Service Pack)的 Windows 2000 Advanced Server 操作系统。还安装了自 Service Pack 3 发行以来 TechNet Web 站点上发布的所有安全性修补程序。使用最新的安全性修补程序对系统管理员同样是一个很重要的最佳安全方案。
创建注册表项:nolmhash (需要说明的是,在 Windows 2000 中,这是一个关键字,而在 Windows XP 和 Windows Server 2003 中,这是一个值。) 位置:HKLM\System\CurrentControlSet\Control\LSA 用途:防止操作系统以 LM 散列格式存储用户密码。此格式只用于不支持 NTLM 或 Kerberos 的 Windows 3.11 客户端。创建和保留此 LM 散列的风险在于,如果攻击者设法将以此格式存储的密码解密,就可以在网络上的其他计算机上重复利用这些密码。
OpenHack SQL Server 2000 数据库运行在专用计算机上,这是一种“层层设防”措施。即使 Web 层崩溃,数据库及它所包含的所有信息仍会受到隔离和保护。
如上所述,我们的解决方案使用集成的 Windows 身份验证连接到数据库。这是一种值得借鉴的方法,因为它不需要开发和安全存储用于访问数据库的密码。
为了确保向后兼容,Windows 2000 和 Windows XP 支持几种类型的身份验证协议。由于只有实现 NTLMv2 身份验证的计算机才能访问我们的数据库服务器,因此强烈建议将 LAN 管理器身份验证级别更改为“仅限于NTLMv2”。注意,使用其他配置,Windows 95、Windows 98 和带有 Service Pack 4 及更高版本的Windows NT Server 4.0 也可以支持 NTLMv2。通过限制所支持的身份验证协议的数量,系统管理员最大限度地减少了暴露给攻击者的表面区域。
"
图 4:设置 LAN 管理器身份验证级别
使用 SQL Server 与使用 Windows 一样,我们需要小心地安装、配置和运行必要的服务,以减少暴露给潜在攻击者的数据库表面区域。对于 OpenHack,我们未安装升级工具、调试符号、复制支持、联机图书或 Dev 工具组件。
该安装是在 NTFS 分区上进行的,因为它可以为 SQL Server 使用的文件和文件夹提供额外的基于 ACL 的安全保护。下一步,通常也是最关键的一步,是安装 SQL Server 2000 Service Pack 2 及所有最新的修补程序。
在服务帐户为 localSystem 的计算机中通常可以找到 SQL Server 安装程序。尽管在锁定良好的专用网络中,这是可以接受的,但由于它是基础计算机上的管理帐户,因此仍具有远远超过 SQL Server 服务真正所需的权限。如果要求服务帐户能够访问网络资源(如备份到网络驱动器时、使用日志传送时或使用复制支持时),则最好选择低权限的域帐户。但如果您的环境不需要这些功能,则完全可以选择低权限的本地帐户。在本次竞赛中,由于不打算使用这些功能,而且为了坚持“最低权限”原则,我们使用了本地用户帐户。
我们使用以下设置创建了一个新的 NT 本地用户帐户: 创建了一个非常强大的密码(详见密码一节的介绍)。 删除了使用户可更改其密码的功能。 删除了“终端服务”访问。
创建新用户帐户后,我们使用 SQL Server Enterprise Manager 更改了启动服务帐户信息,强制数据库服务以此用户的身份运行。
还可以通过禁用 SQL Server 代理和 Microsoft 搜索服务进一步减少表面区域,因为我们的数据库解决方案不需要此功能。
下一步,由于更多考虑的是可靠性而非安全性问题,我们设置了 Microsoft SQL Server 服务本身的属性,并将恢复操作更改为出现故障后重新启动服务。这样做是为了在出现故障时尽量减少停机时间。
"
图 6:将恢复操作更改为出现故障后重新启动服务
然后我们设置了 Server Network 实用程序,并将网络属性从“直接客户端广播”更改为“隐藏 SQL Server”。还删除了“命名管道”协议,因为我们只需要 TCP/IP。
作为此配置的一部分,我们返回到前面的配置,为 SA 帐户设置了非常强大的密码。即使在 Windows 身份验证模式下运行,也建议采用这种做法。如果以后通过企业管理器工具或直接通过注册表从身份验证模式切换到混合模式,您希望确保系统是安全的(即使系统管理员当时忘记设置 SA 密码),也可以使用这种方法。在这种方法中,最好做最坏的打算。
我们将默认的登录审核设置更改为 Failure。此操作将登录 SQL Server 数据库的所有失败尝试都写到错误日志和事件日志,该信息对识别攻击数据库的尝试非常有用。
然后,我们删除了默认的 Northwind 和 Pubs 数据库,以减少暴露给潜在攻击的表面区域。
完成所有步骤后,我们创建了最终解决方案中使用的 Awards 数据库。然后仔细检查表和存储过程,并确保与应用程序关联的帐户对存储过程只有执行权限,而对实际表没有任何权限。这使我们能够控制对存储过程的访问并限制对它的操作,而不必担心针对表直接运行的特殊 SQL 查询。此外,我们还确保了此帐户在 SQL Server 中没有任何其他的特权和权限。
密码
确保任何服务器安全性的关键一步是选择不会被轻易猜出的长而复杂的密码。理想情况下,一个出色的密码应至少包括以下四组字符中的三组:小写 a 至 z、大写 A 至 Z、数字 0 至 9,以及非字母数字符号(如“>”、“*”、“&”等)。为了尽可能保证安全,密码应由以上四组中的每一组字符以及使用 ALT 键生成的字符组成。利用这些字符集创建长度至少为八个字符的密码,可最大限度地降低攻击者推测出登录凭据的机会。这是 OpenHack 解决方案中的每个服务器都使用的方法,也是我们极力向您推荐的方法。
小结
确保 OpenHack 解决方案安全性所采取的所有步骤并非适用于每个 Web 解决方案。这些步骤也并不能代表开发人员和系统管理员在确保解决方案的安全性时应采取的所有方法。每个项目都具有独特性,需要开发人员和管理员一起找出潜在的攻击因素及预防措施。也就是说,OpenHack 4 表明上述建议非常有价值。即使它们不能全部直接应用到您的解决方案中,也应从中提取一些关键的好方案,以便在构建安全解决方案时以一种形式或另一种形式加以应用:
1.在原始设计中考虑安全问题。这包括开发进程以采用最新的 Service Pack 和修补程序。 2.总是安装最新的 Service Pack 和修补程序。 3.总是使用复杂且不明显的密码。 4.关闭所有不必要的功能以减少暴露给攻击者的表面区域。 5.坚持“最低权限”原则。决不授予并非绝对必需的权限。 6.预测可能发生的故障并总是采用“层层设防”以减少负面影响。 7.使用 IIS 时,运行 IIS 锁定工具和 URLScan。 8.验证所有输入数据。 9.使用参数化的存储过程,而不是在数据库上生成动态查询。
关闭本页
相关文章
标签NewsAbout错误:Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.