我有一个有3个约束的Dockerfile:
1。)为了安全起见,Dockerfile中的最终USER语句必须是USER tomcat
(它是基于tomcat构建的:8.5.23-jre8-alpine图像)
2。)它无法在/root/
目录或$JAVA_HOME
3.)它必须能够修改入口点内的$JAVA_HOME/lib/security
目录而不是Dockerfile中的目录(因为证书是在容器启动时传入的)
截至目前我已经
了FROM tomcat:8.5.23-jre8-alpine
#### OTHER IMAGE COMMANDS ####
COPY ./entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chown root:root /usr/local/bin/entrypoint.sh
RUN chmod 4755 /usr/local/bin/entrypoint.sh
USER tomcat
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
CMD ["catalina.sh", "run"]
我认为将文件的所有权授予root,chmod 4755将允许tomcat用户执行入口点,但是以root身份运行入口点,以便它可以按照自己的意愿修改文件系统。但是,当我在入口点
中运行此行时$JAVA_HOME/bin/keytool -import -alias ca_local -keystore $JAVA_HOME/lib/security/cacerts -storepass XXXXX -noprompt -trustcacerts -file /usr/local/tomcat/certificates/ca-local.cer
我收到以下错误:
keytool error: java.io.FileNotFoundException: /usr/lib/jvm/java-1.8-openjdk/jre/lib/security/cacerts (Permission denied)
似乎入口点实际上并没有以root身份运行,因为chown / chmod会隐含。我知道我的所有文件都在正确的位置,因为当我从Dockerfile中删除USER tomcat
时,一切正常。在设置入口点的权限时我缺少什么?
答案 0 :(得分:6)
在这两个步骤中:
RUN chown root:root /usr/local/bin/entrypoint.sh
RUN chmod 4755 /usr/local/bin/entrypoint.sh
您确保entrypoint.sh
脚本归root
所有,然后您尝试设置setuid
位。不幸的是,第二步不会起作用:您不能将shell脚本(或实际上任何解释的脚本)标记为setuid
;这个位将被忽略。例如,见this question。
但如果事件有效,则会出现另一个问题:您的ENTRYPOINT
脚本负责处理传递到容器中的任何命令,可以在docker run
命令行上,也可以通过{{1} Dockerfile中的指令。如果CMD
尝试有效,那么您的setuid
脚本将以root身份运行...这意味着您最终会以root身份运行ENTRYPOINT
,这意味着您的catalina.sh run
指令是完全没有意义。
只需删除USER
指令,允许输入点以USER
运行,然后让root
脚本运行ENTRYPOINT
,就可以到达同一个地方作为CMD
用户(例如,使用tomcat
或su
):
sudo
在FROM tomcat:8.5.23-jre8-alpine
#### OTHER IMAGE COMMANDS ####
COPY ./entrypoint.sh /usr/local/bin/entrypoint.sh
ENTRYPOINT ["sh", "/usr/local/bin/entrypoint.sh"]
CMD ["catalina.sh", "run"]
:
entrypoint.sh
这是处理初始设置任务的一种非常常见的机制,必须以root身份运行,同时以非root用户身份运行其他任务。
此处仍存在许多问题:基础#!/bin/sh
# Do stuff as root here.
$JAVA_HOME/bin/keytool -import -alias ca_local \
-keystore $JAVA_HOME/lib/security/cacerts
-storepass XXXXX -noprompt -trustcacerts \
-file /usr/local/tomcat/certificates/ca-local.cer
# Now run everything else as a non-root user
exec su - tomcat -c "$*"
没有tomcat:8.5.23-jre8-alpine
用户,tomcat
中的脚本只能由/usr/local/tomcat/bin
执行。因此,如果您希望此特定映像与非root用户一起使用,您可能需要先进行一系列配置更改。