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