《c#2005net3.0高级编程(第5版)第19章, NET的安全性.docx》由会员分享,可在线阅读,更多相关《c#2005net3.0高级编程(第5版)第19章, NET的安全性.docx(47页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第1 章. NET的安全性当用户坐在计算机前,单击应用程序上的按钮时,应用程序会在后台作出响应,如果 用户试图使用一个没有相关模块的特性,应用程序就会与Internet连接,把模块下载到全 局程序集缓存中,并开始执行模块,所有的一切都没有给出提示。这种后台升级功能已经在许多.NET应用程序中使用了,但是,我们必须关注与所谓的 “移动代码(mobile code)”相关的安全问题。也就是说,有什么证据能说明计算机下载的 代码是可以信任的?怎样知道所下载的模块就是我们需要的模块? CLR在后台做了什么 工作,以确保Web站点上的控件没有读取私人的电子邮件?.NET执行程序集的安全性策略。.NET根
2、据它拥有的程序集信息(例如程序集来自哪里, 它们是由谁发布的),把具有相似特征的程序集组合在起。例如,运行库把本地内联网上 的所有代码放在组。然后,使用安全性策略(通常由系统管理员使用代码访问安全策略 具caspol.exe命令行实用程序或Microsoft管理控制台来定义)在非常小的粒度级别上决定应 该赋予代码什么权限。需要做什么工作才能确保机器或某个应用程序的安全?什么也不需 要,因为所有的代码都自动运行在CLR的安全环境中,但可以在必要时禁用安全性。除了相信正在执行的代码是可信赖的之外,还要允许应用程序的用户访问他们需要的 特性(但不要太多),这一点也是非常重要的。依靠基于角色的安全性,
3、.NET可以对用户和 角色进行有效的管理。本章将讨论.NET中有助于管理安全的些特性,其中包括.NET怎样避开有害的代码、 怎样管理安全性策略,以及怎样编程访问安全子系统等。除此之外,还将讨论怎样安全地 部署.NET应用程序,并且给出些小的应用程序示例,以巩固本章介绍的概念。19.1 代码访问的安全性代码访问的安全性是.NET的个特性,它根据代码的信任级别来管理代码。如果CLR 非常信赖代码,允许它们运行,就会开始执行代码。但是,根据提供给程序集的权限,代 码也许要在有限制的环境中运行。如果代码没有得到足够的信赖去运行,或者虽然代码运 行了,但试图执行没有相关权限的操作,则会产生一个安全异常(
4、其类型是SecurityException 或它的子类)。代码访问的安全性系统意味着可以停止有害代码的运行,也可以允许代码运行在受保护的环境中,在受保护的环境中,我们相信代码不会进行破坏。例如,如果用户试图运行个应用程序,执行从!nternet上下载的代码,则默认的安 全性策略将生成一个异常,该应用程序会启动失败。同样,如果用户从网络驱动器上运行 应用程序,则那个应用程序可以运行,但是如果那个应用程序试图访问本地驱动器上的文 件,运行库就会产生一个异常,根据应用程序中处理错误的程序,应用程序会退出对文 件的访问,或者退出执行。対于大多数应用程序而言,.NET代码访问的安全性都是非常有用的,但它
5、在后台起作 用。代码访问的安全性提供了高水平的保护,以远离有害的代码,但是,通常我们涉及不 到这个方面。而只考虑安全性策略的管理,尤其是在把桌面应用程序配置为信赖提供应用 程序的软件厂商的代码时,就更要考虑安全性策略的管理。在开发应用程序时,对于其中包含的元素,如果要严密地控制它们的安全性,则可以 使用代码访问的安全性。例如,如果公司的数据库中包含极其机密的数据,则可以使用代 码访问的安全性,规定什么代码允许访问数据库,而什么代码不允许访问数据库。代码访问的安全性的主要目的是保护资源(例如本地磁盘、网络和用户接口等)免受有 害代码的破坏,而不是使软件免受用户的破坏。対于与用户相关的安全问题,通
6、常可以使 用Windows内置的用户安全子系统,或者利用.NET中基于角色的安全性,这些内容将在 本章的后面讨论。代码访问的安全性以两个高层次的概念为基础,即代码组(Code Group)和权限 (Permission)。下面讨论这两个概念,因为它们构成了后面章节的基础:代码组:代码组用于把具有相似特征的代码集合到组。通常,集合时所依据的 最重要特征就是代码来自哪里。例如,代码组包括“ Interne(代码来自Internet) 和“ Intrane(代码来自LAN)。把程序集放到代码组中所使用的信息称为“证据”。 CLR收集的其他证据包括代码的发布者、代码的强名以及下载代码的URI等。代 码
7、组的排列是层次状的,程序集总是与几个代码组相匹配。层次根部的代码组称为 “All Code”,包含其他所有的代码组。层次用于确定程序集属于哪个代码组,如 果程序集提供的证据与树中的代码组不匹配,则程序集不属于树的任何个代码组。权限:权限是允许每个代码组执行的动作。例如,权限包括“可以访问用户界 面”和“可以访问本地存储器”等。系统管理员通常在Enterprise级、Machine 级和User级上管理权限。CLR 中的 Virtual Execution System 用于载入和运行程序。Virtual Execution System 提 供了执行托管代码所需要的功能,并使用程序集元数据把模
8、块在运行期间连接在起。当 VES载入程序集时,VES通常把程序集与一个或多个代码组相匹配。每个代码组都被赋 予了一个或多个权限,指定各个代码组中的程序集可以执行什么动作。例如,如果 MyComputer代码组被赋予FilelOPermission权限,则意味着来自本地机器的程序集可以读 写本地文件系统。19.1.1 代码组代码组有一个称之为成员条件的入口需求(entry requirement)如果要把程序集划归某个代码组,该程序集就必须符合那个代码组的成员条件。例如,成员条件可以是“程序集 来自http:站点”或“这个软件的发布者是Microsoft公司”等。每个代码组都有一个并且只有一个成
9、员条件。在.NET中,代码组可以使用的成员 条件如下: Zone:代码来自的区域 Site:代码来自的Web站点 Strong name:代码唯一的、可验证的名称。强名详见第16章。 Publisher:代码发布者 URL:代码来自的具体位置 Hash value:程序集的散列值 Skip verification:请求Skip verification的代码避开代码验证检查。代码的验证可以 确保代码以定义合理和可接受的方式访问类型。运行库不能确保类型不安全的代 码是安全的。 Application directory:程序集在应用程序中的位置 All code :符合条件的所有代码 Cust
10、om:与用户相关的条件上述成员条件的第一个类型就是Zone,这个类型是最常用的。Zone是一段代码区域 的开端,表示下面的内容:MyComputer, Internet, Intranet, Trusted 或 Untrusted。使用 Internet Explorer中的安全选项可以对这些区域进行管理,后面在讨论怎样管理安全性策略时,再 讨论这些内容。虽然设置是在Internet Explorer中管理的,但是它们将应用于整个机器。很 明显,那些配置选项在非Microsof1浏览器中是不能使用的,实际上,使用.NET Framework 编写的页面控件只能在Internet Explore
11、r上工作。代码组的安排是层次状的,根部是All Code成员条件,如图19-1所示。从这个图中可 以看出,每一个代码组都有一个成员条件,并且指定赋予代码组的权限。注意,如果程序 集不符合代码组中的成员条件,则CLR不会给它匹配那个代码组面的代码组。1. Caspol.exe代码访问安全性策略工具本章将花大量的篇幅介绍命令行工具:代码访问安全性策略工具。要得到它的选项列 表,只需输入下面的命令:caspol.exe ?使用下面的命令把输出发送给个文本文件:caspol.exe output.txt.NET也包括个Microsoft Management Console管理单元,它用于管理代码访问
12、的安 全性。但是,这里只使用命令行实用程序caspol.exe,以易于理解本章的示例,还可以创建 脚本,更改安全性策略,在把策略应用到大量的机器上时,这是非常有用的。使用caspol.exe,可以查看机器上的代码组。caspol.exe的执行结果是列出机器上代码 组的层次结构,并描述每个代码组。键入如下命令:caspol.exe -listdescription另外,Jistdescription选项还有一个缩写方式:ld。下面是该命令的结果:Microsoft (R) .NET Framework CasPol 2.0.50215.44Copyright (C) Microsoft Corp
13、oration. All 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 code group tree.1.1. My_Computer_Zone: Code group grants full trust to all code originating on the
14、 local computer1.1.1. Microsoft_Strong_Name: Code group grants full trust to code signed with the Microsoft strong name.1.1.2. ECMA_Strong_Name: Code group grants full trust to code signed with the ECMA strong name.1.2. LocalIntranet_Zone: Code group grants the intranet permission set to code from t
15、he intranet zone. This permission set grants intranet code the right to use isolated storage, full UI access, some capability to do reflection, and limited access to environment variables.1.2.1. Intranet_Same_Site_Access: All intranet code gets the right to connect back to the site of its origin.1.2
16、.2. Intranet_Same_Directory_Access: All intranet code gets the right to read from its install directory.1.3. Internet_Zone: Code group grants code from the Internet zone the Internet permission set. This permission set grants Internet code the right to use isolated storage and limited UI access.1.3.
17、1. Internet_Same_Site_Access: All Internet code gets the right to connect back to the site of its origin.1.4. Restricted_Zone: Code coming from a restricted zone does not receive any permissions.1.5. Trusted_Zone: Code from a trusted zone is granted the Internet permission set. This permission set g
18、rants the right to use isolated storage and limited UI access.1.5.1. Trusted_Same_Site_Access: All Trusted Code gets the right to connect back to the site of its origin.Success.NET安全子系统确保每一个代码组中的代码只能做某些事情。例如,Internet区域中 的代码在默认状态下比本地驱动器中的代码有更严格的限制;本地驱动器中的代码通常有 访问本地磁盘上数据的权限,但是!nternet中的程序集在默认状态下就没有这个权
19、限。使用caspol.exe和它在Microsoft Management Console中的等价选项,可以为每个代 码访问组指定信任级别,还可以按照更小的粒度方式管理代码组和权限。再看看代码访问组,但是,这次的信息比上次要少些。确保以本地管理员身份登录 后,打开命令提示窗口,输入下面的命令:caspol.exe -listgroups得到如下信息:Microsoft (R) .NET Framework CasPol 2.0.50215.44Copyright (C) Microsoft Corporation. All rights reserved.Security is ONExecu
20、tion checking is ONPolicy change prompt is ONLevel = MachineCode Groups:1. All code: Nothing1.1. Zone - MyComputer: FullTrust1.1.1. StrongName -002400000480000094000000060200000024000052534131000400000100010007D1FA57C4A ED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD2 3613
21、2102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F16 45C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A124365 18206DC093344D5AD293: FullTrust1.1.2. StrongName - 00000000000000000400000000000000: FullTrust1.2. Zone - Intranet: Locallntranet1.2.1. All code: Same s
22、ite Web.1.2.2. All code: Same directory FilelO - Read, PathDiscovery,1.3. Zone - Internet: Internet1.3.1. All code: Same site Web.1.4. Zone - Untrusted: Nothing1.5. Zone - Trusted: Internet1.5.1. All code: Same site Web.Success在输出结果的开头,是Security is ON。在本章后面的内容中,我们将会看到Security 可以先关闭,然后再打开。在默认状态下,Exec
23、ution Checking设置的值是on,这意味着所有的程序集在运行之 前,必须给它们赋予执行权限。如果使用caspol (caspol.exe -execution on|off)关闭执行检查, 则程序集没有执行权限也可以运行。在这种情况下,如果程序集在运行过程中有违背安全 性策略的行为,就会产生安全异常。Policy change prompt选项指定在更改安全性策略时,是否可以看到Are you sure警告 信息。把代码划分为这些组之后,就可以更精细地管理安全性,还可以实现对更少代码的完 全信任。注意,每个组都有一个标记(例如“ 1.2”),这些标记是.NET自动生成的,在不 同的机
24、器上是不同的。通常不是按照每个程序集来管理安全性,而是使用代码组来管理。如果一台机器上同时安装了几个.NET版本,则caspol.exe只更改与它相关的.NET安 装版本的安全性策略。(1)查看程序集的代码组如果程序集符合代码组的成员条件,它们就属于代码组。回到代码组的示例中,从 Web站点http:/intranet/载入程序集,则它匹配的代码组如图19-2所示。这个程序集也是根 代码组(AU Code)的成员。如果程序集来自本地的网络,则它还是Intranet代码组的成员; 但是,当从某一指定站点(如http:/intranet)载入程序集时,它也被赋予FullTrust权限,这 意味着程
25、序集的运行没有限制条件。图 !9-2使用如下命令,很容易查看程序集所属的代码组:caspol.exe -resolvegroup assembly.dll对本地磁盘上的程序集运行这个命令,可以得到如下结果:Microsoft (R) .NET Framework CasPol 2.0.50727.7Copyright (C) Microsoft Corporation. All rights reserved.Level = EnterpriseCode Groups:1. All code: FullTrustLevel = MachineCode Groups:2. All code: N
26、othing2.1. Zone - MyComputer: FullTrustLevel = UserCode Groups:1. All code: FullTrustSuccess注意,代码组是在3个级别上列出的,这3个级别是Enterprise、Machine和User。现 在只关注Machine级别。如果要了解这3个级别之间的关系,赋予程序集的有效权限是这 3个级别上权限的交集。例如,如果在Enterprise级别的策略中删除了 !nternet区域的 FullTrust权限,则Internet区域中代码的所有权限都被取消,其他两个级别的设置就变得 不相关了。现在,对这个程序集执行ca
27、spol.exe命令,看看它所属的代码组。但是这次程序集是 通过HTTP协议在Web服务器上访问的,这样,程序集成为不同代码组的成员,它的权限 受到更严格的限制:caspol.exe -resolvegroup http:/server/assembly.dllMicrosoft (R) .NET Framework CasPol 2.0.50727.7Copyright (C) Microsoft Corporation. All rights reserved.Level = EnterpriseCode Groups:2. All code: FullTrustLevel = Machi
28、neCode Groups:3. All code: Nothing3.1. Zone 一 !nternet: Internet3.1.1. All code: Same site Web.Level = UserCode Groups:1. All code: FullTrustSuccess程序集授予了 !nternet权限和Same Site Web权限。权限的交集允许代码对UI进行有 限的访问,并可以连接到最初生成它的站点。下面详细讨论权限。19.1.2代码访问权限和权限集想像自己正在个大公司中管理办公机器网络的安全性策略。在这种情况下,CLR在 执行代码之前收集代码的证据是非常有用的
29、;同样,一旦CLR知道了代码来自何处,管理 员就必然有机会控制代码在他管理的数百台机器上的行为。这个问题需要使用权限来解决。一旦程序集与代码组相匹配,CLR就会根据安全性策略赋予程序集一些权限。在 Windows中管理权限时,通常不是把权限赋予用户,而是把权限赋予用户组。程序集也是 如此,也就是说,把权限应用于代码组,而不是各个程序集,这就大大简化了.NET中安全 性策略的管理。安全性策略指定代码组中的程序集允许执行什么动作。下面列出了 CLR提供的代码访 问权限。从中可以看出,使用这些权限,可以很好地控制代码允许做什么和不允许做什么: DirectoryServicesPermission
30、: 通城 System.DirectoryServices 类访问 Active Directory 的 能力 DnsPermission:使用TCP/IP域名系统(DNS)的能力 EnvironmentPennission:读写环境变量的能力 EventLogPermission:读写事件II志的能力 FileDialogPermission:访问用户在Open对话框中选择的文件的能力。通常用于 没有赋予FilelOPermission权限,不能对文件进行有限的访问时。 FilelOPermission:处理文件的能力(其中包括读文件、写文件、添加文件的内容, 创建、更改和访问文件夹) Is
31、olatedStorageFilePermission:访问私有虚拟文件系统的能力 IsolatedStoragePermission:访问孤立存储器的能力,存储器与各个用户相关,并具 有代码身份的些特征,孤立存储器详见第24章 MessageQueuePermission:通过 Microsoft Message Queue 使用消息队列的能力 OleDbPermission:使用OLE DB提供程序访问数据库的能力 PerformanceCounterPermission:利用性能计数器的能力 Printingpermission:打印的能力 ReflectionPermission:使用
32、System.Reflection在运行期间查找类型信息的能力 Registrypermission:读、写、创建和删除注册表项和值的能力 SecurityPermission :执行、断皆权限、调用非托管的代码、忽略验证和其他权的 能力 ServiceControllerPermission:控制 Windows 服务的能力 SocketPermission:在网络传输地址上创建或接受TCP/IP连接的能力 SQLClientPermission:使用 SQL Server 的.NET 数据提供程序访问 SQLServer 数据 库的能力 UlPetrnission:访问用户界面的能力 We
33、bPermission:连接Web或接受Web连接的能力对于上面的每个权限类,通常可以指定更深级别的粒度。例如,在本章后面的个 示例中,请求的不仅仅是文件的访问权限,还指定了文件访问的具体级别。在实践中,如果要利用与上面列出的权限相关的资源,最好在应用程序中加入 try.catch错误处理块,以便应用程序运行在受限制的权限下时,能够很好地进行处理。应 用程序的设计应该指定应用程序在这些情况下怎样运行,而不应该假定应用程序运行在开 发它时的同一安全性策略。例如,如果应用程序不能访问本地磁盘,它是应该退出呢, 还是以另种方式进行工作呢?个程序集将与几个代码组相关联:在安全性策略中,程序集的有效权限
34、是程序集所 属的所有代码组中权限的并集。也就是说,程序集匹配的每个代码组都将扩展程序集的 权限。在代码组的树中,下面的代码组具有的权限比上面代码组具有的权限要多一些。以代码的身份为基础,CLR可以赋予代码组另个权限集合。这些权限与CLR收集 的关于程序集的证据直接相关,它们称为身份权限(Identity Permissions)下面是身份权 限类的名称: PublisherldentityPermission:软件发布者的数字签名 SiteldentityPermission: Web站点的名称,代码来自这个Web站点 StrongNameldentityPermission:程序集的强名 U
35、RLIdentityPermission: URL,代码来自这个URL(其中包括协议,例如http:) ZoneldentityPermission:程序集来自的区域把权限赋予代码组,就不需要处理每个程序集了。通常在程序块中应用权限,这就 是.NET提供权限集合的原因。代码访问的权限聚合在指定的集合中,面是已命名的权限 集合: FullTrust:没有权限的限制 SkipVerification:不进行验证 Execution:运行的能力,但是不能访问受保护的资源 Nothing:没有权限,代码不能执行 Locallntranct:本地内部网的默认策略,它是权限全集的子集。例如,文件IO只能
36、在程序集生成的共享上进行读取访问 Internet:未知来源的代码的默认策略,这是限制最严格的策略。例如,在这个权 限集合下执行的代码没有文件10能力,不能读写事件日志,也不能读写环境变量 Everything:这个集合中的所有权限,其中不包括忽略代码验证的权限。管理员可 以改变这个权限集合中的权限。默认策略要更强大时,可以使用这个权限集合注意:只能修改Everything权限集合的定义,而其他权限是固定的,不能改变。因为只有CLR能够把身份权限赋予代码,所以身份权限不能包括在权限集合中。例如, 如果段代码是来自某个发布者,管理员把与另个发布者相关的身份权限赋予这段代码 是亳无意义的。CLR在
37、需耍时赋予身份权限,这样就可以随时利用那些身份权限。1.查看程序集的权限代码组:Microsoft Corp.权限:FullTrust 成员条件:Publisher图 !9-3代码组:MyComputer权限:FullTrust成员条件:Zone假定用户在使用个Microsoft应用程序,并试图使用个以前从没用过的特性。应用 程序没有把代码的副本保存在本地,因此必须在Internet上请求代码,然后下载到全局程 序集缓存中。如果代码是由特定的公司(这个公司已经使用证书签署了程序集)通过Internet 发布的,则程序集所属代码组中的成员关系如图19-3所示。代码组:Internet权限:Int
38、ernet成员条件:Zone依照这个示例中的策略,代码组All Code和Internet的权限有限,但图中右下角的代 码组却赋予程序集FullTrust权限。程序集的有效权限是它所属所有代码组中权限的并集。 当权限以这种方式合并时,有效的权限就是被授予的最高权限,也就是说,程序集所属的 每个代码组都会向程序集的有效权限集中添加权限。正像可以查看程序集所属的代码组样,也可以查看赋予程序集所属代码组的权限。 在查看权限时,不但能够看到代码的访问权限(即允许代码做什么),也可以看到代码的身份 权限(身份权限能访问代码在运行期间表现出来的证据)。使用如下的命令,可以查看程序集 代码组的权限:casp
39、ol.exe -resolveperm assembly.dll对个程序集使用这个命令,并且查看在通过本地的内部网访问程序集时,赋予程序 集的代码访问权限和身份权限。如果输入下面的命令,就可以看到代码访问权限和3个 身份权限:caspol.exe -resolveperm http:/somehost/assembly.dllMicrosoft (R) .NET Framework CasPol 2.0.50727.7Copyright (C) Microsoft Corporation. All rights reserved.Resolving permissions for level
40、= EnterpriseResolving permissions for level = MachineResolving permissions for level = UserGrant = Success上面的权限都是以XML方式显示出来的,其中包括定义权限的类、包含类的程序集、 权限的版本以及加密标记。从中可以看出,我们能够创建自己的权限,此外,每个身份 权限都包括更详细的信息,例如UrlldentityPermission类的详细信息,通过这个类可以访问 生成代码的URL等。在输出结果的开头,要格外注意caspol.exe解决Enterprise, Machine和User级别上权 限的方式和列出有效权限的方式。下面讨论策略的