ASP.NET 2.0应用程序安全强化纵览

  1. 云栖社区>
  2. 博客>
  3. 正文

ASP.NET 2.0应用程序安全强化纵览

橘子红了呐 2017-11-17 17:27:00 浏览876
展开阅读全文
目前,实现Web开发的核心技术之一是ASP.NET 2.0。这种技术能够帮助企业快速开发出功能强大的Web应用程序,深受开发人员喜爱。然而,在开发人员实现业务逻辑的同时,由于各种原因的影响,应用程序的安全性总是不能让人满意。本文的主要目的就是帮助开发维护人员强化ASP.NET应用程序的安全性。众所周知,提高ASP.NET应用程序的安全性涉及很多方面的内容,例如安全代码和操作系统、通讯协议与Microsoft ASP.NET自身的经过强化的配置。因此,本文将从总体指导原则、操作系统、数据库服务器、Web服务器以及ASP.NET等五个方面进行讲解。

   总体指导原则

   下面列出了一些有关安全强化的总体指导原则。遵守这些规则通常会使系统和应用程序更安全,反之则会降低安全性。

   (1)为服务器进行准确单一的定位。很多时候都会看到,一个服务器担当了多个角色,其既要提供Web服务,又要支持邮件、DNS服务器等其它角色。这种做法是非常不安全的。首先,如果一个服务器必须支持多个角色,那么就会使配置更加复杂,而复杂的事物是安全的天敌。其次,如果在允许系统级访问的组件中发现一个弱点,那么会危及同一计算机中的所有其它服务的安全。再次,如果在一个服务器中配置许多功能,那么由于某些原因造成其死机,就会丧失多个网络服务。

   (2)最小化服务器中的软件和服务。在确定了服务器在网络中的角色后,应该删除不属于这个角色的所有软件和服务。特别是那些打开端口,并处理网络信息包的服务。这种做法的优点是使整个系统的配置变得更加简单。由于只要更新实际使用的服务,所以补丁被极大地简化。同时,这样还能够减少潜在的、易受攻击的代码和程序。

   (3)设置最少的权限。也就是说,系统中的每个用户或进程应只有完成工作所必须的权限。此外,Web应用程序应始终运行在最少权限的安全环境中,并应该只访问它们需要访问的资源。这可能会涉及内建的NETWORK SERVICE帐户或自定义用户帐户。不要使用高权限的帐户,例如管理员或SYSTEM帐户。

   (4)及时全面的安装补丁。服务器上的所有组件(例如操作系统、数据库和Microsoft .NET Framework)应及时安装最新的安全补丁。这种做法的必要性和重要性是显而易见的。

   (5)配置多方面的防御实体。这意味着应该始终保有多个防御措施。例如,安装防火墙,杀毒软件,信息包过滤器等等。即使维护人员配置了这样的防御措施,也不能认为就万事大吉了。可能在维护人员得意洋洋的时候,那些不怀好意的人也在冷笑。

   (6)重点防御,保护最脆弱的连接。识别应用程序或系统中最脆弱的连接,在其周围放上额外的防御措施。例如,ASP.NET中的登陆页面或网络上的远程访问网关。因为这些区域都是首选攻击目标,并且难于防御,因此通常必须增加更多的监测和防御措施。

   (7)提供强大的身份验证功能。如果通过身份验证来访问到应用程序或系统,那么这个身份验证应始终是强大的。例如,设置强制密码策略,高的密码复杂度等。同时,要考虑使用多因素身份验证或替代的技术,例如使用一次性密码等。

    加强操作系统安全

    根据总体指导原则,首先要做的是,当安装新服务器的操作系统时,要列出所有的要求和必须提供给它们的服务。在这方面,Windows Server 2003做得很不错,它是第一个根据初始安装设置安装基本系统组件和服务的操作系统。不知道Windows Server 2008是否会采取相同策略。在做好这个方面的工作之后,还要注意完成以下安全措施。

   (1)打开自动更新功能。在安装所有必需的组件后(例如,IIS和ASP.NET),应该确定安全最新的补丁。Windows操作系统提供了自动更新服务,该服务能够定期检查新的重要补丁更新。通过在控制面板中启用自动更新选项,就可以启用这个功能。这样,所有的安全补丁都会被自动下载。需要记住的是,在初始安装完成和安装完所有的必要补丁之间,操作系统处于最易受攻击的阶段。此时,流行的蠕虫等病毒能够迅速感染这个新系统。为此在安装时,不要将服务器直接连接到对外公开的或不受信任的网络上。

   (2)禁用服务和协议。在了解了服务器必须提供的服务后,可以终止其它的服务和协议。最难的是找出需要那些服务和可以安全终止的服务。对于单纯的Web服务器角色而言(只提供HTTP(s)服务,远程桌面功能只用于管理),可以中止的服务包括:Computer Browser、DHCP Client、Distributed File System、Distributed Link Tracking Client、、Distributed Transaction Coordinator、Error Reporting Service、Help and Support、Print Spooler、Remote Registry、Secondary Logon、Server、TCP/IP NetBIOS Helper、Wireless Configuration、Workstation、Application Management、File Replication、Portable Media Serial Number Service、Remote Access Auto Connection Manager、Remote Access Connection Manager、Remote Desktop Help Session Manager、Resultant Set of Policy Provider、Smart Card、Special Administration Console Helper、Telephony、Upload Manager、Windows Installer、WinHTTP Web Proxy Auto-Discovery Service、File and print sharing、NetBIOS over TCP/IP等。可以看到,默认情况下,操作系统启用了很多服务,而Web服务器不需要这些服务。停止这些服务,那么性能、自由内存和稳定性都可以得到提升,并且服务器更不容易受到攻击。这是考虑最小化服务器中软件和服务的规则的结果。 

(3)配置实现包过滤。通过关闭所有不需要的服务,可关闭大多数的开放端口。这可以极大减低服务器的受攻击面。可是,有一些端口不能被关闭,例如TCP/135,它是RPC,Windows操作系统非常依赖这个协议。另外,还有一些其它端口应只针对一部分网络。例如,远程管理和Terminal Services。通常,只允许从局域网、特定的子网或特定的IP地址上进行远程管理,但是不对互联网开放。在面对这种情况时,需要在Web服务器上本地安装一个信息包过滤器,这样能够额外增加一个深度安全防御实体。Windows操作系统有两个内建的信息包过滤器:Windows Firewall和Internet Protocol Security(IPSec)。Windows Firewall的优点是它提供了一个简单的接口来关闭端口,但是,它不限制对外的连接。IPSec可以控制内外通讯,但是设置比较复杂。

   (4)配置好Windows文件共享。很少有人知道Windows文件共享传输的数据完全没有保护措施。其默认情况下,数据是没有经过加密或完整性保护。管理人员可以开启内建的、签名机制来进行通信支持,这可以使恶意用户修改网络信息包更加困难,但是,如果使用Windows文件共享协议来传输敏感数据,那么应该进行额外地加密通信。管理人员可以在“本地安全策略”中开启签名。如果还要保密,建议使用IPSec来设置交换受保护数据的计算机的传输层安全。

   (5)启用审核功能。Windows操作系统内建有审核功能。它使操作系统能记录成功的或失败的登陆、策略修改和资源访问。启用审核分为两步。首先,必须启用系统级别的审核,然后,指定要审核的资源。管理人员使用安全配置向导能够自动地实现这两个步骤。另外,操作系统还允许管理人员手动修改配置,管理人员能够在本地安全策略窗口中实现人工配置。

    强化数据库服务器安全

    多数Web应用程序都涉及数据库,因此,强化数据库服务器的安全性也是非常重要的。除了应用以上有关的安全措施之外,另外还要考虑以下内容:

   (1)数据库通常由多个服务组成(例如,数据库引擎、全文搜索和消息),其中一些是需要的,另一些则不需要。例如,Microsoft SQL Server 2005包含的Attack Surface Wizard可用来选择应启用的服务。

   (2)大多数数据库都涉及架构概念,其为应用程序及其数据创建了独立的架构。应用程序帐户及其用户应只能访问这个应用程序的架构。这可以使访问管理更加容易,同时,还要禁止应用程序访问系统数据或其它架构中的数据。

   (3)如果有可能,不要将表访问直接授权给应用程序或用户。将应用程序的所有数据库功能打包到存储过程中,并将Execute权限授权给这些存储过程。之后,可以删除对基础表的访问。这可以极大地简化访问权限管理,并减少数据库的受攻击面。

   (4)如果有可能,限制对元数据的访问。例如,SQL注入式攻击依靠的就是应用程序允许查询元数据,例如数据库、表和列名等。

   (5)尽可能使用集成的身份审核方式。这样能够不在配置文件或代码中存储密码。

   (6)大多数的数据库以明码文本的形式传输数据。管理人员要检查数据库系统中所启用的传输安全配置方式。例如,SQL服务器支持Secure Sockets Layers(SSL)。如果数据库系统没有内建的传输安全服务,那么可以使用IPSec来管理数据库通信。

提高Web服务器安全

   提高Web服务器安全涉及内容很多,但这也没有什么可畏惧的。管理人员关键是要弄清楚哪些类型的活动内容是允许的,运行应用程序的安全环境和这些应用程序应该访问的资源等。具体而言,可从以下几个方面入手实现安全性的提高。

  (1)配置应用程序池。应用程序池代表IIS 6中的工作进程。每一个应用程序池都会获得一个w3wp.exe的实例,该实例承载了CLR、ASP.NET和应用程序。管理人员可以配置这个工作进程的许多方面,例如回收设置和状态监视,以便提高安全性。

   (2)配置适当的Web服务扩展。Web服务扩展是一个比较陌生的名字,但是它们的设置定义了服务器上允许的活动内容。简单而言,这是一个全局列表,其显示了允许调用的ISPAI扩展和CGI网关。管理人员应该只允许真正需要的服务器技术,例如ASP.NET。

   (3)删除服务器中不必要的Web内容。例如,示例应用程序,产品说明文件或不用的应用程序。其原因在于,服务器上的可执行代码越多,就越容易被利用进行攻击。特别是示例应用程序,长久以来它一直是一个易受攻击的方面。同样,将Web应用程序目录移动到非系统分区中。这样可以防止所有类型的目录遍历攻击。

   (4)删除在IIS中所有没有必要配置HTTP头。例如,通过ASP.NET删除X -Powered。管理人员可以在HTTP Headers下的Web站点属性对话框中的IIS MMC中找到这个设置。

   (5)为每个站点配置日志。默认情况下,Referer字段没有记录,如果要分析引用到站点的用户,必须手动启用这个措施。要注意,将日志放置到一个独立的分区中,并要定期备份它们。在记录日志的同时,要记得使用工具分析日志,例如使用LogParser。

   (6)检查传入的请求。这个工作可使用URLScan来完成。URLScan是一个ISAPI过滤器,其通过使用白名单或黑名单的方式定义规则,例如允许或拒绝的扩展、谓词、URL序列和标头。另外,还可以指定实体、查询字符串和标头的最大长度,还可以从HTTP响应中删除服务器头。

   (7)调整访问控制列表。管理人员必须调整三个不同目录中的ACL,这可以通过使用Aspnet_regiis工具来实现。但是,如果要进行真正的最少权限配置,仍然建议手动进行调整。需要调整的方面包括Web应用程序文件、临时程序集目录、Temp目录。

   (8)启用SSL。如果在应用程序中处理敏感的数据,应该始终启用并使用SSL。这有两个好处:首先,SSL可以鉴别服务器的身份,并在用户输入任何敏感数据(例如密码)前,保证会话对象是正确的服务器。其次,在服务器身份验证后,所有传输的数据都被加密并进行完整性保护。

   (9)设置适当的验证方式。管理人员要要非常清楚身份验证方式的设置。在IIS的诊断工具箱中,可以找到一个工具AuthDiag,它能检查身份验证的方式、ACL和进程权限。

    强化ASP.NET配置

   在实现以上所述的安全性方面的内容之后,接着要通过一些配置来提高ASP.NET方面的安全性。在这个方面,管理人员要注意锁死ASP.NET的配置,与安全相关的配置项和预编译等方面的相关内容。

   (1)锁死配置。ASP.NET的特点使用层次结构配置系统。在这个系统中,下层设置自动继承上层设置。因此,可以根据服务器、站点或应用程序来调整配置设置。相关的配置文件如Inetpub\wwwroot\web.config、应用程序根或者子目录中的Web.config文件,以及Windows\Microsoft .NET\Framework\ version\Config\web.config和machine.config等。管理人员需要了解这些文件中的相关配置项作用,并根据实际情况作出正确有效的调整。例如与安全相关的配置属性allowDefinition,requirePermission等。

  (2)注意与安全相关的配置项。在上一段所介绍的web.config文件中,包含很多与安全相关的配置项。限于篇幅,笔者仅将这些配置项列出。有关详细说明,读者可参考MSDN。这些与安全相关的配置项是<deployment>、<httpRuntime>、<compilation>、<pages>、<caching>、<trace>、<customErrors>、<forms>、<authorization>、<sessionState>、<httpCookies>、<trust>、<connectionStrings>、<membership>和<roleManager>。

   (3)进行预编译。默认情况下,ASP.NET应用程序采用命令编译。也就是说,在页面和控件不被使用时将被编译。隐含地,组成应用程序的所有代码必须在运行时应用ASP.NET,包括页面、代码隐藏和App_Code类。显然,这不适用于实际发布环境。如果在部署前预编译应用程序,那么就可以只部署二进制值和配置文件。建议开发人员使用Visual Studio的一个新附加程序Web Deployment Project,它可以提供一些使用有效的额外选项。可选择预编译方式很多,也是开发和管理人员需要认真考虑的问题。

    小结

   本文大部分内容相当于一个检查表,开发和管理人员可以在部署和配置过程中用其进行对照检查。当然,安全性不能通用化,通常要根据环境确定,但是相信本文的指导原则可以是一个好的基础。遵循这些原则并实施一定措施,可以消除很多严重的安全问题。




本文转自灵动生活博客园博客,原文链接http://www.cnblogs.com/ywqu/archive/2008/10/15/1311511.html:,如需转载请自行联系原作者

网友评论

登录后评论
0/500
评论