最新C#学习资料NET的安全性.docx
- 文档编号:28990368
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:67
- 大小:548.57KB
最新C#学习资料NET的安全性.docx
《最新C#学习资料NET的安全性.docx》由会员分享,可在线阅读,更多相关《最新C#学习资料NET的安全性.docx(67页珍藏版)》请在冰豆网上搜索。
最新C#学习资料NET的安全性
190
第章
.NET的安全性
当用户坐在计算机前,单击应用程序上的按钮时,应用程序会在后台作出响应,如果用户试图使用一个没有相关模块的特性,应用程序就会与Internet连接,把模块下载到全局程序集缓存中,并开始执行模块,所有的一切都没有给出提示。
这种后台升级功能已经在许多.NET应用程序中使用了,但是,我们必须关注与所谓的“移动代码(mobilecode)”相关的安全问题。
也就是说,有什么证据能说明计算机下载的代码是可以信任的?
怎样知道所下载的模块就是我们需要的模块?
CLR在后台做了什么工作,以确保Web站点上的控件没有读取私人的电子邮件?
.NET执行程序集的安全性策略。
.NET根据它拥有的程序集信息(例如程序集来自哪里,它们是由谁发布的),把具有相似特征的程序集组合在一起。
例如,运行库把本地内联网上的所有代码放在一组。
然后,使用安全性策略(通常由系统管理员使用代码访问安全策略工具caspol.exe命令行实用程序或Microsoft管理控制台来定义)在非常小的粒度级别上决定应该赋予代码什么权限。
需要做什么工作才能确保机器或某个应用程序的安全?
什么也不需要,因为所有的代码都自动运行在CLR的安全环境中,但可以在必要时禁用安全性。
除了相信正在执行的代码是可信赖的之外,还要允许应用程序的用户访问他们需要的特性(但不要太多),这一点也是非常重要的。
依靠基于角色的安全性,.NET可以对用户和角色进行有效的管理。
本章将讨论.NET中有助于管理安全的一些特性,其中包括.NET怎样避开有害的代码、怎样管理安全性策略,以及怎样编程访问安全子系统等。
除此之外,还将讨论怎样安全地部署.NET应用程序,并且给出一些小的应用程序示例,以巩固本章介绍的概念。
19.1代码访问的安全性
代码访问的安全性是.NET的一个特性,它根据代码的信任级别来管理代码。
如果CLR非常信赖代码,允许它们运行,就会开始执行代码。
但是,根据提供给程序集的权限,代码也许要在有限制的环境中运行。
如果代码没有得到足够的信赖去运行,或者虽然代码运行了,但试图执行没有相关权限的操作,则会产生一个安全异常(其类型是SecurityException或它的子类)。
代码访问的安全性系统意味着可以停止有害代码的运行,也可以允许代码运行在受保护的环境中,在受保护的环境中,我们相信代码不会进行破坏。
例如,如果用户试图运行一个应用程序,执行从Internet上下载的代码,则默认的安全性策略将生成一个异常,该应用程序会启动失败。
同样,如果用户从网络驱动器上运行应用程序,则那个应用程序可以运行,但是如果那个应用程序试图访问本地驱动器上的文件,运行库就会产生一个异常,根据应用程序中处理错误的程序,应用程序会退出对文件的访问,或者退出执行。
对于大多数应用程序而言,.NET代码访问的安全性都是非常有用的,但它在后台起作用。
代码访问的安全性提供了高水平的保护,以远离有害的代码,但是,通常我们涉及不到这个方面。
而只考虑安全性策略的管理,尤其是在把桌面应用程序配置为信赖提供应用程序的软件厂商的代码时,就更要考虑安全性策略的管理。
在开发应用程序时,对于其中包含的元素,如果要严密地控制它们的安全性,则可以使用代码访问的安全性。
例如,如果公司的数据库中包含极其机密的数据,则可以使用代码访问的安全性,规定什么代码允许访问数据库,而什么代码不允许访问数据库。
代码访问的安全性的主要目的是保护资源(例如本地磁盘、网络和用户接口等)免受有害代码的破坏,而不是使软件免受用户的破坏。
对于与用户相关的安全问题,通常可以使用Windows内置的用户安全子系统,或者利用.NET中基于角色的安全性,这些内容将在本章的后面讨论。
代码访问的安全性以两个高层次的概念为基础,即代码组(CodeGroup)和权限(Permission)。
下面讨论这两个概念,因为它们构成了后面章节的基础:
●代码组:
代码组用于把具有相似特征的代码集合到一组。
通常,集合时所依据的最重要特征就是代码来自哪里。
例如,代码组包括“Internet”(代码来自Internet)和“Intranet”(代码来自LAN)。
把程序集放到代码组中所使用的信息称为“证据”。
CLR收集的其他证据包括代码的发布者、代码的强名以及下载代码的URI等。
代码组的排列是层次状的,程序集总是与几个代码组相匹配。
层次根部的代码组称为“AllCode”,包含其他所有的代码组。
层次用于确定程序集属于哪一个代码组,如果程序集提供的证据与树中的代码组不匹配,则程序集不属于树的任何一个代码组。
●权限:
权限是允许每一个代码组执行的动作。
例如,权限包括“可以访问用户界面”和“可以访问本地存储器”等。
系统管理员通常在Enterprise级、Machine级和User级上管理权限。
CLR中的VirtualExecutionSystem用于载入和运行程序。
VirtualExecutionSystem提供了执行托管代码所需要的功能,并使用程序集元数据把模块在运行期间连接在一起。
当VES载入程序集时,VES通常把程序集与一个或多个代码组相匹配。
每一个代码组都被赋予了一个或多个权限,指定各个代码组中的程序集可以执行什么动作。
例如,如果MyComputer代码组被赋予FileIOPermission权限,则意味着来自本地机器的程序集可以读写本地文件系统。
19.1.1代码组
代码组有一个称之为成员条件的入口需求(entryrequirement)。
如果要把程序集划归某个代码组,该程序集就必须符合那个代码组的成员条件。
例如,成员条件可以是“程序集来自站点”或“这个软件的发布者是Microsoft公司”等。
每一个代码组都有一个并且只有一个成员条件。
在.NET中,代码组可以使用的成员条件如下:
●Zone:
代码来自的区域
●Site:
代码来自的Web站点
●Strongname:
代码唯一的、可验证的名称。
强名详见第16章。
●Publisher:
代码发布者
●URL:
代码来自的具体位置
●Hashvalue:
程序集的散列值
●Skipverification:
请求Skipverification的代码避开代码验证检查。
代码的验证可以确保代码以定义合理和可接受的方式访问类型。
运行库不能确保类型不安全的代码是安全的。
●Applicationdirectory:
程序集在应用程序中的位置
●Allcode:
符合条件的所有代码
●Custom:
与用户相关的条件
上述成员条件的第一个类型就是Zone,这个类型是最常用的。
Zone是一段代码区域的开端,表示下面的内容:
MyComputer、Internet、Intranet、Trusted或Untrusted。
使用InternetExplorer中的安全选项可以对这些区域进行管理,后面在讨论怎样管理安全性策略时,再讨论这些内容。
虽然设置是在InternetExplorer中管理的,但是它们将应用于整个机器。
很明显,那些配置选项在非Microsoft浏览器中是不能使用的,实际上,使用.NETFramework编写的页面控件只能在InternetExplorer上工作。
代码组的安排是层次状的,根部是AllCode成员条件,如图19-1所示。
从这个图中可以看出,每一个代码组都有一个成员条件,并且指定赋予代码组的权限。
注意,如果程序集不符合代码组中的成员条件,则CLR不会给它匹配那个代码组下面的代码组。
图19-1
1.Caspol.exe——代码访问安全性策略工具
本章将花大量的篇幅介绍命令行工具:
代码访问安全性策略工具。
要得到它的选项列表,只需输入下面的命令:
caspol.exe-?
使用下面的命令把输出发送给一个文本文件:
caspol.exe>output.txt
.NET也包括一个MicrosoftManagementConsole管理单元,它用于管理代码访问的安全性。
但是,这里只使用命令行实用程序caspol.exe,以易于理解本章的示例,还可以创建脚本,更改安全性策略,在把策略应用到大量的机器上时,这是非常有用的。
使用caspol.exe,可以查看机器上的代码组。
caspol.exe的执行结果是列出机器上代码组的层次结构,并描述每一个代码组。
键入如下命令:
caspol.exe–listdescription
另外,-listdescription选项还有一个缩写方式:
-ld。
下面是该命令的结果:
Microsoft(R).NETFrameworkCasPol2.0.50215.44
Copyright(C)MicrosoftCorporation.Allrightsreserved.
SecurityisON
ExecutioncheckingisON
PolicychangepromptisON
Level=Machine
FullTrustAssemblies:
1.All_Code:
Codegroupgrantsnopermissionsandformstherootofthecode
grouptree.
1.1.My_Computer_Zone:
Codegroupgrantsfulltrusttoallcodeoriginating
onthelocalcomputer
1.1.1.Microsoft_Strong_Name:
Codegroupgrantsfulltrusttocodesigned
withtheMicrosoftstrongname.
1.1.2.ECMA_Strong_Name:
Codegroupgrantsfulltrusttocodesignedwith
theECMAstrongname.
1.2.LocalIntranet_Zone:
Codegroupgrantstheintranetpermissionsetto
codefromtheintranetzone.Thispermissionsetgrantsintranetcode
therighttouseisolatedstorage,fullUIaccess,somecapabilitytodo
reflection,andlimitedaccesstoenvironmentvariables.
1.2.1.Intranet_Same_Site_Access:
Allintranetcodegetstherightto
connectbacktothesiteofitsorigin.
1.2.2.Intranet_Same_Directory_Access:
Allintranetcodegetstherightto
readfromitsinstalldirectory.
1.3.Internet_Zone:
CodegroupgrantscodefromtheInternetzonethe
Internetpermissionset.ThispermissionsetgrantsInternetcodetheright
touseisolatedstorageandlimitedUIaccess.
1.3.1.Internet_Same_Site_Access:
AllInternetcodegetstherightto
connectbacktothesiteofitsorigin.
1.4.Restricted_Zone:
Codecomingfromarestrictedzonedoesnotreceiveany
permissions.
1.5.Trusted_Zone:
CodefromatrustedzoneisgrantedtheInternet
permissionset.Thispermissionsetgrantstherighttouseisolated
storageandlimitedUIaccess.
1.5.1.Trusted_Same_Site_Access:
AllTrustedCodegetstherightto
connectbacktothesiteofitsorigin.
Success
.NET安全子系统确保每一个代码组中的代码只能做某些事情。
例如,Internet区域中的代码在默认状态下比本地驱动器中的代码有更严格的限制;本地驱动器中的代码通常有访问本地磁盘上数据的权限,但是Internet中的程序集在默认状态下就没有这个权限。
使用caspol.exe和它在MicrosoftManagementConsole中的等价选项,可以为每一个代码访问组指定信任级别,还可以按照更小的粒度方式管理代码组和权限。
再看看代码访问组,但是,这次的信息比上次要少一些。
确保以本地管理员身份登录后,打开命令提示窗口,输入下面的命令:
caspol.exe–listgroups
得到如下信息:
Microsoft(R).NETFrameworkCasPol2.0.50215.44
Copyright(C)MicrosoftCorporation.Allrightsreserved.
SecurityisON
ExecutioncheckingisON
PolicychangepromptisON
Level=Machine
CodeGroups:
1.Allcode:
Nothing
1.1.Zone-MyComputer:
FullTrust
1.1.1.StrongName-002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293:
FullTrust
1.1.2.StrongName-00000000000000000400000000000000:
FullTrust
1.2.Zone-Intranet:
LocalIntranet
1.2.1.Allcode:
SamesiteWeb.
1.2.2.Allcode:
SamedirectoryFileIO–'Read,PathDiscovery'
1.3.Zone-Internet:
Internet
1.3.1.Allcode:
SamesiteWeb.
1.4.Zone-Untrusted:
Nothing
1.5.Zone-Trusted:
Internet
1.5.1.Allcode:
SamesiteWeb.
Success
在输出结果的开头,是SecurityisON。
在本章后面的内容中,我们将会看到Security可以先关闭,然后再打开。
在默认状态下,ExecutionChecking设置的值是on,这意味着所有的程序集在运行之前,必须给它们赋予执行权限。
如果使用caspol(caspol.exe–executionon|off)关闭执行检查,则程序集没有执行权限也可以运行。
在这种情况下,如果程序集在运行过程中有违背安全性策略的行为,就会产生安全异常。
Policychangeprompt选项指定在更改安全性策略时,是否可以看到"Areyousure"警告信息。
把代码划分为这些组之后,就可以更精细地管理安全性,还可以实现对更少代码的完全信任。
注意,每一个组都有一个标记(例如“1.2”),这些标记是.NET自动生成的,在不同的机器上是不同的。
通常不是按照每一个程序集来管理安全性,而是使用代码组来管理。
如果一台机器上同时安装了几个.NET版本,则caspol.exe只更改与它相关的.NET安装版本的安全性策略。
(1)查看程序集的代码组
如果程序集符合代码组的成员条件,它们就属于代码组。
回到代码组的示例中,从Web站点http:
//intranet/载入程序集,则它匹配的代码组如图19-2所示。
这个程序集也是根代码组(AllCode)的成员。
如果程序集来自本地的网络,则它还是Intranet代码组的成员;但是,当从某一指定站点(如http:
//intranet)载入程序集时,它也被赋予FullTrust权限,这意味着程序集的运行没有限制条件。
图19-2
使用如下命令,很容易查看程序集所属的代码组:
caspol.exe–resolvegroupassembly.dll
对本地磁盘上的程序集运行这个命令,可以得到如下结果:
Microsoft(R).NETFrameworkCasPol2.0.50727.7
Copyright(C)MicrosoftCorporation.Allrightsreserved.
Level=Enterprise
CodeGroups:
1.Allcode:
FullTrust
Level=Machine
CodeGroups:
1.Allcode:
Nothing
1.1.Zone-MyComputer:
FullTrust
Level=User
CodeGroups:
1.Allcode:
FullTrust
Success
注意,代码组是在3个级别上列出的,这3个级别是Enterprise、Machine和User。
现在只关注Machine级别。
如果要了解这3个级别之间的关系,赋予程序集的有效权限是这3个级别上权限的交集。
例如,如果在Enterprise级别的策略中删除了Internet区域的FullTrust权限,则Internet区域中代码的所有权限都被取消,其他两个级别的设置就变得不相关了。
现在,对这个程序集执行caspol.exe命令,看看它所属的代码组。
但是这次程序集是通过HTTP协议在Web服务器上访问的,这样,程序集成为不同代码组的成员,它的权限受到更严格的限制:
caspol.exe–resolvegrouphttp:
//server/assembly.dll
Microsoft(R).NETFrameworkCasPol2.0.50727.7
Copyright(C)MicrosoftCorporation.Allrightsreserved.
Level=Enterprise
CodeGroups:
1.Allcode:
FullTrust
Level=Machine
CodeGroups:
1.Allcode:
Nothing
1.1.Zone-Internet:
Internet
1.1.1.Allcode:
SamesiteWeb.
Level=User
CodeGroups:
1.Allcode:
FullTrust
Success
程序集授予了Internet权限和SameSiteWeb权限。
权限的交集允许代码对UI进行有限的访问,并可以连接到最初生成它的站点。
下面详细讨论权限。
19.1.2代码访问权限和权限集
想像自己正在一个大公司中管理办公机器网络的安全性策略。
在这种情况下,CLR在执行代码之前收集代码的证据是非常有用的;同样,一旦CLR知道了代码来自何处,管理员就必然有机会控制代码在他管理的数百台机器上的行为。
这个问题需要使用权限来解决。
一旦程序集与代码组相匹配,CLR就会根据安全性策略赋予程序集一些权限。
在Windows中管理权限时,通常不是把权限赋予用户,而是把权限赋予用户组。
程序集也是如此,也就是说,把权限应用于代码组,而不是各个程序集,这就大大简化了.NET中安全性策略的管理。
安全性策略指定代码组中的程序集允许执行什么动作。
下面列出了CLR提供的代码访问权限。
从中可以看出,使用这些权限,可以很好地控制代码允许做什么和不允许做什么:
●DirectoryServicesPermission:
通过System.DirectoryServices类访问ActiveDirectory的能力
●DnsPermission:
使用TCP/IP域名系统(DNS)的能力
●EnvironmentPermission:
读写环境变量的能力
●EventLogPermission:
读写事件日志的能力
●FileDialogPermission:
访问用户在Open对话框中选择的文件的能力。
通常用于没有赋予FileIOPermission权限,不能对文件进行有限的访问时。
●FileIOPermission:
处理文件的能力(其中包括读文件、写文件、添加文件的内容,创建、更改和访问文件夹)
●IsolatedStorageFilePermission:
访问私有虚拟文件系统的能力
●IsolatedStoragePermission:
访问孤立存储器的能力,存储器与各个用户相关,并具有代码身份的一些特征,孤立存储器详见第24章
●MessageQueuePermission:
通过MicrosoftMessageQueue使用消息队列的能力
●OleDbPermission:
使用OLEDB提供程序访问数据库的能力
●PerformanceCounterPermission:
利用性能计数器的能力
●PrintingPermission:
打印的能力
●ReflectionPermission:
使用System.Reflection在运行期间查找类型信息的能力
●RegistryPermission:
读、写、创建和删除注册表项和值的能力
●SecurityPermission:
执行、断言权限、调用非托管的代码、忽略验证和其他权力的能力
●ServiceControllerPermission:
控制Windows服务的能力
●SocketPermission:
在网络传输地址上创建或接受TCP/IP连接的能力
●SQLClientPermission:
使用SQLServer的.NET数据提供程序访问SQLServer数据库的能力
●UIPermission:
访问用户界面的能力
●WebPermission:
连接We
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 C# 学习 资料 NET 安全性