docker非root用户绑定安装权限,带有--userns-remap

use*_*772 6 linux ubuntu docker

全部:尝试使绑定​​安装权限正常运行。

我的目标是在容器中绑定装入卷,以便:

  • (a)容器未以root用户身份运行入口点
  • (b)docker-daemon配置了--userns-remap,因此容器在主机上没有根
  • (c)我可以使用容器绑定安装和读写普通用户可读写的卷(主机上的UID:GID 1000)
  • (d)创建文件时,它们都具有我的常规主机用户的权限,而不是root或没有权限。

从安全角度来看,我们要避免容器在主机上具有根目录(这很容易理解),这是要求(b)。需求a,c和d来自将容器日志发送到文件系统上绑定安装的目录的需求,因此它们可以被splunk消化。这种配置是/将是在kubernetes上进行日志记录的首选方法(有关此内容的更多信息,请参见 此处)。

有没有人能满足上述所有4个要求?

这是解决问题的最简单方法。使用--userns-remap运行Docker:

DOCKER_OPTS="--userns-remap=1000:1000"
Run Code Online (Sandbox Code Playgroud)

启动容器高山,以根用户身份运行它。观察foo.txt的权限是没有人。我认为它们是root或1000:1000,因为那就是文件系统上的内容:

dcowden@ubuntu:~/gitwork/file-perm-stuff$ docker run --rm -it -v /home/dcowden/gitwork/file-perm-stuff/testlogs:/logs alpine /bin/sh
/ # ls -ln /logs
total 0
-rw-rw-r--    1 65534    65534            0 Aug 20 19:08 foo.txt
/ # exit
Run Code Online (Sandbox Code Playgroud)

退出容器,然后查看文件。观察它们是1000:1000拥有的,因此userns remap将它们搞砸了:

dcowden@ubuntu:~/gitwork/file-perm-stuff$ ls -ln testlogs
total 0
-rw-rw-r-- 1 1000 1000 0 Aug 20 15:08 foo.txt
dcowden@ubuntu:~/gitwork/file-perm-stuff$ ls -ln .
total 8
-rw-rw-r-- 1 1000 1000  248 Aug 20 16:07 Dockerfile
drwxrwxr-x 2 1000 1000 4096 Aug 20 16:09 testlogs
Run Code Online (Sandbox Code Playgroud)

尝试创建非特权容器用户的更复杂的Dockerfile也会失败,尽管这很明显,因为它已经无法与root一起使用。它不像2中的动态解决方案那样复杂,但是仍然失败:

FROM alpine:3.4

ENV USER_ID=1000
ENV USER_NAME="appuser"
RUN addgroup -g $USER_ID -S $USER_NAME
RUN adduser -u $USER_ID -S -G $USER_NAME $USER_NAME

RUN mkdir /logs && chown $USER_NAME:$USER_NAME /logs

VOLUME /logs
WORKDIR /logs
USER $USER_NAME
Run Code Online (Sandbox Code Playgroud)

我知道这个类似的问题,但没有提供答案。实际上,仅使用--userns-remap = 1000:1000即可生成合适的/ etc / subuid配置,而无需进行任何手动编辑,但仍不适用于绑定安装。

我也知道这个答案,而这一个了,但我似乎已经匹配了用户ID为都表明,没有合适的结果。

我按照此处的说明进行操作,并且实现了除上述(b)之外的所有要求的设置-该设置在我不使用userns-remap时效果很好

当我将此行添加到DOCKER_OPTS(启用userns-remap)时:

--userns-remap = 1000:1000

然后整个事情停止了,我似乎什么也没做。绑定安装的卷似乎没有任何人拥有。我尝试了以下操作,但没有任何影响:

  1. 在卷映射的末尾添加Z选项
  2. 在主机中运行以下命令:'chcon -Rt svirt_sandbox_file_t / path / to / volume'(从此处开始

我的猜测是,由于我同时告诉docker将容器根用户映射到我的UID(1000),并且还明确创建了具有相同UID:GUID的另一个用户,因此出现了问题。那应该没问题-在容器中,根目录为0:0,我也创建了UID:GUI 1000:1000。创建文件时,超级用户和非超级用户都应创建所有权为1000:1000的文件。当同时以非超级用户和超级用户身份运行映像时,实际上就是这种情况。

只是尝试写入绑定安装的卷时一切都失败了。

这是我的设置:

Docker 1.12 Ubuntu 14.04主机上的未特权UID:GID:1000:1000

Docker信息:

Containers: 1
 Running: 0
 Paused: 0
 Stopped: 1
Images: 41
Server Version: 1.12.1
Storage Driver: aufs
 Root Dir: /var/lib/docker/100000.100000/aufs
 Backing Filesystem: extfs
 Dirs: 25
 Dirperm1 Supported: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: host null bridge overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: apparmor
Kernel Version: 3.13.0-83-generic
Operating System: Ubuntu 14.04.4 LTS
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 7.785 GiB
Name: ubuntu
ID: 2OO6:ESDJ:WGQ2:UGEQ:5ULF:MXNY:E5XC:WWWN:KJGJ:X2GT:I6VV:V2DN
Docker Root Dir: /var/lib/docker/100000.100000
Debug Mode (client): false
Debug Mode (server): false
Username: dcowden
Registry: https://index.docker.io/v1/
WARNING: No swap limit support
Insecure Registries:
 127.0.0.0/8
Run Code Online (Sandbox Code Playgroud)