如果 Dockerfile 中没有指定 USER ,Docker 默认将会以超级用户 root 的身份运行容器,容器所属的命名空间(namespace)因此映射为 root 所有,这意味着容器有可能获取 Docker 宿主机的超级管理权限。不仅如此,以 root 用户身份运行容器,还扩大了攻击面,如果容器应用中存在安全漏洞,很容易造成权限提升。
在实践中,一般不需要容器拥有 root 权限。为了尽量降低安全威胁,创建专门的用户和用户组,在 Dockerfile 中使用 USER 指定用户,确保以最小权限的用户身份运行容器应用。
如果基础镜像中不包含专门的用户,那么就在 Dockerfile 中直接创建。下面就是一个这样的例子,它用到的基础镜像是 Ubuntu :
FROM ubuntu
RUN mkdir /app
RUN groupadd -r test && useradd -r -s /bin/false -g test test
WORKDIR /app
COPY ./app
RUN chown -R test:test /app
USER test
CMD node index.js
在上例中:
- 创建一个系统用户( -r 选项),没有密码、没有主目录且没有 shell;
- 将该用户添加到前面(使用 groupadd )创建的用户组;
- 最后一段参数设定了用户名以及所属的用户组。