IUSR 与 ADMINISTRATOR 权限障碍

IUSR 与 ADMINISTRATOR 权限障碍

IIS6 启动的应用程序(由于 HTTP 请求)无法初始化 dll。如果我在本地登录时双击以管理员身份启动它,则一切正常。

该应用程序通过名为 cryptlib 的第三方 DLL 使用 TLS 加密。 http://www.coastrd.com/smtps/cryptlib 这本身不应该有什么大问题,因为我的大多数 CGI 应用程序都使用 MySQL/zlib/... 等 dll,没有任何问题。在这种情况下(可能是由于创建 SSL/TLS 会话的性质),如果以管理员身份双击启动,应用程序运行良好,但当通过 IIS 启动时,由于传入请求而无法运行。IIS 使用帐户“Internet 来宾帐户...(... IUSR)”(我们假设)从简单的网页 HTTP POST 请求执行 CGI 应用程序。

我尝试过将应用程序、dll 和文件夹的完全控制权交给 IUSR 帐户,但无济于事。接下来,我打开 ProcMon 并寻找“访问被拒绝”的结果。我唯一能找到的结果是 CreateFile 所需访问:读取属性、删除、同步、处置:打开、选项:同步 IO 非警报,C:\WINDOWS\Debug\UserMode\ChkAcc.log

这很令人费解,因为我的应用程序没有写入该日志文件(我认为 IIS 是这样的,那么为什么会出现问题?)

接下来,我将成功启动 Administrator 时的 ProcMon 输出与 IUSR 启动时的 ProcMon 输出进行了比较,发现失败的启动中没有出现“ReadFile”操作。我没有收到 ACCESS DENIED 错误,只是没有发生该操作。

cl32.dll 的后续操作顺序应为:QueryOpen CreateFile CreateFileMapping QueryStandardInformationFile CreateFileMapping CreateFileMapping CloseFile Load Image ReadFile

我假设这就是 DLL 加载到内存中以供使用的地方。

而不是 ReadFile 操作(在失败的启动中),而是:RegOpenKey HKU\S-1-5-21-4122272316-1273673783-4216733774-1003 NAME NOT FOUND

它听起来有点像这里描述的“绕过遍历检查”问题 http://forums.iis.net/t/1153139.aspx http://technet.microsoft.com/en-us/library/cc739389(WS.10).aspx 但这并不能解决问题。

此时,我们已经远远超出了我对用户帐户和权限的了解范围。有一点很清楚,这是一个权限问题。问题是,哪个权限?

添加

将 ISUR 添加到管理员:1. 右键单击​​桌面上的“我的电脑”,然后单击“管理”。2. 当“计算机管理”窗口打开时,展开“本地用户和组”3. 选择“组”,然后在右侧窗格中双击“管理员”。4. 单击“添加”按钮5. 单击“高级”,然后单击“立即查找”,并选择“IUSR”6. 单击“确定”。7. 重新启动 IIS

这并没有解决问题。我找到了 Filemon v7.3,发现是 IUSR

er.exe:2240 OPEN C:\WINDOWS\system32\USERENV.dll SUCCESS Options: Open Access: 00100021  
er.exe:2240 CLOSE C:\WINDOWS\system32\USERENV.dll SUCCESS  
er.exe:2240 OPEN C:\WINDOWS\debug\UserMode\ChkAcc.log ACCESS DENIED MY-SERVER\IUSR_MY-SERVER  
er.exe:2240 CREATE C:\WINDOWS\debug\UserMode\ChkAcc.log ACCESS DENIED MY-SERVER\IUSR_MY-SERVER 

此时,我会尽力猜测这可能是什么样的许可:)

添加

我更改了文件 ChkAcc.log 和文件夹 UserMode 的权限,还检查了高级权限,发现应用程序和 Dll 被拒绝。我将它们都删除了。我重新启动了 IIS,甚至重启了机器。还是没用。

我想知道“拒绝访问”是否确实是问题所在。我重写了应用程序以在该文件夹中创建并写入文件,并且成功了:

OPEN            C:\WINDOWS\debug\UserMode\ChkAcc.txt    SUCCESS Options: OpenIf  Access: 00120196
SET INFORMATION     C:\WINDOWS\debug\UserMode\ChkAcc.txt    SUCCESS Length: 0
SET INFORMATION     C:\WINDOWS\debug\UserMode\ChkAcc.txt    SUCCESS Length: 0
WRITE           C:\WINDOWS\debug\UserMode\ChkAcc.txt    SUCCESS Offset: 0 Length: 41
WRITE           C:\WINDOWS\debug\UserMode\ChkAcc.txt    SUCCESS Offset: 41 Length: 2
SET INFORMATION     C:\WINDOWS\debug\UserMode\ChkAcc.txt    SUCCESS Length: 43
SET INFORMATION     C:\WINDOWS\debug\UserMode\ChkAcc.txt    SUCCESS Length: 43
CLOSE           C:\WINDOWS\debug\UserMode\ChkAcc.txt    SUCCESS 

这让我怀疑文件夹权限根本不是问题,而是 DLL 由于某种原因无法初始化。

有没有办法让 IUSR 拥有与 ADMIN 相同的权限?那么也许我可以逐个删除它们。也许我甚至可以创建具有 ADMIN 权限的第二个用户,并让 IIS 使用该用户而不是 IUSR 来处理传入的 CGI 请求?

显然,将 IUSR 添加到 ADMIN 组与以 ADMIN 身份运行应用程序不同。

添加

实际上,问题是由于 dll 在启动时执行各种健全性检查测试,包括读取文件的能力。为此,它会尝试读取用户的主目录(或按 Windows 术语为用户的配置文件目录)

在 Windows 2003 Server 上测试时,我发现

独立专家

CSIDL_APPDATA = C:\WINDOWS\system32\config\systemprofile\应用程序数据

行政人员

CSIDL_APPDATA = C:\Documents and Settings\Administrator.MY-SERVER\应用程序数据

我怀疑 cgi 进程被拒绝访问任何 system32 文件夹。这是我预料到的行为,直到 IUSR 被添加到管理员,然后我才希望它能工作……但它没有。解决方案是重写 dll,但我仍然对此感到困惑

答案1

请注意以下两行:

er.exe:2240 OPEN C:\WINDOWS\debug\UserMode\ChkAcc.log ACCESS DENIED MY-SERVER\IUSR_MY-SERVER  
er.exe:2240 CREATE C:\WINDOWS\debug\UserMode\ChkAcc.log ACCESS DENIED MY-SERVER\IUSR_MY-SERVER 

第一行可能是应用程序检查它是否存在,而第二行则用于“如果不存在则创建文件”的情况。我要寻找的是 IUSR 帐户不属于“USERS”组,而是属于“GUESTS”,并且通常来宾的权限甚至比“USERS”还要低。您可能希望确保 IUSR 帐户能够遍历其上方的文件夹。尝试授予 IUSR 帐户明确的权限以遍历文件夹,并授予“UserMode”文件夹的“创建文件”权限(但“仅限此文件夹”)。

最后,可能存在明确的“拒绝”访客权限,这可能会阻止您访问文件夹。这些都是我要检查的内容。

相关内容