基于Alpine:3.18.3的自定义TomCat镜像无法移除Shell访问求助
解决Alpine镜像中无法移除Root Shell访问权限的问题
问题原因
你遇到的问题核心有两点:
- Alpine Linux基于BusyBox,
chsh和usermod命令在修改登录shell时,可能因BusyBox的简化实现未正确生效;且这两个命令修改的是登录shell,而docker exec是直接调用shell二进制程序,不走登录流程,所以不受该设置限制。 - 只要镜像中存在
/bin/ash这类shell文件,即便修改了root的shell为/sbin/nologin,用户依然可以通过docker exec -it <容器ID> /bin/ash直接启动shell。
可行解决方案
方案1:直接修改/etc/passwd文件(确保登录shell生效)
跳过chsh/usermod,直接编辑Alpine的用户配置文件,替换root的shell字段:
RUN sed -i 's/root:x:0:0:root:\/root:\/bin\/ash/root:x:0:0:root:\/root:\/sbin\/nologin/' /etc/passwd
方案2:彻底移除shell二进制文件(禁止直接调用shell)
如果要完全阻止shell访问,可删除镜像中的shell文件,注意先确认Tomcat启动脚本不依赖shell:
RUN rm -f /bin/ash /bin/sh
更稳妥的方式是创建非root用户运行Tomcat,同时配置无shell:
# 创建非root用户并设置无shell RUN adduser -D tomcat -s /sbin/nologin # 切换用户运行Tomcat USER tomcat # 移除shell文件(可选,需确认Tomcat启动无需依赖) RUN rm -f /bin/ash /bin/sh
方案3:通过Docker运行参数限制
启动容器时,禁止分配TTY并固定启动命令,避免用户通过docker exec -it进入容器:
docker run -d --tty=false --entrypoint=/usr/local/tomcat/bin/catalina.sh your-tomcat-image run
建议结合前两种方案使用,避免镜像中残留的shell被绕过调用。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

