配置ASP.NET Web应用程序, 使之运行在medium trust

时间:2020-12-28 14:53:14
这文章会向你展示, 怎么配置ASP.NET Web应用程序, 使之运行在medium trust.
 
如果你的服务器有多个应用程序, 你可以使用code access securitymedium trust级别去隔离应用程序
 
通过设置和锁定machine级别的Web.config的信任级别, 你可以为服务器的Web应用程序建立安全策略.
 
运行ASP.NET的medium trust, 2.0比1.1较容易的, 因为当使用ASP.NET 2.0, 你不得不访问MS SQL Server 数据库的medium trust
 
Medium trust也为共享服务资源和相互的应用程序提供了强制性隔离环境.
 
Medium trust应用程序执行不注册访问, 不记录访问及不能使用反射.
 
你定义了<<trust/>>元素, Web访问网络地址是受限的,文件系统访问应用程序的虚拟目录层次也是受限的. 如果medium trust策略太过于限制性, 你可以建立或使用自定义策略文件.
 
 
 
目的
·         学习怎么使用medium trust开发Web应用程序.
·         学习在ASP.NET 2.0中partial trust的Web应用程序和了解变化
·         学习关于,当时用 medium trust 级别是的强制性.
·         在你的Web应用程序中配置 medium trust 级别
·         建立你自己的自定义信任级别和编辑信任级别
 
概述
默认, ASP.NET2.0 Web应用程序和Web服务是full trust的, 应用程序可以执行特许操作和访问资源, 甚至是操作系统暗转性和Windows访问控制列表(ACLs)
为ASP.NET应用程序设置访问及操作级别, 使它在主机环境中受隔离, 你可以使用code access security 去限制资源, 从中可以控制应用程序访问性和权限操作. 你通过配置<trust>元素如下:
 
<trust level="Full|High|Medium|Low|Minimal" />
 
<trust>元素支持许多默认的信任级别. 每个级别在为你的应用程序的运行, 连续提供了一个更加多限制性的环境(更少的code access security权限)
ISPs 需要在主机中建立多个应用程序, 使不同公司的应用程序在频繁使用中不能互相访问数据或不能互相干扰, 需要设置medium trust 级别,  Medium trust 设置也限制到共享系统资源, 使应用程序能够访问.
 
2.0的新特征之一
ASP.NET 1.1和2.0信任级别的主要不同如下:
  • ASP.NET 1.1和2.0, medium trust 可以访问SQL数据库, 因为SQL管理数据provider是不要求full trust和在medium trust应用程序中产生了SqlClientPermission
  • .NET Framework 2.0, Oracle.NET data provider, OLE DB.NET data provider, 和ODBC .NET data provider不再需要full trust. 它允许你使用partial trust去访问SQL Server和其他数据库. 使用在medium trust的应用程序的这些providers, 你需要自定义策略和准予适当的权限许可:例如,OraclePermissionOleDbPermission 或 OdbcPermission.
  • 在2.0中, SmtpPermission是可以设置full, highmedium trust级别的. 这就允许应用程序发送e-mail.
  • 在1.1, 你不得不准予代码 full trust去访问事件日志. 在2.0是不再需要的, 虽然你仍然必须建立custom trust策略文件去准予EventLogPermission,以下文档会详述.
 
 
 
 
 
Medium Trust 概要
主要在medium trust Web应用程序的限制性的放置是:
·         OleDbPermission 不可用. 意思是你不可以用ADO.NET管理OLE DB data provider 去访问数据库.然而, 你可以使用受管理的SQL Server provider去访问SQL Server 数据库.
·         EventLogPermission 不可用. 意思是你不可以访问Windows 时间日志.
·         ReflectionPermission不可用. 意思是你不可以使用反射.
·         RegistryPermission不可用. 意思是你不可以访问.
·         WebPermission 有限制. 意思是你的应用程序可以只和地址或地址列通讯, 只需要定义<trust>元素.
·         FileIOPermission有限制. 意思是你可以只在你的应用程序的虚拟目录层次里访问文件. 你应该为你的应用程序虚拟目录层级准予读、写, 附加, PathDiscovery 的权限许可.
非托管代码或using Enterprise Services, 你可以阻止.
 
步骤的概要
在ASP.NET应用程序中使用medium trust:
·         步骤1. 配置medium trust.
·         步骤2锁定trust级别.
·         步骤3随意地基于medium trust, 建立自定义策略
 
<trust level="Medium" originUrl="" />
 
步骤 1. 配置 Medium Trust
配置应用程序为medium trust, 添加如下的元素到每个应用程序的Web.config文件中,
<trust level="Medium" originUrl="" />
注意 如果呈现, originUrl 属性可以被权限许可所使用, 例如WebPermission, 限定连通性以定义一套地址. 在服务器配置所有Web应用程序, 以运行medium trust, 添加这个元素到machine级别Web.config文件中, 如下:%windir%/Microsoft.NET/Framework/{version}/CONFIG.
By default, Web applications are configured to run with full trust as shown in the following default configuration from the machine-level Web.config file.
默认, Web应用程序被配置运行full trust的machine级别Web.config文件, 如下:
<location allowOverride="true"> <system.web> <securityPolicy> <trustLevel name="Full" policyFile="internal" /> <trustLevel name="High" policyFile="web_hightrust.config" /> <trustLevel name="Medium" policyFile="web_mediumtrust.config" /> <trustLevel name="Low" policyFile="web_lowtrust.config" /> <trustLevel name="Minimal" policyFile="web_minimaltrust.config" /> </securityPolicy> <trust level="Full" originUrl="" /> </system.web> </location>
检查整套medium trust的权限许可能力, 可以查看Web_mediumtrust.config文件.
 
 
步骤 2. 锁定信任级别
 
 
 
 
应用程序服务providers或任何一个为同一个服务器运行多应用程序而提供在machine级别Web.config文件medium trust策略的设置和对信任级别的锁定
实现这个, 在machine级别的Web.config文件中设置allowOverride属性为false, 代码如下.
 
<location allowOverride="false"> <system.web> <securityPolicy> <trustLevel name="Full" policyFile="internal" /> <trustLevel name="High" policyFile="web_hightrust.config" /> <trustLevel name="Medium" policyFile="web_mediumtrust.config" /> <trustLevel name="Low" policyFile="web_lowtrust.config" /> <trustLevel name="Minimal" policyFile="web_minimaltrust.config" /> </securityPolicy> <trust level="Medium" originUrl="" /> </system.web> </location>
 
通过设置allowOverride="false", 个别的开发者是不可以在他们的应用程序的Web.config文件中覆盖medium trust 策略的.
 
 
步骤 3. 基于Medium Trust随便地建立自定义策略
 
 
 
 
如果medium trust是太过限制性的, 你可以基于medium trust建立自定义策略文件. 例如, 你可以允许应用程序去选择以下任何一种:连接到Oracle数据库, 写事件日志到Windows事件日志, 或者读应用程序虚拟目录层级以外的指定目录的文件.
基于medium trust建立自定义策略
 
 
1.    复制medium trust策略文件web_MediumTrust.config
位于%windir%/Microsoft.NET/Framework/{Version}/CONFIG. 并在同一目录下建立新的策略文件. 给它一个名字, 指出这是你所变更后的medium trust; 例如, 名字可以是: customeWeb_MediumTrust.config.
2.    添加一个你想准予的权限许可, 如下例子, FileIOPermission被编辑为允许读访问非应用程序的虚拟目录层级的指定目录.
<PermissionSet class="NamedPermissionSet" version="1" Name="ASP.Net"> ... <IPermission class="FileIOPermission" version="1" Read="C:/SomeDir;$AppDir$" Write="$AppDir$" Append="$AppDir$" PathDiscovery="$AppDir$" /> ... </PermissionSet>
3.    在你的machine-level的Web.config文件中, 建立一个新的自定义策略级别. 策略文件的名称是你在步骤1建立的那个策略文件名.
<securityPolicy> <trustLevel name="CustomMedium" policyFile="customWeb_mediumtrust.config" /> ... </securityPolicy>
4.    配置应用程序, 对运行在新的自定义策略级别的设置信任级别为CustomMedium. 你的安全策略类似如下例子.
<system.web> <securityPolicy> <trustLevel name="CustomMedium" policyFile="customWeb_mediumtrust.config" /> <trustLevel name="Full" policyFile="internal" /> <trustLevel name="High" policyFile="web_hightrust.config" /> <trustLevel name="Medium" policyFile="web_mediumtrust.config" /> <trustLevel name="Low" policyFile="web_lowtrust.config" /> <trustLevel name="Minimal" policyFile="web_minimaltrust.config" /> </securityPolicy> <trust level="CustomMedium" originUrl="" /> </system.web>
 
OleDbPermission, EventLogPermission and FileIOPermission
如果需要共同的权限许可, 你也许需要添加包括:
·         OleDbPermission
·         EventLogPermision
·         FileIOPermission
 
 
OleDbPermission
 
 
如果你的服务器是支持多数据库类型, 在哪个已经准予medium trust的策略上, 除SqlClientPermission之外, 你需要向Web应用程序准予OleDbPermission
向准予OleDbPermission扩展medium trust策略
 
 
  1. 建立一个自定义策略文件和配置你的应用程序, 以使用自定义信任级别, 正如"Modifying Medium Trust Policy"所描述.
2.    向<SecurityClasses>部分添加以下权限许可类型.
<SecurityClass Name="OleDbPermission" Description="System.Data.OleDb.OleDbPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
3.    向名为”ASP.NET” 的PermissionSet节点, 添加非限制性的OleDbPermission, 展示如下
<PermissionSet class="NamedPermissionSet" version="1" Name="ASP.Net"> ... <IPermission class="OleDbPermission" version="1" Unrestricted="true"/> ... </PermissionSet>
 
锁定链接字符串
 
 
 添加非限制性OleDbPermission, 意味着你的应用程序可以在服务器使用一些 OLE DB的provider. 在一个主机环境, 管理员可能需要使用更多高级表单, 更多来自OleDbPermission的语法, 锁定链接字符串, 它是允许访问指定的数据库的高级表单. 以下的例子将显示怎么限制访问一个指定的OLE DB数据资源.
 
<IPermission class="OleDbPermission" version="1"> <add ConnectionString= "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:/data/w4w.mdb" KeyRestrictions="" KeyRestrictionBehavior="AllowOnly"/> </IPermission>
 
<add>元素指出以下的属性:
·         ConnectionString. 这个元素指定一个许可链接字符串.
·         KeyRestrictions. 这个元素指定附加链接字符串参数, 这或许被添加一个依靠值为KeyRestrictionBehavior的链接字符串. 指定链接字符串的参数使用parameterName=的语法. 你可以通过限定每个之间用分号区分地指定多个参数.
·         KeyRestrictionBehavior. 你可以设置这为 AllowOnlyPreventUsage.
·         如果你使用AllowOnly,附加链接字符串参数就指定在 KeyRestrictions属性中可能会被添加指定的链接字符串ConnectionString.
·         如果你使用PreventUsage, 链接字符串的参数指定在KeyRestrictions的属性可能不会被添加到指定的链接字符串ConnectionString, 尽管其他的链接字符串会被添加.
如果没有被指定的限制性的key, 而KeyRestrictionBehavior属性也设置为AllowOnly, 那就没有附加的链接字符串参数被允许.
如果没有被指定的限制性的key, 而KeyRestrictionBehavior属性也设置为PreventUsage, 哪附加字符串参数将会被允许.
 
 
EventLogPermission
 
 
Medium trust 策略是不允许访问Windows事件日志.
 
 
授予访问事件日志的权力
 
 
1.    建立自定义策略文件和配置你的应用程序, 去使用custom trust level, 正如” Modifying Medium Trust Policy"所述.
2.    添加以下的权限许可类到<SecurityClasses>部分于自定义策略文件中.
<SecurityClasses> ... <SecurityClass Name="EventLogPermission" Description="System.Diagnostics.EventLogPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> ... </SecurityClasses>
3.    添加EventLogPermission到名为” ASP.Net” 的permissionSet节点中, 如下.
<PermissionSet class="NamedPermissionSet" version="1" Name="ASP.Net"> ... <IPermission class="EventLogPermission" version="1"> <Machine name="." access="Write"/> </IPermission> ... </PermissionSet>
 
注意在写入的时候, 你必须设置access="administer" 才能在局部信任应用程序中写入事件日志.
 
建立事件源
 
如果你的应用程序需要使用应用指定的事件源, 在管理员允许访问是, 你应该在安装时就建立事件源. 一个好的近似的方法就是使用.NET安装类, 就像Windows Installer(如果你是使用.msi部署)或是通过InstallUtil.exe系统应用.
If you are unable to create event sources at installation time, and you are in deployment, the administrator should manually create new event source entry beneath the following registry key
如果你在安装时, 不允许建立事件源, 并且你是在部署, 那么管理员应该手动建立新的事件源入口到注册表, 如下
 
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/<LogName>
 
注意
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/注册表中, 你不应该准予可写的权限到ASP.NET进程帐户(或者类似的帐户如果你的应用程序使用了类似的帐户). 如果你允许注册表和帐号具有可写访问, 攻击者可以编辑一些对系统的日志相关的设置, 包括访问控制日志.
 
FileIOPermission
 
如果你需要你的应用程序能访问非应用程序虚拟目录层级的文件, 你可以基于medium trust文件建立自定义策略,然后编辑FileIOPermission. 例如, 如下定义是可以让应用程序可以读”C:/SomeDir”的目录.
 
<IPermission class="FileIOPermission" version="1" Read="C:/SomeDir;$AppDir$" Write="$AppDir$" Append="$AppDir$" PathDiscovery="$AppDir$" />
 
通过让应用程序访问越过应用程序虚拟目录层级的文件, 你减少了编写代码访问安全隔离的份量. 如果你在一个服务器中, 有多个应用程序, 你需要保护资源, 例如ACLs的文件, 和对每个应用程序使用分开的标识符.
 
为Medium Trust部署
 
帮助设计和开发你的应用程序为medium trust, 考虑以下的:
 
·         鉴别资源类型你的应用程序需要访问和需要执行的特性操作.
你需要知道你的应用程序需求, 那些代码访问安全权限许可. 关于权限许可的要求, 可以参考"Resource Access Permissions Summary"和"Privileged Operation Permissions Summary"部分, 文章是How To: Use Code Access Security in ASP.NET 2.0.
·        
    知道在medium trust里面什么是接受访问的许可.
 
学习接受访问许可的最好方法是开放的, 可以检查 web_MediumTrust.config文件位于%windir%/Microsoft.NET/Framework/{Version}/CONFIG 目录中
·         Configure your development environment and your application's Web.config file for medium trust.
 
配置你的开发环境和为medium trust配置你的应用程序中的Web.config文件
 
因为在开发之前做好这个配置, 所以你可以立刻看到权限许可请求失败和什么问题需要处理的.
·        
          对于现存的应用程序考虑使用Permcalc工具.
 
如果你有现有程序, 并想运行medium trust中, 考虑使用Permcalc工具去为你的应用程序所需决定适合的许可.你需要确保广泛的测试通过, 代码路径通过你的应用程序是已经执行的.  
 
     最好是为你的信任级别定一个目标, 在你开始设计、开发和设计、开发指定的信任级别之. 当
     你转换现有应用程序到medium trust时, 普遍因为安全异常的缘故包括有:
·         召集非托管代码.
·         访问注册表.
·         写事件日志.
·         除了SQL Server, 链接其他的数据库.
·         在远程服务器*问Web资源.
·         访问非应用程序虚拟目录层级的文件系统.
附加资源参考:
如果有所帮助, 请给原作者反馈, 地址如下
 
使用wiki或E-mail都可以:
·         Wiki. Security Guidance 反馈页面:http://channel9.msdn.com/wiki/default.aspx/Channel9.SecurityGuidanceFeedback
·         E-mail.发送Email到secguide@microsoft.com.
他们专注和兴趣于:
·         制定建议的技术问题;
·         有效的和可能性问题;