Web 安全解决方案一览
在本单元中
本单元包括一个总结了在提高 Web 应用程序安全:威胁与对策中介绍的解决方案的路线图。提供了本指南相应材料的链接,从而使您容易找到所需要的信息和具体问题的解决方案。本单元是按照角色组织的,覆盖了适合于设计人员与架构师、开发人员和管理员的解决方案。
目标
使用本单元:
• | 迅速找到具体安全问题的解决方案。 |
• | 快速、容易地导航本指南。 |
应用于
本单元没有任何技术信息,只有适用于下列产品和技术的指南:
• | Microsoft® Windows® Server 2000 and Windows Server™ 2003 操作系统 |
• | Microsoft .NET Framework 1.1 |
• | ASP.NET 1.1 |
• | Microsoft SQL Server™ 2000 |
如何使用本单元
可以使用本单元寻找提高 Web 应用程序安全:威胁与对策中覆盖的安全解决方案的链接和参考。
本指南介绍的安全解决方案适用于产品的整个生命周期和多种角色。本单元介绍的解决方案路线图是为架构师、开发人员和系统管理员组织的。
• | 对架构师:
| ||||||||||||||||||||||||||||
• | 对开发人员:
| ||||||||||||||||||||||||||||
• | 对于管理员:
|
本页内容
体系结构和设计解决方案 | |
开发解决方案 | |
管理解决方案 |
体系结构和设计解决方案
为了帮助您设计安全的 Web 应用程序,本指南为架构师提供了下列解决方案:
• | 如何识别和评估威胁 使用威胁建模系统地识别威胁,而不是以任意的方式应用安全性。接着,根据攻击或安全损害产生的风险和可能造成的潜在损失,对威胁进行评价。这样就可以适当的次序对威胁进行处理。 有关创建威胁模型和评估威胁风险的详细信息,请参阅“威胁建模”单元。 |
• | 如何创建安全的设计 使用尝试或检验过的设计原则。集中处理关键区域,在这些区域,方法正确是必须的,而且经常会出现错误。本指南将它们称为应用程序缺陷类别。其中包括输入验证、身份验证、授权、配置管理、敏感数据保护、会话管理、密码系统、参数处理、异常管理和审核与日志记录各项。要特别注意部署问题,包括拓扑、网络基础设施、安全策略和步骤。 有关更多信息,请参阅“设计安全 Web 应用程序的指导方针”单元。 |
• | 如何执行体系结构和设计复查 应用程序设计的复查与目标部署环境和相关的安全策略有关。需要考虑底层基础设施层安全性(包括边界网络、防火墙、远程应用程序服务器等)带来的限制。使用应用程序缺陷类别帮助您对应用程序进行分类,并分析适合于每个领域的方法。 有关更多信息,请参阅“安全性体系结构和设计检查”单元。 |
开发解决方案
本指南为开发人员提供了下列解决方案:
• | 什么是 .NET Framework 安全性? .NET Framework 提供了用户和代码安全模型,允许对用户和代码可以执行的操作进行限制。要对基于角色的安全性和代码访问安全性进行编程,可以从 System.Security 命名空间中使用类型。.NET Framework 还提供了 System.Security.Cryptography 命名空间,公开对称和不对称的加密与解密、散列、随机数生成、数字签名支持等。 要理解 .NET Framework 安全性基本设置,请参阅“.NET 安全基础”单元。 |
• | 如何编写安全托管代码 用强名称对程序集进行数字签名,使它们不能随意改动。同时,在结合使用强名称的程序集和 ASP.NET 时,需要注意强名称的问题。通过遵守坚固的面向对象设计原理,减小程序集受攻击面,然后使用代码访问安全性,进一步限制哪些代码可以调用您的代码。使用结构化的异常处理方法防止敏感信息蔓延到当前信任边界之外,并开发更加可靠的代码。避免常规问题,特别是输入文件名和 URL 的问题。 有关如何提高托管代码安全性的信息,请参阅“构建安全的程序集”单元。有关如何有效使用代码访问安全性,以进一步提高安全性的详细信息,请参阅“代码访问安全实践”单元。有关执行托管代码复查的信息,请参阅“Security Code Review”单元。 |
• | 如何安全地处理异常 不要显示内部系统或应用程序的详细信息,如堆栈跟踪、SQL 语句片断等。确保这类信息不被允许蔓延到最终用户或当前信任边界以外。 在异常事件中安全地失败,确保应用程序拒绝访问,而且没有停留在不安全的状态下。不记录敏感或私有数据,如密码,以免造成危害。在记录或报告异常时,如果用户的输入包括在异常消息中,对其进行验证或清理。例如,如果返回一个 HTML 错误消息,您应该对输出进行编码,以避免脚本注入。 有关更多信息,请参阅“构建安全的程序集”和“构建安全的 ASP.NET 页和控件”两单元的“Exception Management”部分。 |
• | 如何执行托管代码的安全复查 使用分析工具(如 FxCop)分析二进制程序集,确保它们符合 .NETFramework 设计准则。修复分析工具识别出的所有安全缺陷。使用文本搜索工具扫描硬编码机密(如密码)的源代码库。之后,复查具体的应用程序元素,包括 Web 页面和控件、数据访问代码、Web 服务、服务组件等。要特别注意 SQL 注入和跨站点脚本编写缺陷。 还要对使用敏感的代码访问安全技术进行复查,如链接声明和断言。有关更多信息,请参阅“Code Review”单元。 |
• | 如何保证开发人员工作站的安全性 您可以使用一套方法保证工作站的安全性。保证您的帐户、协议、端口、服务、共享、文件与目录和注册表的安全。最重要的是,保持您的工作站具有当前最新的补丁与更新。如果您在 Microsoft Windows_ XP 或 Windows 2000 上运行 Internet 信息服务 (IIS),则运行 IISLockdown。IISLockdown 应用安全的 IIS 配置,并安装 URLScan Internet 安全应用程序编程接口 (ISAPI) 筛选器,该筛选器用于检测和拒绝潜在的恶意 HTTP 请求。例如,您可能需要修改默认 URLScan 的配置,这样您就可以在开发和测试期间调试 Web 应用程序。 有关更多信息,请参阅本指南的“如何做”部分的“如何保证开发人员工作站的安全”。 |
• | 如何结合使用代码访问安全性和 ASP.NET 使用 .NET Framework 版本 1.1,您可以在 Machine.config 或 Web.config 中设置 ASP.NET 的信任级。这些信任级使用代码访问安全性,以限制 ASP.NET 应用程序可以访问的资源,例如文件系统、注册表、网络、数据库等。此外,它们还提供了应用程序隔离。 有关从 ASP.NET 使用代码访问安全性、开发部分信任的 Web 应用程序和沙箱化特权代码的详细信息,请参阅“在 ASP.NET 中使用代码访问安全”单元。 有关代码访问安全性的基础的详细信息,请参阅“代码访问安全实践”单元。 有关在开发托管代码时需要考虑的代码访问安全性问题的详细信息,请参阅“构建安全的服务组件”、“构建安全的 Web 服务”、“构建安全的远程组件”和“构建安全的数据访问”等单元的“代码访问安全注意事项”部分。 |
• | 如何编写具有最低权限的代码 可以限制代码能够执行的操作,这与运行该代码所使用的帐户无关。通过配置策略或如何编写代码,您可以使用代码访问安全性来限制代码允许被访问的资源和操作。如果代码不需要访问某种资源或执行某种敏感操作(如调用非托管代码),可以使用声明性安全属性来确保代码不会被管理员授予这种权限。 有关更多信息,请参阅 “代码访问安全实践”单元。 |
• | 如何限制文件 I/O 可以使用代码访问安全性来限制程序集访问文件系统区域和执行 I/O 的能力。例如,可以限制某个 Web 应用程序,使它只能在它的虚拟目录层次结构下执行文件 I/O。您也可以将文件 I/O 限制在特定的目录上。这可以通过编程或配置代码访问安全策略来完成。 有关更多信息,请参阅“代码访问安全实践”单元的“文件 I/O”和“在 ASP.NET 中使用代码访问安全”单元的“媒体信任”。有关配置代码访问安全策略的详细信息,请参阅“如何使用 CAS 策略约束程序集”。 |
• | 如何防止 SQL 注入 使用数据访问的参数化存储过程。使用参数要确保输入值的类型和长度都得到检查。参数也被视作安全文本值和数据库内的不可执行代码。如果不能使用存储过程,就使用带有参数的 SQL 语句。不要通过连接 SQL 命令和输入值来构建 SQL 语句。还要确保应用程序使用具有最低权限的数据库登录,以限制它在数据库中的功能。 有关 SQL 注入的详细信息和进一步对策,请参阅“构建安全的数据访问”单元的“SQL 注入”。 |
• | 如何防止跨站点脚本编写 对输入类型、长度、格式和范围进行验证,并对输出进行编码。如果输出包括输入(包括 Web 输入),则对输出进行编码。例如,对窗体字段、查询字符串参数、cookie 等进行编码,以及对从无法假定其数据是安全的数据库(特别是共享数据库)中读取的输入进行编码。对需要以 HTML 返回客户端的自由格式输入字段,对输出进行编码,然后选择性地清除在许可元素(如用于格式化的 <b> 或 标记)上的编码。 有关更多信息,请参阅“构建 ASP.NET 页和控件”单元的“跨站点脚本编写”。 |
• | 如何管理机密 最好寻找避免存储机密的替代方法。如果必须存储它们,则不要在源代码或配置文件中以明文的方式存储。使用数据保护应用程序编程接口 (DPAPI) 加密机密,以避免关键的管理问题。 有关更多信息,请参阅“构建安全的 ASP.NET 页和控件”单元的“敏感数据”、“构建安全的程序集”单元的“加密”和“保证 ASP.NET 应用程序的安全”单元的“Aspnet_setreg.exe 与进程、会话和标识”。 |
• | 如何安全地调用非托管代码 特别注意传递给非托管 API 和非托管 API 传递出的参数,防止潜在的缓冲区溢出。验证输入和输出字符串参数的长度,检查数组边界,并特别小心文件路径的长度。在断言非托管代码权限之前,使用自定义权限声明保护对非托管资源的访问。如果用 SuppressUnmanagedCodeSecurityAttribute 提高性能,请小心使用。 |
• | 如何执行安全的输入验证 对输入进行限制、拒绝和清理,因为验证已知有效类型、模式和范围的数据要比通过查找已知错误字符来验证数据容易得多。验证数据的类型、长度、格式和范围。对字符串输入,请使用正则表达式。要使用执行类型检查,则使用 .NET Framework 类型系统。有时候,可能需要对输入进行清理。一个例子是对数据编码,以保证其安全性。 有关输入验证设计策略,请参阅“设计安全 Web 应用程序的指导方针”单元的“输入验证”。有关实现细节,请参阅“构建安全的 ASP.NET 页和控件”、“构建安全的 Web 服务”、“构建安全的远程组件”和“构建安全的数据访问”单元的“输入验证”部分。 |
• | 如何保证窗体身份验证的安全性 划分 Web 站点,隔离匿名用户可以访问的公共可访问页面和需要身份验证访问的限制性页面。使用安全套接字层 (SSL) 来保护窗体身份验证凭据和窗体身份验证 cookie。限制会话生存时间和确保身份验证 cookie 只在 HTTPS 上传输。对身份验证 cookie 加密,不要在客户端计算机上保留它,也不要将其用于个性化目的;对个性化使用单独的 cookie。 有关更多信息,请参阅“保证 ASP.NET 应用程序的安全”和“构建安全的 ASP.NET 页和控件”两单元中的 “身份验证”部分。 |
管理解决方案
本指南为管理员提供了以下解决方案:
• | 如何实现补丁管理 使用 Microsoft Baseline Security Analyzer (MBSA) 检查当前安装可能漏掉的补丁和更新。定期运行该操作,保持您的服务器当前安装有最新的补丁和更新。在应用补丁前,备份服务器;在将补丁安装在产品服务器上之前,先在测试服务器上进行测试。还要使用 Microsoft 提供的安全通知服务,并订阅通过电子邮件接收安全布告。 有关更多信息,请参阅“如何实现修补程序管理”。 |
• | 如何使 Machine.config 和 Web.config 中的设置更加安全 不要以明文形式存储密码或敏感数据。例如,使用 Aspnet_setreg.exe 实用工具加密 <processModel>、<identity> 和 <sessionState> 的值。不要对客户端显示异常详细信息。例如,不能在 ASP.NET 中使用 <customErrors> 的 mode="Off",因为这会导致含有系统级信息的详细错误页面返回客户端。对具有访问配置文件和设置的权限的用户进行限制。如果需要,使用<location> 标记和 allowOverride 元素锁定配置设置。 有关提高适于应用情境的 Machine.config 和 Web.config 安全性的详细信息,请参阅“保证 ASP.NET 的安全”单元。有关 <location> 标记的详细信息,请参阅“保证 ASP.NET 的安全”单元解释的“Machine.Config 和 Web.Config”。有关 Aspnet_setreg.exe 的详细信息,请参阅“保证 ASP.NET 应用程序的安全”单元的“Aspnet_setreg.exe 与进程、会话和标识”。 |
• | 如何保证运行 .NET Framework 的 Web 服务器的安全性 用一种方法系统配置 Web 服务器的安全性。保证帐户、协议、端口、服务、共享、文件与目录和注册表的安全性。可以使用 IISLockdown,以有助于自动进行某些安全配置。使用一个增强的 Machine.config 配置,对服务器上安装的所有 .NET Framework 应用程序应用严格的安全性。最重要的是,保持您的服务器安装了当前最新的补丁和更新。 有关更多信息,请参阅“保证应用程序服务器的安全”单元。 |
• | 如何保证数据库服务器的安全性 应用一种常见方法评估帐户、协议、端口、服务、共享、文件与目录和注册表。还要评估 SQL Server的安全设置,如身份验证模式和审核配置。评估身份验证方法和 SQL Server登录、用户与角色的使用。确保您具有最新的服务包,定期监测操作系统和 SQL Server 补丁与更新。 有关更多信息,请参阅“保证数据库服务器的安全”单元。 |
• | 如何保证应用程序服务器的安全性 评估帐户、协议、端口、服务器、共享、文件与目录和注册表。使用 Internet 协议安全 (IPSec) 或 SSL 保证 Web 服务器和应用程序服务器之间的通信通道及应用程序服务器和数据库服务器之间的通信通道的安全。复查企业服务应用程序、Web 服务和远程处理应用程序的安全。限制客户端可以连接到应用程序服务器的端口的范围,并考虑使用 IPSec 约束来限制客户端的范围。 有关更多信息,请参阅“保证应用程序服务器的安全”单元。 |
• | 如何安全地承载多个 ASP.NET 应用程序 使用单独标识来允许在安全资源上配置访问控制列表 (ACL),以控制哪些应用程序可以访问这些安全资源。在 Microsoft Windows Server 2003 操作系统上,使用单独的具有 IIS6 应用程序池的进程标识。在 Windows 2000 Server 上,使用多个匿名 Internet 用户帐户并允许模拟。在这两种平台上,通过 .NET Framework版本 1.1,可以使用部分信任级和使用代码访问安全,提供进一步的应用程序隔离。例如,可以使用这些方法防止应用程序访问彼此的虚拟目录和重要的系统资源。 有关更多信息,请参阅“承载多个 ASP.NET 应用程序”单元。 |
• | 如何保证 Web 服务的安全性 在跨平台和无法控制两个终结点的情况下,可以使用 Microsoft .NET 的 Web Service Enhancement 1.0 (WSE) 实现符合新兴的 WS-Security 标准的消息级安全解决方案。在简单对象访问协议 (SOAP) 头中传递身份验证令牌。使用 XML 加密以确保敏感数据保持其私有性。使用数字签名保证消息的完整性。在能够控制两个终结点的企业内部,可以使用操作系统和 IIS 提供的身份验证、授权和安全通信功能。 有关更多信息,请参阅“Securing Your Application Server”和“保证 ASP.NET 应用程序的安全”两单元。有关开发安全的 Web 服务的信息,请参阅“构建安全的 Web 服务”单元。 |
• | 如何保证企业服务的安全性 配置使用最低权限帐户运行的服务器应用程序。启用 COM+ 基于角色的安全性,并实行组件级访问检查。至少要使用调用级身份验证来防止匿名访问。要保证传输到远程服务组件的通信的安全性,请使用 IPSec 加密的通道或使用远程过程调用 (RPC) 加密。限制分布式 COM (DCOM) 动态分配的端口范围或使用静态终结点映射将端口范围限制在特定端口内。定期监测 COM+ 运行库的 Quick Fix Engineer (QFE) 更新。 有关更多信息,请参阅“保证应用程序服务器的安全”单元。 |
• | 如何保证 Microsoft .NET 的远程处理安全性 通过将 .rem 和 .soap 扩展名映射为 Machine.config 中的 ASP.NET HttpForbiddenHandler HTTP 模块,禁用面向 Internet 的 Web 服务器上的远程处理。寄宿在 ASP.NET 中,使用 HttpChannel 类型名称从 ASP.NET 和 IIS 身份验证和授权服务中获益。如果需要使用 TcpChannel 类型名称,则将远程组件寄宿在 Windows 服务中,使用 IPSec 限制哪些客户端可以连接到服务器。只能在受信任的服务器的情况下使用该方法,在这里远程处理客户端(例如 Web 应用程序)对初始调用者进行身份验证和授权。 有关更多信息,请参阅“保证应用程序服务器的安全”单元。 |
• | 如何保证会话状态的安全性 在网络上传输和在状态存储区中时,需要保护会话状态。如果使用远程状态存储区,请使用 SSL 或 IPSec 保证通往状态存储区的通信通道的安全。同时,加密 Machine.config 中的连接字符串。如果使用 SQL Server 状态存储区,则在连接状态存储区时,使用 Windows 身份验证,并限制应用程序对数据库的登录。如果使用 ASP.NET 状态服务,则使用最低权限帐户运行该服务,并考虑改变服务侦听的默认端口。如果不需要状态服务,请禁用它。 有关更多信息,请参阅“保证 ASP.NET 应用程序的安全”单元的“会话状态”。 |
• | 如何安全地管理应用程序的配置 应该限制或避免远程管理。管理界面必需有严格的身份验证。通过 ACL 和权限限制对配置存储区的访问。确保您具有支持责任划分所需的授权粒度。 有关保证配置管理安全性的常规考虑,请参阅“设计安全 Web 应用程序的指导方针”。要验证安全默认设置和确保您应用了安全的机器级别的设置和安全的应用程序具体的设置,请参阅“保证 ASP.NET 应用程序的安全”单元。 |
• | 如何防止拒绝服务攻击 确保加强了服务器上的 TCP/IP 堆栈配置,以应对如 SYN flood 这样的攻击。配置 ASP.NET 以限制接受的 POST 请求的规模,并对请求的执行时间做出限制。 有关加强 TCP/IP 的详细信息,请参阅“如何加固 TCP/IP 栈”。有关用于帮助防止拒绝服务攻击的 ASP.NET 设置的详细信息,请参阅“保证 ASP.NET 应用程序的安全”单元。 |
• | 如何限制文件 I/O 您可以配置代码访问安全策略,以确保限制单个程序集或整个 Web 应用程序只能访问文件系统。例如,通过配置运行在媒体信任级上的 Web 应用程序,可以防止应用程序访问其虚拟目录层次结构以外的文件。 同时,通过为特定程序集授予受限的文件 I/O 权限,可以精确控制哪些文件可以被访问以及应该如何访问它们。 有关更多信息,请参阅 “在 ASP.NET 中使用代码访问安全”单元和本指南的“如何做”部分的“如何使用 CAS 策略约束程序集”。 |
• | 如何执行远程管理 终端服务提供了一种专用的协议 (RDP)。它支持身份验证,并可以提供加密。如果需要文件传输工具,可以从 Windows 2000 Server 资源包中安装文件复制实用工具。建议不要使用 IIS Web 管理,如果运行 IISLockdown 该选项将被清除。应该考虑提供一个加密的通信通道,并使用 IPSec 限制可以用于远程管理您的服务器的计算机。还应该限制管理帐户的数量。 有关更多信息,请参阅“保证 Web 服务器的安全”单元的“远程管理”部分和“保证数据库服务器的安全”。 |