docker本身是轻量级容器,和宿主机公用一个内核,默认情况下容器内部的uid和宿主机uid是相互映射的,这样就造成,如果在容器使用root账号,那么相当于同时拥有了宿主机的权限,显然这是不安全的
如果要解决这个隐患,有两种方法,重点将第一种:

  1. docker借助于linux的user namepsace提供了用户映射,默认情况下是关闭的如果要开启需要编辑文件/etc/docker/daemon.json,添加 userns-remap属性,默认情况下可以指定default,这个时候会在/etc/subuid/etc/subgid生成dockremap的namespace,当然也可以自己指定一个自己的,举例:

    {
      "userns-remap": "www"
    }
    

    查看subuid和subgid对应的虚拟id为:www:100000:65536
    这个表示如果www映射了从100000开始到165536这些用户
    接下来,我们启动一个容器,以php-fpm为例,默认php-fpm在容器内部,查看用户的id

    [root@zhaoxiaohe ~]# docker exec -it c55356ca815a /bin/bash
    root@c55356ca815a:/var/www# id
    uid=0(root) gid=0(root) groups=0(root)

    当我们生成一个文件,此时在容器内部显示的root权限

    root@c55356ca815a:/var/www/laradock/wwwroot# echo test > docker.test
    root@c55356ca815a:/var/www/laradock/wwwroot# ls -l
    total 8
    drwxr-xr-x 2 www-data www-data   25 Aug 21 09:15 default
    -rw-r--r-- 1 root     root        5 Sep 12 02:32 docker.test
    drwxr-xr-x 6 www-data www-data 4096 Sep 12 02:28 wordpress

    但是在宿主机的话会显示,是一个映射出来的uid

    [root@zhaoxiaohe wwwroot]# ls -l
    total 8
    drwxr-xr-x 2 101000 101000   25 Aug 21 17:15 default
    -rw-r--r-- 1 100000 100000    5 Sep 12 10:32 docker.test
    drwxr-xr-x 6 101000 101000 4096 Sep 12 10:28 wordpress
    

    这样就防止了容器和宿主机一对一的用户相互映射
    当有的容器需要使用的root权限的是,需要在docker-compose.yml设置userns_mode: "host"

  2. 容器启动的时候指定user, 格式为 docker --user uid<:gid>
Categories: Dockerlinux

0 Comments

发表评论

电子邮件地址不会被公开。 必填项已用*标注