我有一个经典的 ASP/VBScript 网站(登陆页面 - default.asp),它通过 Scripting.FileSystemObject 将网站用户访问(LOGON_USER)活动写入一个简单的 txt 文件。
VBScript 创建一个 FSO 来打开/创建“logs”文件夹下的新文件
Windows 2008 R2 64位环境
IIS 7.5-
- 身份验证 - 已启用 Windows 身份验证。所有其他身份验证均已禁用。
- 以 Classic PipeLine 模式运行的 AppPool;
- 启用 32 位应用程序设置为 true;
- 身份是 NetworkService。
- 加载用户配置文件设置为 false
- ASP:executeInMta 设置为 false
日志文件夹的 ACL
- 用户组-读取和执行;
- SYSTEM——完全控制(继承);
- 管理员——完全控制(继承);
- IIS_IUSRS-完全控制;
- 网络服务 - 完全控制。
此设置让我得到‘800A0046-权限被拒绝’。 请注意,Windows 身份验证已启用。我将 LOGON_USER 值映射到 DB 中的值,以允许用户访问我的网站。AppPool 设置为 NT Authority\NetworkService。虽然 apppool 标识设置为 NetworkService,但在用户进行身份验证后,文件将通过经过身份验证的用户(模拟)进行访问。以下是示例进程监视器活动。
进程监视器文件系统活动
- default.asp - 所需访问 - 成功 - 模拟:域名\用户名
- logs\log3011.txt - 所需访问 - 拒绝 - 模仿:域名\用户名
现在,这让我处于一种情况,我必须转到“日志”文件夹的安全属性并授予每个允许的用户读/写权限。我正在寻找的是,由于我的应用程序池作为 NetworkService 运行(日志文件夹被授予 NetworkService 的完全控制权),我希望通过网络服务访问日志文件夹,而不是通过 Windows 身份验证进行身份验证的用户。我理解这是使用 Windows 身份验证时的预期结果。但是,我使用 Windows 身份验证只是为了验证用户是否被允许访问该网站。我需要所有其他网站活动使用 NT Authority\NetworkService。 (我寻求一个解决方案来阻止 Classic ASP 模仿 Windows 身份验证的用户,而是使用 appool 身份 - 在我的情况下是 networkservice - 来访问资源)
这要求过分吗?请给我适当的解释。谢谢。
答案1
是的。经典的 ASP 模拟。不知道 ASP 内置的解决这个问题的方法 - 您可能会发现 StackOverflow 对此更了解,因为我认为这是一个编程主题。
您所需的模型在 ASP.Net 模式和实践文档(几年前)中通常被称为“受信任的子系统”模型。
过去,我使用 ASP.net 页面进行写入,通过 WinHTTP 从 ASP 页面调用;使用指定了其自身标识的 COM 对象是另一种选择。您可以(同样轻松地)将页面转换为 ASP.Net,并在关闭模拟的情况下使用它。然后是“调用 RevertToSelf()”选项,它会忘记您的线程标识;您可能还需要一个 COM 对象为您的线程执行此操作,同样来自内存。
编辑:或者使用以不同身份运行的数据库;文件系统之所以有问题,是因为它太容易使用!
此外,如果所有用户都写入同一个文件,则当多个用户同时访问该文件时,“写入日志”方案是不可行的,并且在这种情况下最多只会引入延迟。
如果每个用户只需要写入他们自己的日志(并且你希望他们在写入时不要太快刷新以避免并发问题),你可能只需向这些用户授予该文件夹的写入权限即可。如果没有读取权限,它就有点没用;如果不实际攻击该机器(它是 Windows 集成的,因此你在内部网上),他们很难意外地填充过多用户名并对机器进行 DoS 攻击。
答案2
确认您没有将 executeinMTA 设置为 true。您可以在网站的 asp 设置中验证这一点。