Назад | Перейти на главную страницу

Проблемы наследования Windows ACL для FTP-сервера и автоматизированных средств

Я настроил FTP-сервер Cerberus. По умолчанию служба Cerberus FTP работает под системной учетной записью. Также у меня есть несколько консольных приложений, которые запускаются как запланированные задачи. Они работают под специальной учетной записью пользователя «Утилиты», которая имеет разрешение «Входить в качестве пакетного задания». Эти консольные приложения принимают загруженные файлы FTP, обрабатывают их, а затем перемещают в какую-нибудь специальную папку архива.

Проблема в том, что мои консольные приложения выдают исключения безопасности при попытке доступа к загруженным файлам. Я попытался предоставить права полного доступа к папке ftproot для моей учетной записи «Utilities», и я установил флажок «Заменить все разрешения дочерних объектов наследуемыми разрешениями от этого объекта», но это влияет только на текущие файлы. Когда новые файлы загружаются, они снова не доступны для моей учетной записи "Утилиты".

Я попытался пойти другим путем и поместить службу Cerberus FTP в учетную запись «Утилиты». Затем мне также нужно было предоставить разрешения учетной записи «Utilities» для папки Cerberus Data в ProgramData. По-прежнему не повезло - после этой операции внутренняя веб-служба SOAP Cerberus перестала работать (хотя все остальное вроде работает). Мне нужно, чтобы эта служба SOAP была доступна, поэтому запуск Cerberus FTP под учетной записью «Утилиты» не вариант. Если я не узнаю, что еще мне нужно настроить для этой учетной записи «Утилиты», чтобы Цербер не жаловался.

Я предполагаю, что Cerberus загружает файлы в какую-то временную папку, и поэтому эти файлы получают разрешения из этой папки и сохраняют те же разрешения даже после перемещения в ftproot.

Что было бы правильным решением для этого, которое предоставило бы FTP-серверу Cerberus и учетной записи «Утилиты» минимальные необходимые разрешения для доступа к содержимому папки 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, у меня есть службы отчетов IIS и SQL на моем компьютере для разработки. Но что интересно, каким-то образом оба этих пользователя получают автоматические разрешения для этого файла, в то время как мой специальный пользователь martinpc \ Utilities - нет.

Затем я начал отслеживать, откуда берутся эти загруженные файлы. Я запустил Sysinternals Procmon, и вот что я увидел для процесса CerberusGUI.exe в тот момент, когда я загружал файл. Сначала был вызов CreateFile для пути C: \ Windows \ Temp \ unq26B7.tmp А затем после завершения загрузки я увидел SetRenameInformationFile ReplaceIfExists: False FileName: C: \ ftproot \ UserFolders \ 56 \ uploaded.zip

Теперь я попытался посмотреть, какой ACL есть у C: \ Windows \ Temp:

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, этого будет достаточно? А может есть решение получше?

Списки ACL для папок имеют некоторые свойства, которые определяют, как каждое разрешение будет наследоваться каждым дочерним элементом. Используя icalcs из Powershell для вывода списков 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