这文章会向你展示, 怎么配置ASP.NET Web应用程序, 使之运行在
medium trust.
如果你的服务器有多个应用程序, 你可以使用
code access security和
medium 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, 你需要自定义策略和准予适当的权限许可:例如,OraclePermission, OleDbPermission 或 OdbcPermission.
- 在2.0中, SmtpPermission是可以设置full, high和medium 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
策略
- 建立一个自定义策略文件和配置你的应用程序, 以使用自定义信任级别, 正如"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. 你可以设置这为
AllowOnly或
PreventUsage.
· 如果你使用
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.
他们专注和兴趣于
:
· 制定建议的技术问题;
· 有效的和可能性问题;