《Microsoft .NET 框架中的安全机制》由会员分享,可在线阅读,更多相关《Microsoft .NET 框架中的安全机制(13页珍藏版)》请在金锄头文库上搜索。
1、Microsoft .NET 框架中的安全机制 由 Foundstone 和 CORE Security Technologies 两家公司提供的分析报告 本文对 Microsoft 的 .NET 框架的安全体系结构作了一个概述。本文以 Foundstone 和 CORE Security Technologies 这两家公司自 2000 年夏季开始进行的一次长期、独立的安全分析为基础。 我们的分析报告显示,如使用得当,.NET 框架使开发人员和管理员能够对其应用程序和资源进行细微的安全控制;给开发人员提供一套易用的工具集来实现功能强大的身份验证、授权和加密等例程;消除了如今由于代码缺陷(如缓
2、冲区溢出)而使应用程序面临的许多重大安全风险;而且把作重要安全决定 如,是否要运行某个特定的应用程序,或者应让此应用程序能够访问哪些资源 的这一负担从最终用户身上转移到开发人员和管理员身上。 在本文中我们还将介绍 .NET 框架中的基于证据和基于角色的安全功能、代码访问安全性、验证过程、加密支持、独立存储和应用程序域,说明它们是怎样通过互相协作实现了这些目标,并为开发和运行各种类型的软件应用程序(包括客户端和服务器端)提供一个可靠平台的。我们的结论是,.NET 框架能让各类单位都更有信心保证他们的应用程序能够抵御现在已知以及将来要发生的各种安全攻击。 引言 在 .NET 框架的开发初期,Fou
3、ndstone 和 CORE Security Technologies 就协助 Microsoft Corp. 对其体系结构和实现的安全性进行分析和评估。 对 .NET 框架的分析工作始于 2000 年夏,自该软件第一个 Beta 版出现之前开始,一直持续到 Beta 2 版。我们共投入了 2800 多小时的时间,由一个十人专家小组进行严格、独立的安全审核和测试,其间我们可以完全不受限制地访问源代码和接触 Microsoft 的工程师,所以完全熟悉了 .NET 框架的安全体系结构,包括从设计原则到代码级别实现的各个细节。 审核工作遵循由 Foundstone 和 CORE Security
4、Technologies 在多年实践中形成的标准方法,多年来他们一直都在为各种单位 - 从财富 500 强企业到新兴的公司 - 提供复杂软件应用程序的测试、评估和安全增强服务。站在安全解决方案提供商的角度,我们要说我们见到过“好的、坏的和极差的”,而 .NET 框架,在一年来我们剖析其内部工作机制的过程中,经受了我们的集体智慧的考验。 本文着重探讨 .NET 框架的广泛的安全功能。它主要基于我们去年的评估结果以及我们与“.NET 框架”开发小组不断的交流。这里所表达的想法和观点完全是我们在对多个软件版本进行严谨分析和严格测试后得到的独立的观察报告。希望本文能促进人们对 .NET 框架的安全机制
5、的理解,并表达出我们对该体系结构及其实现的信心。 范围及目标 在本文中,我们将回顾许多企业在设计和开发软件解决方案的过程中所面临的许多常见的安全挑战,并概括了 .NET 框架如何通过它的安全体系结构为这些问题提供了合理的解决办法。 我们一直都在尝试使 .NET 框架复杂的安全机制能让那些至少有中等技术背景的读者理解。这里我们假定读者对 .NET 框架有一些基本的了解,因此我们不会花过多的时间讲述有关所涉及到的基本技术的背景知识。在本文档的最后,我们为那些想更深入了解 .NET 框架技术内容的读者提供了许多供进一步阅读的参考资源。 背景:应用程序安全性问题 几乎没有任何人会怀疑许多软件应用程序所
6、起到的至关重要的作用了,特别是那些使用基于 Internet 技术构建的应用程序。它们已从简单、静态的数据操作渠道发展为复杂、动态的面向事务的应用程序,并成了企业商务的支柱。 然而,由于现代软件应用程序越来越复杂以及功能越来越多,也随之产生了一股不幸的、令人担忧的逆流:越来越多的单位都已成为内部和外部入侵者对其软件发起的攻击的牺牲品。 解决办法:一个用来管理软件风险的体系结构 .NET 框架的托管代码体系结构为软件应用程序安全问题提供了一个令人信服的解决方案。甚至在最恶劣的环境中它仍能透明地控制代码的行为,这样就极大地减少了各种应用程序(包括客户端和服务器端)中固有的风险。事实上,如使用得当,
7、我们相信它是开发有严格安全要求的企业级和 Web 应用程序的最佳平台之一。 在一个较高的级别,.NET 框架使开发人员和管理员能够对其应用程序和资源进行细微的安全控制;给开发人员提供一套易用的工具集来实现强大的身份验证、授权和加密等例程;消除了如今由于代码缺陷(如缓冲区溢出)而使应用程序要面临的许多重大安全风险;而且把作重要安全决定 如,是否要运行某个特定的应用程序,或者应让此应用程序能够访问哪些资源 的这一负担从最终用户身上转移到开发人员和管理员身上。 托管代码模式在我们详细讨论“.NET 框架”如何实现这一目标之前,首先来回顾一下该“框架”本身的基本组件,其组件包括: 公共语言运行库 类库
8、 程序集 公共语言运行库 公共语言运行库 (CLR) 是一个运行并“管理”正在执行的代码的引擎。所以,从安全角度来看,CLR 将 .NET 框架的限制施加到正在执行的代码上并防止它表现出意外的行为。 更具体地说,CLR 在运行托管代码时执行“实时 ”(JIT) 编译。JIT 在执行托管代码之前先将它转换为本机代码。由于 JIT 在 CLR 内部生成代码,所以让 CLR 处于一个独特的位置以保证代码的安全,亦即,如果代码在本机环境中未经处理,则不允许执行这种代码完成某些操作。 类库“.NET 框架”类库是可重用的类或类型的集合,开发人员可以利用它们编写将在公共运行库中执行的程序。它们实现了许多重
9、要的安全功能,包括权限(即对一个或多个系统资源的访问权限)、身份验证机制以及加密协议和基元。大多数的应用程序只须使用这些库就能从这一安全机制中受益,而无须编写特别的安全代码。我们将在本文稍后更详细地讨论这些功能。 程序集程序集是指使用“.NET 框架”的众多语言编译器中的某一编译器编译出的可执行文件或 DLL 文件。.NET 框架程序集几乎可以使用任何一种主流编程语言来编写,包括 Visual Basic、C#、C+、J#、Perl 和 COBOL 等,这里仅列举几个而已。因此,开发人员可以选择最适合他们的任务和自己的技能的语言来编程,而且无论他们选择哪种语言,都会有同样的安全基础结构在支持他
10、们。 程序集中包含了运行库以“Microsoft 中间语言”(MSIL) 的形式执行的代码。前面我们讲到过 CLR 可将 MSIL 实时编译 (JIT) 为本机代码,这就为将安全机制应用到执行代码提供了一个特有的有利位置。程序集中还包含元数据,CLR 使用元数据来找到类并进行加载、将实例布局到内存中、解析方法调用、生成本机代码、实施安全机制以及设置运行时上下文边界。 CLR 和类库通过程序集来实现 .NET 框架的托管代码体系结构。本文接下来的部分将更详细地讨论此托管代码体系结构。 .NET 框架安全机制详述 .NET 框架的安全体系结构由若干核心元素组成,包括: 基于证据的安全机制 代码访问
11、安全性 验证过程 基于角色的安全性 加密技术 应用程序域 下面详细讨论每个元素。 基于证据的安全机制“.NET 框架”基于证据的安全子系统中的关键元素包括策略、权限和证据。 策略任何具有信息系统安全方面经验的人都会告诉您安全是不可能凭空实现的 它必须由策略来实施。因此“.NET 框架”的所有安全机制最终都依赖于仔细定义的、用 XML 记录的策略。本质上, .NET 框架的策略定义了执行中的程序集中的代码可以访问哪些资源,从而防止软件错误地或恶意地破坏数据的完整性。.NET 框架中的策略无处不在,而且有充分的保护,使非管理员用户无法访问到它。对于每一台计算机和每一个用户帐户,它都是自动安装的。也
12、可以选择通过“组策略”在 Windows 域中部署它。 .NET 框架中的安全策略的基本功能是,使权限与证据匹配(我们马上就会讨论这两个问题)。“.NET 框架”原带的默认安全策略是由 Microsoft 设计的,其目的是为一般的最终用户创建一个安全的执行环境。有足够特权的管理帐户也可以对它进行自定义以满足特别需要。 权限权限是策略的根本。权限描述了一个或多个资源及与之关联的权利,并实现用于请求访问和声明访问的方法。.NET 框架包括针对下列对象的权限:DataAccess、DNS、DirectoryServices、FileIO、EventLog、Environment、FileDialog
13、、Registry、Reflection、Socket、Web、 IsolatedStorage、UI、Printing、MessageQueue 和 Security(它的成员包括 AllFlags、Assertion 、ControlAppDomain、ControlDomainPolicy、ControlEvidence、ControlPolicy、ControlPrincipal、ControlThread 、Execution、Infrastructure、NoFlags 、RemotingConfiguration、SkipVerification 和 UnmanagedCode)
14、。开发人员可以扩展这些权限定义,以包括应用程序定义的资源和用于验证访问权利的方法。这与其他的托管代码体系结构(如 Java 2)是不同的,后者不容易实现这样的细微的自定义。 开发人员有一定的权利可以通过在程序集中嵌入权限请求来控制他们的代码如何对策略授予的权限作出反应。有三种类型的权限请求:最小、可选和拒绝。如果策略未将列于“最小”权限集中的所有权限都授予一个程序集,则该程序集将无法加载,也就不能运行。开发人员可以使用“拒绝”请求明确地拒绝对某些资源的访问,如果不是这样应用程序是能够访问这些资源的,但它并不是需要这些资源才能运行。这意味着开发人员可以使他们的应用程序权限集甚至超过管理员定义的策
15、略所允许的范围。就从代码可以拒绝某些权限来看,它不会卷入因这些权限而引发的安全问题。与目前业界常用的托管代码体系结构(如 Java 2)相比,这是一个非常精细化的能力,而且它允许将代码设计为使用最小特权来运行。 独立存储在基于证据的安全机制所涉及的所有权限之中,“独立存储”权限值得特别提一下。这一权限对建立在基础文件系统之上的特殊文件存储机制提供支持,但又能确保不同应用程序的储存库彼此隔离并且不暴露具体的文件系统特征(如路径名、可用的驱动器等)。如果使用独立存储,则仍允许未被授予 FileIO 权限的不完全受信任的程序集在本地存储应用程序特定的数据。但是,由于对这些存储区域的严格隔离和访问限制
16、,这些程序集这样做时不会有危害本地文件系统或机器本身的风险。这一点在运行不完全受信任的代码(如 Internet 应用程序)而同时又允许本地存储强大功能时特别有用。 证据在运行时,CLR 通过评估某一程序集的证据来决定将哪些权限授予该程序集。证据可以来自驻留在程序集内部的各种资源,或是从本地的执行环境中收集到。证据的来源可包括如下几种: 以加密方式密封的命名空间(强名称) 软件发行商身份 (Authenticode) 代码来源(URL、站点、Internet Explorer 区域) 让策略、权限和证据共同起作用到目前为止,我们已分别介绍了 .NET 框架中基于证据的安全模型中的每个主要组件。不过必须说明一点,那就是这些组件必须很好地协作才能提供一个与当前我们启动可执行文件时常看到的执行环境完全不同的另一种执行环境。有了 .NET 框架,几乎不需要用户在运行时做任何安全决策。 .NET 框架在透明地确保最终用户运行的代码必须提前实施应用程序安全设计原则,这