安全提问

作者:Walter Oliver

是否应允许完全信任呢?

对于某些工作负载,可能需要完全信任(例如,进行非托管调用、使用反射等)。 对于大多数 Web 应用,通常不需要。 Microsoft 建议使用中等信任(在服务器级别)。 使用功能委派时,你可以允许单个站点所有者替代“默认”信任级别,并转到完全信任或从中等信任派生的自定义信任级别。 这样,站点所有者就会做出明确的决定。

是否可以使用 Access 数据库?

是 - 就像在 IIS 6.0 中一样,你需要创建派生自中等信任的自定义信任,或者使用完全信任。

我们是否应更改匿名用户? (预定义用户安全性如何?)

这个问题没有简单的答案。 IIS 在将控制权交给 ASP、PHP 或 ASP.NET 等脚本技术之前,会提供匿名用户令牌,甚至会模拟线程。 一旦发生这种情况,IIS 就会退出,并且脚本技术如何使用此令牌也不由 IIS 决定。

例如,经典 ASP 使用模拟线程。 经典 ASP 沙盒基于以下假设构建:没有经典 ASP API 可以取消模拟以经过身份验证的用户运行的线程。

另一方面,ASP.NET 默认情况下不使用匿名用户。 其所有代码都以未模拟方式(即作为进程标识)运行。 当然,可以在 web.config 文件中(“标识”部分)打开模拟<>。 但是,ASP.NET 是一种功能强大的脚本技术,可生成新线程(默认情况下以未模拟方式运行),或者将当前线程还原为进程标识也并不难实现。 即使在中等信任中,也有办法实现这一点,而且不知道是否有人评估了中等信任 ASP.NET 沙盒在线程模拟方面的安全性。 PHP 在这方面也是尚未开发的领域。

重申一下:IIS 无法阻止脚本技术还原为进程标识或以进程标识生成新线程。

拥有匿名用户的好处在于,它提供了另一层防御。 恶意代码可能(尚)未找到以进程标识运行其代码的方法。 以进程标识运行的 IIS 代码必须具有对某些资源(例如 IIS 压缩缓存、临时 ASP.Net 文件等)的写权限。 如果恶意代码不知道如何还原为进程标识,则它不会干扰允许进程标识写权限的资源。 以匿名用户运行的自定义代码不需要这些权限。

如果不应允许完全信任,而是使用修改后的中等信任配置,那么建议的配置是什么?

我们没有适合访问 DB 的“建议配置”。 IIS 6.0 中的内容在 IIS 7.0 中仍然适用,因为 ASP.NET(尚)未更改。

如果需要配置自定义信任策略,Web 上有许多好文章:

https://msdn.microsoft.com/library/wyts434y.aspx

https://msdn.microsoft.com/library/ms998341.aspx#paght000020_step3

https://msdn.microsoft.com/library/ms998326.aspx#paght000017_step2