在dockerfile中使用非root用户
16、在dockerfile中使用非root用户
前言:
当在运行容器时,默认都是以root的账号进行启动的,但这个root账号和宿主机的root账号的权限
是不一样的,会受到capabilities的限制。那如果是非特权的容器,使用容器的root账号启动是否
安全的呢。
(1) 启动一个 centos-test 的容器
# docker run -itd --name centos_test -v /etc:/mnt centos:7 bash
(2) 尝试修改 /mnt/shadow 文件,这个就是宿主机的 /etc/shadow 文件
# docker exec -it centos_test bash -c "echo hello >> /mnt/shadow"
(3) 在宿主机上,查看 /etc/shadow ,主机的文件被修改了
16.1 使用"docker run"命令方式指定容器内运行非root用户,增强容器的安全性
1、参数说明
-u, --user string Username or UID (format: <name|uid>[:<group|gid>])
-u, --user string 用户名或UID(格式:<名称|uid>[:<组别|gid>])。
2、示例
# docker run -u 1001:1001 -itd --name centos_test -v /etc:/mnt centos:7 bash
# docker exec -it centos_test bash
提示: 由于容器中 /etc/passwd 文件中没有 uid 为 1001 的用户,所以 shell 终端显示为"bash-4.2$"(没有用户家目录)。
16.2 在Dockerfile中指定容器内运行非root用户,增强容器的安全性
Dockerfile中使用新建用户,不需要启动容器时增加 -u
1、以下是一个示例Dockerfile,使用一个名为“myuser”的非root用户来运行容器。
FROM ubuntu:18.04 # 创建 myuser 用户 RUN groupadd -g 1002 myuser && \ useradd -u 1002 -g 1002 -m -s /usr/sbin/nologin myuser # 切换到 myuser 用户 USER myuser # 运行命令 CMD ["/bin/bash"]
在这个例子中,我们首先创建一个名为“myuser”的用户,并使用 USER 命令切换到该用户。然后我们运行一个简单的命令来测试容器是否能够成功运行。
注意:
(1) 使用非root用户需要确保该用户具有执行容器中任何必要操作的权限。
(2) RUN 参数放到 USER 参数下会受到普通用户权限的限制(COPY、ADD 参数类似于 docker 基础命令中的 cp,将宿主机目录下的文件拷贝到镜像,不受影响)。
2、示例
# docker build -t ubuntu_image .
# docker run -itd --name ubuntu_test -v /root/ubuntu_volume:/home/myuser/ubuntu_volume ubuntu_image
注意: 挂卷时需要在宿主机上手动创建目录并赋予和容器用户一样的 属主:属组。
16.3 补充
我们在使用官方的容器镜像启动容器后进入容器会发现容器的用户是 root,而运行应用的的进程是普通用户,这种方式也能
提高应用的安全性,我通过如下实验来演示该方式。
1、项目目录
# mkdir -p /root/compose # cd /root/compose # ls Dockerfile run.sh
2、Dockerfile 文件
FROM ubuntu:18.04 COPY ./run.sh /root/ CMD ["/bin/bash","/root/run.sh"]
3、run.sh 文件
#!/bin/bash useradd -M mysql chown -R mysql.mysql /var/lib/mysql/ su - mysql -c "sleep 10000"
4、构建镜像
# docker build -t ubuntu_image .
5、创建容器
# docker run -itd --name ubuntu_test -v /root/mysql/data:/var/lib/mysql ubuntu_image
6、查看