我已经设置了 Cerberus FTP 服务器。默认情况下,Cerberus FTP 服务在系统帐户下运行。此外,我还有一些作为计划任务运行的控制台应用程序。它们在具有“以批处理作业登录”权限的专用“实用程序”用户帐户下运行。这些控制台应用程序获取上传的 FTP 文件,对其进行处理,然后将其移动到某个专用的存档文件夹。
问题是,我的控制台应用程序在尝试访问上传的文件时抛出了安全异常。我尝试为我的“Utilities”帐户授予对 ftproot 文件夹的完全控制权限,并且我已选中“用可从此对象继承的权限替换所有子对象权限”复选框,但它仅影响当前文件。当上传新文件时,我的“Utilities”帐户再次无法访问它们。
我尝试了另一种方法,将 Cerberus FTP 服务放在“Utilities”帐户下。然后,我还需要授予“Utilities”帐户对 ProgramData 中 Cerberus Data 文件夹的权限。仍然没有运气 - 执行此操作后,Cerberus 内部 SOAP Web 服务停止工作(尽管其他一切似乎都正常工作)。我需要该 SOAP 服务可用,因此在“Utilities”帐户下运行 Cerberus FTP 似乎不是一个选择。除非我找到答案,否则我还需要为该“Utilities”帐户设置什么才能阻止 Cerberus 抱怨。
我猜测,Cerberus 正在将文件上传到某个临时文件夹,因此这些文件会从该文件夹获得权限,并且即使移动到 ftproot 后仍保留相同的权限。
对此的正确解决方案是什么?即授予 Cerberus FTP 服务器和“实用程序”帐户访问 ftproot 文件夹内容所需的最低权限?
更多信息:
按照这里的人们的建议进行一些调查后,我可以转储 icacls 的输出。
以下是上传文件所在文件夹的输出:
C:\ftproot>icacls C:\ftproot\UserFolders\56
C:\ftproot\UserFolders\56 martinpc\Utilities:(I)(OI)(CI)(F)
BUILTIN\Administrators:(I)(F)
BUILTIN\Administrators:(I)(OI)(CI)(IO)(F)
NT AUTHORITY\SYSTEM:(I)(F)
NT AUTHORITY\SYSTEM:(I)(OI)(CI)(IO)(F)
BUILTIN\Users:(I)(OI)(CI)(RX)
NT AUTHORITY\Authenticated Users:(I)(M)
NT AUTHORITY\Authenticated Users:(I)(OI)(CI)(IO)(M)
Successfully processed 1 files; Failed processing 0 files
一切看起来都很好,martinpc\Utilities 具有 (I)(OI)(CI)(F) 权限,所以该用户应该有权访问所有内部文件夹和文件,对吗?
但是当我查看 martinpc\Utilities 访问时抛出“访问被拒绝”的文件时,我看到的是以下内容:
C:\ftproot>icacls C:\ftproot\UserFolders\56\uploaded.zip
C:\ftproot\UserFolders\56\uploaded.zip BUILTIN\Administrators:(I)(F)
NT AUTHORITY\SYSTEM:(I)(F)
BUILTIN\IIS_IUSRS:(I)(S,RD)
martinpc\martin:(I)(F)
martinpc\SQLServerReportServerUser$MARTINPC$MSRS10_50.MSSQLSERVER:(I)(RX,D,WD,AD)
NT SERVICE\ReportServer$SQLEXPRESS12:(I)(RX,WD,AD)
Successfully processed 1 files; Failed processing 0 files
该文件不再属于 martinpc\Utilities 用户。如果您对 ReportServer 和 IIS_IUSRS 感兴趣,我的开发 PC 上有 IIS 和 SQL Reporting 服务。但有趣的是,这两个用户不知何故都自动获得了该文件的权限,而我的专用 martinpc\Utilities 用户却没有。
然后我开始追踪这些上传的文件来自哪里。我启动了 Sysinternals Procmon,以下是我在上传文件时看到的 CerberusGUI.exe 进程。首先是对路径 C:\Windows\Temp\unq26B7.tmp 的 CreateFile 调用,然后在上传完成后,我看到 SetRenameInformationFile ReplaceIfExists: False FileName: C:\ftproot\UserFolders\56\uploaded.zip
现在我尝试查看 C:\Windows\Temp 具有什么 ACL:
C:\ftproot>icacls C:\Windows\Temp
C:\Windows\Temp CREATOR OWNER:(OI)(CI)(IO)(F)
NT AUTHORITY\SYSTEM:(OI)(CI)(F)
BUILTIN\Administrators:(OI)(CI)(F)
BUILTIN\Users:(CI)(S,WD,AD,X)
BUILTIN\IIS_IUSRS:(OI)(CI)(S,RD)
martinpc\martin:(OI)(CI)(F)
martinpc\SQLServerReportServerUser$MARTINPC$MSRS10_50.MSSQLSERVER:(OI)(CI)(RX,D,WD,AD)
NT SERVICE\ReportServer$SQLEXPRESS12:(OI)(CI)(RX,WD,AD)
Successfully processed 1 files; Failed processing 0 files
也许该临时文件正在从该 Temp 文件夹继承权限,并且当 Cerberus 调用 SetRenameInformationFile 时,尽管该文件已被移动/重命名到 C:\ftproot 文件夹,但它仍然保留了大多数旧的继承权限?
如果我授予 martinpc\Utilities 用户对 C:\Windows\Temp 的权限,这样就足够了吗?或者也许有更好的解决方案?
答案1
文件夹上的 ACL 具有一些属性,这些属性决定了每个权限将如何被每个子项继承。通过使用 Powershell 中的 icalcs 列出文件夹的 ACL,您将看到类似以下内容:
icacls foldername
NT-AUTORITÄT\SYSTEM:(I)(OI)(CI)(IO)(F) ...
- (I)表示“这是从其父级文件夹继承的”
- (OI)表示“此权限将被继承给子文件”
- (CI)表示“此权限将被继承给子文件夹”
- (F)表示“完全访问权限是以这种方式处理的权限”
您必须检查文件夹是否启用了 (OI) (CI)。您可以使用 icalcs 进行设置,查看“icacls /?”,并查看本文:http://support.microsoft.com/kb/318754/en-us