You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何禁止用户附着Shell到Node Alpine版Docker容器?

阻止Docker容器被附着Shell的解决方案

你之前修改root用户默认Shell的方法无效,是因为docker exec会直接执行你指定的命令(比如sh),完全绕过用户的默认Shell配置,所以这个方法起不到阻止作用。下面是几种可行的解决办法:

方法1:构建镜像时移除所有交互式Shell

直接删除容器内的sh、bash等交互式Shell文件,这样用户执行docker exec时找不到对应的命令,无法进入Shell:

FROM node:18.12-alpine

# 删除容器内的交互式Shell
RUN rm -f /bin/sh /bin/bash

WORKDIR /app

COPY ./package.json ./
COPY ./package-lock.json ./
RUN npm ci
COPY ./ ./

CMD [ "npm", "start"]

注意:如果你的npm start或相关脚本依赖Shell执行命令,这个方法可能导致应用无法运行,此时需要改用其他方法。

方法2:以非root用户运行+移除Shell(增强安全)

创建一个无权限的非root用户,并切换到该用户运行应用,同时移除Shell,双重限制:

FROM node:18.12-alpine

# 创建非root用户组和用户
RUN addgroup -S appgroup && adduser -S appuser -G appgroup

# 移除交互式Shell
RUN rm -f /bin/sh /bin/bash

WORKDIR /app

COPY ./package.json ./
COPY ./package-lock.json ./
RUN npm ci
COPY ./ ./

# 切换到非root用户运行应用
USER appuser

CMD [ "npm", "start"]

即使尝试通过docker exec执行命令,非root用户既没有权限修改系统文件,也找不到可用的Shell。

方法3:启动容器时添加安全限制参数

如果无法修改镜像(比如依赖第三方镜像),可以在启动容器时添加安全参数,阻止权限提升和不必要的能力:

docker run --security-opt=no-new-privileges --cap-drop=ALL your-image-name

--security-opt=no-new-privileges会阻止进程提升权限,--cap-drop=ALL会移除所有Linux能力,进一步限制可执行的操作。如果应用需要某些特定能力,可以通过--cap-add添加必要的项(比如网络相关能力)。

内容的提问来源于stack exchange,提问作者Jantoma21

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 09:55:45