主要威胁:
Ø 账户劫持:这种威胁包括接管合法用户的账户,有时甚至会拒绝合法用户访问自己的账户。
Ø 中间人攻击(man-in-the-middle):以某种方式截取Web通信,使攻击者能够读取并修改两个系统之间传送的数据。
Ø phishing:一种中间人攻击的类型,其中攻击者引诱合法的用户输入密码,其方法是通过一封伪造的电子邮件或Web表单,该表单看卢来类似于合法Web站点中的表单。
Ø 未授权访问:在没有内容拥有者同意的情况下获得对受限制内容和数据的访问权限。
Ø 信息泄漏:暴露相关信息或无法保护信息,攻击者可利用这些信息来危及系统的安全。
Ø 特权扩大(privilege escalation):允许攻击者获得对高级账户的访问特权。
Ø 嗅探(sniffing):使用网络监控实用程序来截取网络上传输的密码或其他敏感信息。
2.2 验证用户
2.2.1 构建登录表单
小结:登录表单应该保护用户证书并抵抗攻击
威胁:账户劫持、信息泄漏、SQL注入(SQL injection)、跨站点脚本(cross-site scription)
安全策略:
Ø 总是通过SSL连接传送登录标准
Ø 使用HTTP POST方法来发送表单数据
Ø 总是验证表单输入
Ø 不要依赖隐藏的表单字段来传送数据,因为它们可被客户修改,也可能暴露敏感信息
Ø 不要在登录失败的错误消息中显示过多信息
2.2.2 使用表单验证
小结:不安全的验证表单设置可削弱Web应用程序的安全性
威胁:账户劫持、信息泄漏
提示:
在web.config中存储用户密码应一开始即使用MD5或SHA-1加密,但也可以通过字典或暴力攻击破解,工具:www.oxid.it/cain.html中的Cain & Abel
映射非ASP.NET资源 大多数ASP.NET安全特性只保护ASP.NET资源,因此必须采取额外的措施来保护非ASP.NET文件。为了做到这一点,必须使用IIS5或IIS6将这些资源映射到ASP.NET ISAPI过滤器。 例如:使用IIS 5: 1、 在Internet Services Manager中,为需要配置的应用程序选择相关的属性。 2、 在“Home Directory”选项卡中,单击“Configuration”按钮。 3、 在“App Mappings”选项卡中,单击“Add”按钮。 4、 单击“Browse”按钮,并且定位到.NET ISAPI过滤器(一般位于C:\Winnt\Microsoft.NET\Framework\<version>\aspnet_isapi.dll)。 5、 输入希望映射到ASP.NET的扩展名(或者输入“.*”映射所有的扩展名)。 注意:添加通配符应用程序映射将使得ASP.NET处理所有的文件扩展名。对于大多数静态内容,能正常工作;但是,对于映射到其他应用程序(例如Perl或Cold Fusioin)的扩展名,则不能正常工作。通配符映射可能对服务器性能有一定影响,这取决于Web目录中内容的类型。ASP.NET有一个针对静态内容的特殊处理程序,但可以针对特殊Web站点运行性能测试。 |
安全策略:
Ø 绝对不要在产品系统或部署上使用passwordFormat=”Clear”
Ø 理解在web.config文件中存储明文证书的风险
Ø 使用表单验证时,采取额外的措施保护不是由ASP.NET处理的文件
Ø 仔细地计划授权cookie的设置,以限制对劫持的暴露
2.2.3 使用Windows验证
小结:Windows验证可以是安全的,但只有在经过适当配置的情况下才是如此
威胁:账户劫持、中间人、信息泄漏
提示:
ASP.NET提供了对本地IIS验证方法的支持, 称为Windows验证。IIS提供4种标准验证方法:
n 基本验证
n 摘要验证
n 集成Windows验证
n 客户端证书映射
阻塞没有使用SSL的基本验证: using System; using System.Web using System.Security.Principal; namespace HttpAuthModules { public class AuthenticationModule : IhttpModule { public AuthenticationModule() { } public void Init(HttpApplication httpApp) { // Register the event handler with Application object. httpApp.AuthenticateRequest += new EventHandler(this.AuthenticateRequest); } private void AuthenticateRequest(object obj, EventArgs ea) { HttpApplication objApp = (HttpApplication) obj; HttpContxt objContext = (HttpContext) objApp.Context; //Deny access if user is using basic authentication without SSL if (ojbApp.User.Identity.AuthenticationType == “Basic” && objContext.Request.IsSecureConnection == false) { objContext.Response.StatusCode = 403; objApp.Response.End(); } } public void Dispose() { } } |
安全策略:
Ø 总是将SSL用于使用基本验证的每个页面
Ø 为受保护和未受保护的内容分别使用独特的领域
Ø 尽可能在内联网环境中使用集成Windows验证
Ø 防止验证特权用户,以阻塞对他们的暴力攻击
2.2.4 使用Passport验证
小结:Passport验证有许多功能强大之处,但必须意识到它所带来的风险
威胁:账户劫持
安全策略:
Ø 避免在存储敏感财务和个人信息的Web站点上使用Passport
Ø 如果在敏感站点上使用Passport,可以考虑实现额外的方法来验证用户
2.2.5 阻塞暴力攻击
小结:暴力攻击难以完全阻塞,但可以限制它们的有效性
威胁:账户劫持、拒绝服务、资源匮乏(resource starvation)
工具:Combomania(专门针对成人Web站点发动暴力攻击)
下载地址:www.securibox.net/phpBB2/dload.php?action=viewall
密码验证延时: private void AuthenticateRequest(object obj, EventArgs ea) { httpApplication objApp = (HttpApplication) obj; httpContext objContext = (HttpContext) objApp.Context; // If user identity is not blank, pause for a random amount of time if (objApp.User.Identity.Name != “”) { Random rand = new Random(); Thread.Sleep(rand.Next(minSeconds, maxSeconds) * 1000); } } |
表明暴力攻击或账户滥用的条件:
Ø 来自于相同IP地址的多次失败登录
Ø 来自于相同IP地址的,使用多个用户名的登录
Ø 来自于多个不同IP地址的相同账户的登录
Ø 一次使用中,过多地占用和消耗带宽
Ø 失败登录尝试按字母顺序使用连续的用户名和密码
Ø 使用某人邮件或IRC客户的引用URL进行登录
Ø 通过http://user:password@www.example.com/login.htm格式,引用包含用户名和密码的URL
Ø 如要保护成人Web站点,而引用已知密码共享站点的URL
Ø 以电脑黑客常用的可疑密码进行登录,例如ownsyou(ownzyou)、washere(waxhere)、zealots、hacksyou及类似的密码(请查看www.securibox.net/phpBB2/viewtopic.php?t=8563)
安全策略:
Ø 只在受控环境中使用账户锁定策略,或者在危及账户安全的风险大于连续DoS攻击的风险时使用账户锁定策略
Ø 在验证过程中插入随机延时,减缓暴力攻击
Ø 考虑阻塞多次登录失败的IP地址,但要同时考虑阻塞多个客户端使用的代理时所带来的影响
Ø 改变对失败或成功的密码验证的响应
Ø 看到多个失败的登录后,请求用户回答秘密问题。
Ø 提供给用户相关的选项,限制特定的IP地址才可以进行账户登录
Ø 针对不同范围内的用户使用独特的登录URL
Ø 使用CAPTACHA防止自动攻击
Ø 如果攻击可疑,则限制账户的功能
2.3 授权用户
2.3.1 决定如何授权
小结:深入的授权策略是可靠应用程序安全的基础
威胁:未授权的访问、特权扩大
验证方法 | 主体对象 | 身份对象 | 证 书 | 角 色 |
Forms | GenericPrincipal | FormsIdentity | 存储在web.config或自定义的验证代码中 | 使用自定义的代码建立 |
Windows | GenericPrincipal | WindowsIdentity | 由底层的操作系统或域提供 | Windows或活动目录组 |
Passport | GenericPrincipal | PassportIdentity | .NET Passport | 基于自定义Passport用户组而建立 |
ASP.NET中,有一些基于角色授权的方法:
Ø URL授权
Ø 基于用户的声明性安全性
Ø 基于用户的强制性安全性
Ø 显式角色检查
安全策略:
Ø 在应用程序设计的前期就实现强授权的基础
Ø 开发一个基于角色的稳固授权方案
Ø 使用基于资源的授权来增强基于角色的授权
Ø 总是使用多基于角色的授权和基于资源的授权
2.3.2 使用文件授权
小结:文件授权提供一个分层的、细致的安全方法
威胁:未授权访问、特权扩大
安全策略:
Ø 总是在Web内容文件上设置受限制的NTFS权限,即使没有使用Windows验证和文件授权
Ø 使用文件授权来实现基于资源的安全性和基于角色的安全性
Ø 应用特定的和详细的NTFS权限来增强应用程序的安全性
Ø 应该只允许用户对Web内容进行读访问
2.3.3 应用URL授权
URL授权是一种用来控制基于用户 、角色、资源或所用HTTP谓词访问的机制。URL授权基于与请求相关的主体,因此它可以对任何形式的验证起作用。它也允许对未验证的用户设置限制。
安全策略:
Ø 使用URL授权来限制访问Web站点资源
Ø 使用verb属性或HttpMethodNotAllowedHandler来阻塞未使用的HTTP谓词
Ø 使用HttpForbiddenHandler或HttpNotFoundHandler来阻塞每个用户对特定文件的访问
2.3.4 通过代码授权用户
可以通过3种方法实现:
Ø 声明性授权
Ø 强制性授权
Ø 显式授权
安全策略:
Ø 使用声明性、强制性和显式角色检查来提供多层授权
Ø 如果利用.NET框架,应该实现健壮的声明性授权技术