如何禁止用户附着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
相关产品推荐
相关产品推荐

