docker非root绑定装载权限,WITH --userns-remap

时间:2016-08-20 20:46:11

标签: linux ubuntu docker

all:试图让bind-mount权限正常工作。

我的目标是将卷装入容器中,以便:

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

从安全角度来看,我们希望避免在主机上具有root权限的容器 - 这是一种明智的 - 这是(b)的要求。要求a,c和d来自将容器日志发送到文件系统上的绑定挂载目录的愿望,因此它们可以被splunk消化。此配置是/将成为登录kubernetes的首选方法(有关详细信息,请参阅here)。

有没有人有办法获得上述所有4项要求?

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

DOCKER_OPTS="--userns-remap=1000:1000"

启动容器高山,以root身份运行。观察foo.txt的权限是没人的。我expec他们是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

退出容器,查看文件。观察它们是1000:1000拥有,所以用户重新映射已经搞砸了它们:

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

更复杂的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

我知道this similar question,但它没有提供答案。事实上,只需使用--userns-remap = 1000:1000即可生成合适的/ etc / subuid配置,无需任何手动编辑,但仍无法使用绑定装载。

我也知道this answerthis one too,但我似乎与两者都提供了匹配,但没有合适的结果。

我按照here的说明操作,我实现了一个满足除上述(b)之外的所有要求的设置 - 它在我不使用userns-remap时效果很好

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

- userns-remap = 1000:1000

然后整件事停止工作,我所做的一切似乎都没有用。绑定安装的卷似乎由nobody拥有。我尝试了以下几件事,其中没有任何影响:

  1. 将Z选项添加到卷映射的末尾
  2. 在主机中运行此命令:' chcon -Rt svirt_sandbox_file_t / path / to / volume' (来自here
  3. 我的猜测是,由于我同时告诉docker将容器root用户映射到我的UID(1000),并且还显式创建具有相同UID:GUID的另一个用户,因此出现了问题。那个应该没问题 - 在容器中,root是0:0,我也创建了UID:GUI 1000:1000。创建文件时,root和root都应创建所有权为1000:1000的文件。当以非root用户和root用户身份运行映像时,实际上就是这种情况。

    尝试写入装入装订的卷时,一切都失败了。

    这是我的设置:

    Docker 1.12 Ubuntu 14.04 Unprivileged 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
    

0 个答案:

没有答案