让 Docker 运行在非 Root 环境

1,806 阅读1分钟

Docker 的容器默认是以 Root 权限来运行的,我们可以直接在容器内部安装和执行程序,可以绑定 1024 以下端口。

设想一下,如果一个人不管以何种恶意的方式进入了 Docker 容器,那么他便自动获得 Root

 权限,也就是说他可以随意安装运行脚本或程序,那我们产品的运行环境便非常危险。

最小权限原则(PoLP)

在开始之前,我们先介绍一个原则:PoLP(Principle of least privilege)

**在计算机科学以及其它领域中,最小权限原则是要求计算环境中的特定抽象层的每个模组如进程、用户或者计算机程序只能访问当下所必需的信息或者资源。 赋予每一个合法动作最小的权限,就是为了保护数据以及功能避免受到错误或者恶意行为的破坏。
**

依据以上原则,我们可以让镜像在 Build 时指定用户和权限,下面拿 Node 程序来举个例子

FROM node:14.15.0-alpine3.11

RUN apk update
RUN apk add vim

// 创建 app 用户并加到组中
RUN addgroup -S app && adduser -S app app
//User 命令指定 app 为容器的运行时用户,以后的 Run CMD 都是用 app 来运行
USER app

// 指定工作路径
WORKDIR /home/app/project

ENV NPM_CONFIG_PREFIX=/home/app/.npm-global
ENV PATH=$PATH:/home/app/.npm-global/bin

// copy 时也要指定用户,不然 npm isntall 时会报错
COPY --chown=app:app package.json .
RUN npm install --verbose
COPY --chown=app:app . .

CMD npm start