c#2005net30高级编程(第5版)第19章NET的安全性.pdf
《c#2005net30高级编程(第5版)第19章NET的安全性.pdf》由会员分享,可在线阅读,更多相关《c#2005net30高级编程(第5版)第19章NET的安全性.pdf(46页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、,NET的安全性当用户坐在计算机前,单击应用程序上的按钮时,应用程序会在后台作出响应,如果用户试图使用一个没有相关模块的特性,应用程序就会与Internet连接,把模块下载到全局程序集缓存中,并开始执行模块,所有的一切都没有给出提示。这种后台升级功能己经在许多.NET应用程序中使用了,但是,我们必须关注与所谓的“移动代码(mobile code)”相关的安全问题。也就是说,有什么证据能说明计算机下载的代码是可以信任的?怎样知道所下载的模块就是我们需要的模块?C L R 在后台做了什么工作,以确保W eb站点上的控件没有读取私人的电子邮件?.NET执行程序集的安全性策略。.NET根据它拥有的程序
2、集信息(例如程序集来自哪里,它们是由谁发布的),把具有相似特征的程序集组合在一起。例如,运行库把本地内联网上的所有代码放在一组。然后,使用安全性策略(通常由系统管理员使用代码访问安全策略工具caspol.exe命令行实用程序或Microsoft管理控制台来定义)在非常小的粒度级别上决定应该赋予代码什么权限。需要做什么工作才能确保机器或某个应用程序的安全?什么也不需要,因为所有的代码都自动运行在CLR的安全环境中,但可以在必要时禁用安全性。除了相信正在执行的代码是可信赖的之外,还要允许应用程序的用户访问他们需要的特性(但不要太多),这一点也是非常重要的。依靠基于角色的安全性,.NET可以对用户和
3、角色进行有效的管理。本章将讨论.NET中有助于管理安全的一些特性,其中包括.NET怎样避开有害的代码、怎样管理安全性策略,以及怎样编程访问安全子系统等。除此之外,还将讨论怎样安全地部署.NET应用程序,并且给出一些小的应用程序示例,以巩固本章介绍的概念。1 9.1 代码访问的安全性代码访问的安全性是.NET的一个特性,它根据代码的信任级别来管理代码。如果CLR非常信赖代码,允许它们运行,就会开始执行代码。但是,根据提供给程序集的权限,代码也许要在有限制的环境中运行。如果代码没有得到足够的信赖去运行,或者虽然代码运行了,但试图执行没有相关权限的操作,则会产生一个安全异常(其类型是Security
4、Exception或它的子类)。代码访问的安全性系统意味着可以停止有害代码的运行,也可以允许代码运第III部 分 基 类 库行在受保护的环境中,在受保护的环境中,我们相信代码不会进行破坏。例如,如果用户试图运行一个应用程序,执 行 从 Internet上下载的代码,则默认的安全性策略将生成一个异常,该应用程序会启动失败。同样,如果用户从网络驱动器上运行应用程序,则那个应用程序可以运行,但是如果那个应用程序试图访问本地驱动器上的文件,运行库就会产生一个异常,根据应用程序中处理错误的程序,应用程序会退出对文件的访问,或者退出执行。对于大多数应用程序而言,.NET代码访问的安全性都是非常有用的,但它
5、在后台起作用。代码访问的安全性提供了高水平的保护,以远离有害的代码,但是,通常我们涉及不到这个方面。而只考虑安全性策略的管理,尤其是在把桌面应用程序配置为信赖提供应用程序的软件厂商的代码时,就更要考虑安全性策略的管理。在开发应用程序时,对于其中包含的元素,如果要严密地控制它们的安全性,则可以使用代码访问的安全性。例如,如果公司的数据库中包含极其机密的数据,则可以使用代码访问的安全性,规定什么代码允许访问数据库,而什么代码不允许访问数据库.代码访问的安全性的主要目的是保护资源(例如本地磁盘、网络和用户接口等)免受有害代码的破坏,而不是使软件免受用户的破坏。对于与用户相关的安全问题,通常可以使用
6、Windows内置的用户安全子系统,或者利用.NET中基于角色的安全性,这些内容将在本章的后面讨论。代码访问的安全性以两个高层次的概念为基础,即代码组(Code Group)和权限(Permission)下面讨论这两个概念,因为它们构成了后面章节的基础:代码组:代码组用于把具有相似特征的代码集合到一组。通常,集合时所依据的最重要特征就是代码来自哪里。例如,代码组包括“Internet”(代码来自Internet)和“Intranet”(代码来自LAN)。把程序集放到代码组中所使用的信息称为“证据”。CLR收集的其他证据包括代码的发布者、代码的强名以及下载代码的URI等。代码组的排列是层次状的,
7、程序集总是与儿个代码组相匹配。层次根部的代码组称为“AUCode”,包含其他所有的代码组。层次用于确定程序集属于哪一个代码组,如果程序集提供的证据与树中的代码组不匹配,则程序集不属于树的任何一个代码组。权限:权限是允许每一个代码组执行的动作。例如,权限包括“可以访问用户界面”和“可以访问本地存储器”等。系统管理员通常在Enterprise级、Machine级 和 User级上管理权限。CLR 中的 Virtual Execution System 用)于载入和运行程序。Virtual Execution System 提供了执行托管代码所需要的功能,并使用程序集元数据把模块在运行期间连接在一起
8、。当VES载入程序集时,VES通常把程序集与一个或多个代码组相匹配。每一个代码组都被赋予了一个或多个权限,指定各个代码组中的程序集可以执行什么动作。例如,如果MyComputer代码组被赋予FilelOPermission权限,则意味着来臼本地机器的程序集可以读写本地文件系统。19.1.1 代码组代码组有一个称之为成员条件的入口需求(entry requirement)如果要把程序集划归某542个代码组,该程序集就必须符合那个代码组的成员条件。例如,成员条件可以是“程序集来自http:站点”或“这个软件的发布者是Microsoft公司”等。每一个代码组都有一个并且只有一个成员条件。在.NET中
9、,代码组可以使用的成员条件如下:Zone:代码来自的区域 Site:代码来自的Web站点 Strong name:代码唯,的、可验证的名称。强名详见第16章。Publisher:代码发布者 URL:代码来自的具体位置 Hash value:程序集的散列值 Skip verification:请求Skip verification的代码避开代码验证检查。代码的验证可以确保代码以定义合理和可接受的方式访问类型。运行库不能确保类型不安全的代码是安全的。Application directory:程序集在应用程序中的位置 All code:符合条件的所有代码 Custom:与用户相关的条件上述成员条件
10、的第一个类型就是Z o n e,这个类型是最常用的。Zone是一段代码区域的开端,表示下面的内容:MyComputer、Internet、Intranet、Trusted 或 Untrusted。使用 InternetExplorer中的安全选项可以对这些区域进行管理,后面在讨论怎样管理安全性策略时,再讨论这些内容。虽然设置是在Internet Explorer中管理的,但是它们将应用于整个机器。很明显,那些配置选项在非Microsoft浏览器中是不能使用的,实际上,使用.NET Framework编写的页面控件只能在Internet Explorer上工作。代码组的安排是层次状的,根部是AH
11、 Code成员条件,如 图 19-1所示。从这个图中可以看出,每一个代码组都有一个成员条件,并且指定赋予代码组的权限。注意,如果程序集不符合代码组中的成员条件,则 CLR不会给它匹配那个代码组下面的代码组。图 19-1第III部 分 基 类 库1.Caspol.exe代码访问安全性策略工具本章将花大量的篇幅介绍命令行工具:代码访问安全性策略工具。要得到它的选项列表,只需输入下面的命令:caspol.exe?使用下面的命令把输出发送给个文本文件:caspol.exe output.txt.NET也包括,个Microsoft Management Console管理单元,它用于管理代码访问的安全性
12、。但是,这里只使用命令行实用程序caspol.exe,以易于理解本章的示例,还可以创建脚本,更改安全性策略,在把策略应用到大量的机器上时,这是非常有用的。使用caspol.exe,可以查看机器上的代码组。caspol.exe的执行结果是列出机器上代码组的层次结构,并描述每一个代码组。键入如下命令:caspol.exe-listdescription另外,-listdescription选项还有一个缩写方式:-Id。下面是该命令的结果:Microsoft(R).NET Framework CasPol 2.0.50215.44Copyright(C)Microsoft Corporation.A
13、ll rights reserved.Security is ONExecution checking is ONPolicy change prompt is ONLevel=MachineFull Trust Assemblies:1.All_Code:Code group grants no permissions and forms the root of the codegroup tree.1.1.My_Computer_Zone:Code group grants full trust to all code originatingon the local computer1.1
14、.1.Microsoft_Strong_Name:Code group grants full trust to code signedwith the Microsoft strong name.1.1.2.ECMA_Strong_Name:Code group grants full trust to code signed withthe ECMA strong name.1.2.LocalIntranet_Zone:Code group grants the intranet permission set tocode from the intranet zone.This permi
15、ssion set grants intranet codethe right to use isolated storage,full UI access,some capability to doreflection,and limited access to environment variables.1.2.1.Intranet_Same_Site_Access:All intranet code gets the right toconnect back to the site of its origin.1.2.2.Intranet_Same_Directory_Access:Al
16、l intranet code gets the right toread from its install directory.1.3.Internet_Zone:Code group grants code from the Internet zone theInternet permission set.This permission set grants Internet code the right544to use isolated storage and limited UI access.1.3.1.Internet_Same_Site_Access:All Internet
17、code gets the right toconnect back to the site of its origin.1.4.Restricted_Zone:Code coming from a restricted zone does not receive anypermissions.1.5.Trusted_Zone:Code from a trusted zone is granted the Internetpermission set.This permission set grants the right to use isolatedstorage and limited
18、UI access.1.5.1.Trusted_Same_Site_Access:All Trusted Code gets the right toconnect back,to the site of its origin.Success.NET安全子系统确保每一个代码组中的代码只能做某些事情。例如,Internet区域中的代码在默认状态下比本地驱动器中的代码有更严格的限制;本地驱动器中的代码通常有访问本地磁盘上数据的权限,但是Internet中的程序集在默认状态下就没有这个权限。使用caspol.exe和它在Microsoft Management Console中的等价选项,可以为每一
19、个代码访问组指定信任级别,还可以按照更小的粒度方式管理代码组和权限。再看看代码访问组,但是,这次的信息比上次要少一些。确保以本地管理员身份登录后,打开命令提示窗口,输入下面的命令:caspol.exe-listgroups得到如下信息:Microsoft(R).NET Framework CasPol 2.0.50215.44Copyright(C)Microsoft Corporation.All rights reserved.Security is ONExecution checking is ONPolicy change prompt is ONLevel=MachineCode
20、Groups:1.All code:Nothing1.1.Zone-MyComputer:FullTrust1.1.1.StrongName-002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766c834c99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4
21、C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293:FullTrust1.1.2.StrongName-00000000000000000400000000000000:FullTrust1.2.Zone-Intranet:LocalIntranet1.2.1.All code:Same site Web.1.2.2.All code:Same directory FilelO-Read,PathDiscovery,1.3.Zone-Internet:Intern
22、et1.3.1.All code:Same site Web.第III部 分 基 类 库1.4.Zone-Untrusted:Nothing1.5.Zone-Trusted:Internet1.5.1.All code:Same site Web.Success在输出结果的开头,是 Security is ON。在本章后面的内容中,我们将会看到Security可以先关闭,然后再打开。在默认状态下,Execution Checking设置的值是o n,这意味着所有的程序集在运行之前,必须给它们赋予执行权限。如果使用caspol(caspol.exe-execution onloff)关闭执行检查
23、,则程序集没有执行权限也可以运行。在这种情况下,如果程序集在运行过程中有违背安全性策略的行为,就会产生安全异常。Policy change prompt选项指定在更改安全性策略时,是否可以看到Are you sure警告信息。把代码划分为这些组之后,就可以更精细地管理安全性,还可以实现对更少代码的完全信任。注意,每一个组都有一个标记(例如“1.2”),这些标记是.NET自动生成的,在不同的机器上是不同的。通常不是按照每一个程序集来管理安全性,而是使用代码组来管理。如果一台机器上同时安装了几个.NET版本,则 caspol.exe只更改与它相关的.NET安装版本的安全性策略。(1)查看程序集的代
24、码组如果程序集符合代码组的成员条件,它们就属于代码组。回到代码组的示例中,从Web站点http:/intranet/载入程序集,则它匹配的代码组如图19-2所示。这个程序集也是根代码组(All Code)的成员。如果程序集来自本地的网络,则它还是Intranet代码组的成员;但是,当从某一指定站点(如http:/intranet)载入程序集时;它也被赋予FullTrust权限,这意味着程序集的运行没有限制条件。图 19-2使用如下命令,很容易查看程序集所属的代码组:caspol.exe-resolvegroup assembly.dll546对本地磁盘上的程序集运行这个命令,可以得到如下结果:
25、Microsoft(R).NET Framework CasPol 2.0.50727.7Copyright(C)Microsoft Corporation.All rights reserved.Level=EnterpriseCode Groups:1.All code:FullTrustLevel=MachineCode Groups:1.All code:Nothing1.1.Zone-MyComputer:FullTrustLevel=UserCode Groups:1.All code:FullTrustSuccess注意,代码组是在3 个级别上列出的,这 3 个级别是Enterp
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c# 2005 net30 高级 编程 19 NET 安全性
限制150内