Проблемы с правами доступа к файлам контейнеров Windows Docker

Хост Windows Server 2016, запускающий Docker EE через поставщика MSFTdocker по умолчанию.

Версия докера 17.06.2-ee-5, сборка 508bb92

docker-compose версии 1.17.1, сборка 6d101fb0

У меня есть контейнер Windows на основе microsoft/windowsservercore:latest, и я пытаюсь настроить образ для сервера Bamboo. Во время создания плана сборки сервер генерирует шифр для связи между Bamboo и Bitbucket. В работающем контейнере генерация папки/файла шифра завершается со следующей ошибкой:

java.nio.file.AccessDeniedException: C:\bamboo-home\xml-data\configuration\cipher\cipher.key_0

Я пробовал с томом C:\bamboo-home, подключенным к моему хосту Windows и полностью содержащимся внутри контейнера. Оба раза одна и та же ошибка.

Контейнеры Windows запускаются с учетной записью администратора с именем «containeradministrator»; это имеет место как в образе по умолчанию, так и при использовании точки входа, как показано ниже.

Стандартный запуск изображения:

PS C:\> docker run -it microsoft/windowsservercore:latest powershell
Windows PowerShell Copyright (C) 2016 Microsoft Corporation. All
rights reserved.

PS C:\> whoami 
user manager\containeradministrator

И на пользовательском образе для проверки точки входа:

PS C:\test> docker-compose build
Building testentrypoint
Step 1/2 : FROM microsoft/windowsservercore:latest
---> 2cddde20d95d
Step 2/2 : ENTRYPOINT whoami
---> Running in 7fe31f02e45f
---> 60822e1907f1
Removing intermediate container 7fe31f02e45f
Successfully built 60822e1907f1
Successfully tagged test/entrypoint:latest
PS C:\test> docker-compose up
Creating network "test_default" with the default driver
Creating test_testentrypoint_1 ...
Creating test_testentrypoint_1 ... done
Attaching to test_testentrypoint_1
testentrypoint_1 | user manager\containeradministrator
test_testentrypoint_1 exited with code 0

Насколько я могу судить, этот пользователь является псевдонимом администратора, хотя, что интересно, он не отображается в net user как это имя:

PS C:\> net user

User accounts for \\

-------------------------------------------------------------------------------
Administrator            DefaultAccount           Guest
The command completed with one or more errors.

Так что это потенциально проблема, но независимо от того, что я могу сказать, у пользователя есть полные права администратора:

PS C:\> $user = [Security.Principal.WindowsIdentity]::GetCurrent()
PS C:\> $user

AuthenticationType : Negotiate
ImpersonationLevel : None
IsAuthenticated    : True
IsGuest            : False
IsSystem           : False
IsAnonymous        : False
Name               : User Manager\ContainerAdministrator
Owner              : S-1-5-93-2-1
User               : S-1-5-93-2-1
Groups             : {S-1-1-0, S-1-5-32-545, S-1-5-6, S-1-2-1...}
Token              : 3052
AccessToken        : Microsoft.Win32.SafeHandles.SafeAccessTokenHandle
UserClaims         : {http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name: User Manager\ContainerAdministrator, http://schemas.microsoft.com/ws/2008/06/identity/claims/primarysid: S-1-5-93-2-1, http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid:
                     S-1-1-0, http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid: S-1-5-32-545...}
DeviceClaims       : {}
Claims             : {http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name: User Manager\ContainerAdministrator, http://schemas.microsoft.com/ws/2008/06/identity/claims/primarysid: S-1-5-93-2-1, http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid:
                     S-1-1-0, http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid: S-1-5-32-545...}
Actor              :
BootstrapContext   :
Label              :
NameClaimType      : http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name
RoleClaimType      : http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid

PS C:\> (New-Object Security.Principal.WindowsPrincipal $user).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
True

Итак, я попробовал следующее:

  1. Выполните шаг сборки в контейнере, который задает разрешения для папки «Все — полный доступ».

  2. Запустите скрипт вручную в работающем контейнере при запуске, который делает то же самое.

  3. Подключитесь к контейнеру во время работы и вручную запустите powershell, чтобы сделать то же самое.

Каждый раз перед попыткой сгенерировать файл шифра разрешения выглядят так:

PS C:\> Get-ACL C:\bamboo-home\xml-data\configuration\ | fl

Path   : Microsoft.PowerShell.Core\FileSystem::C:\bamboo-home\xml-data\configuration\
Owner  : User Manager\ContainerAdministrator
Group  : User Manager\ContainerAdministrator
Access : Everyone Allow  FullControl
         NT AUTHORITY\SYSTEM Allow  FullControl
         BUILTIN\Administrators Allow  FullControl
         S-1-5-21-2465844383-291681238-1546083700-500 Allow  FullControl
Audit  :
Sddl   : O:S-1-5-93-2-1G:S-1-5-93-2-1D:AI(A;OICIID;FA;;;WD)(A;OICIID;FA;;;SY)(A;OICIID;FA;;;BA)(A;OICIID;FA;;;S-1-5-21-2465844383-291681238-1546083700-500)

И вышеуказанная ошибка возникает после попытки генерации, и разрешения меняются на:

PS C:\> Get-ACL C:\bamboo-home\xml-data\configuration\ | fl

Path   : Microsoft.PowerShell.Core\FileSystem::C:\bamboo-home\xml-data\configuration\
Owner  : User Manager\ContainerAdministrator
Group  : User Manager\ContainerAdministrator
Access : Everyone Allow  FullControl
Audit  :
Sddl   : O:S-1-5-93-2-1G:S-1-5-93-2-1D:AI(A;OICI;FA;;;WD)

Почему учетная запись по умолчанию (предположительно администратор с именем containeradministrator) теряет доступ к этому каталогу, когда кажется, что он является владельцем? И почему он не может создать файл (или папку, если на то пошло) в первую очередь, поскольку в обоих случаях у всех должен быть полный доступ?


comment
Можете ли вы воспроизвести проблему только с библиотеками Microsoft. Вы продолжаете говорить о процессе generation и впоследствии об изменениях в файловой системе, которая является внешним процессом и, кажется, указывает на то, что это curlpit для этого поведения, а не среда выполнения контейнера.   -  person Gregory Suvalian    schedule 15.11.2017
comment
Эй, Грег, определенно не возражаю. Проблема в том, что внешний процесс должен (как часть всех) иметь доступ к этой папке для чтения/записи по своему усмотрению, и кажется, что запись работает не так, как задумано. Я не знаю, будет ли отличный способ воссоздать это, используя только библиотеки Microsoft.   -  person jski    schedule 15.11.2017
comment
Этот процесс изменяет разрешения, верно? Так что именно вы спрашиваете?   -  person Gregory Suvalian    schedule 15.11.2017
comment
Файл cipher.key_0, который должен создать процесс, не может быть создан из-за проблем с разрешениями в папке. Я хочу знать, почему он не может писать в папку ни при каких обстоятельствах, которые я пробовал внутри этого контейнера.   -  person jski    schedule 15.11.2017
comment
Но эти проблемы с разрешениями вызваны тем, что сторонние утилиты изменяют разрешения, верно? Также проверьте, что InheritanceFlags для всех после смены папки, вы должны сделать fl * для него   -  person Gregory Suvalian    schedule 15.11.2017
comment
Таким образом, для (Get-ACL) ничего не возвращается. Доступ к самой папке /cipher. Папка, в которой он создан, /configuration, имеет следующее и не меняется: PS C:\> (Get-ACL C:\bamboo-home\xml-data\configuration\).Access FileSystemRights : FullControl AccessControlType : Allow IdentityReference : Everyone IsInherited : FalseInheritanceFlags : ContainerInherit, ObjectInherit PropagationFlags : None Таким образом, внутри создается новая папка/файл без каких-либо правил доступа.   -  person jski    schedule 15.11.2017
comment
Что вы имеете в виду, когда вы выполняете Get-ACL для /cipher, ничего не возвращается?   -  person Gregory Suvalian    schedule 16.11.2017
comment
Возвращаемый набор равен нулю, т.е. ничего не вернулось. В любом случае, я нашел решение своей проблемы (хотя до сих пор неясно, почему это произошло), поэтому я опубликую как ответ.   -  person jski    schedule 16.11.2017


Ответы (1)


Я не определил проблему между разрешениями хоста/контейнера, но то, как я поднял контейнер, позволило этой проблеме произойти. Изменив процесс установки, я смог это исправить.

Первоначальное создание (которое не дало разрешения на созданную папку):

  1. Создайте пустую папку на хост-компьютере.
  2. Связать как том с композицией во внутреннюю папку контейнера (в данном случае все C:\bamboo-home). Это папка, в которую Bamboo поместит всю свою конфигурацию/рабочее пространство.
  3. Установил продукт внутри контейнера, все работает кроме сбоя зашифрованной папки. Не замечал проблемы до этого шага.

Новое творение (работает правильно):

  1. Создайте пустую папку на хост-компьютере.
  2. Связать как том с композицией во внутреннюю папку контейнера (в данном случае C:\empty). Это НЕ связано с C:\bamboo-home, который будет создан внутри работающего контейнера по мере необходимости.
  3. Установите продукт внутри контейнера. После завершения скопируйте все файлы из папки контейнера в новую созданную пустую папку. Таким образом, разрешения устанавливаются согласованным образом внутри самого контейнера, и проблемы, которые были раньше, были смягчены.
person jski    schedule 16.11.2017