Docker入口点脚本权限

时间:2018-01-29 23:39:05

标签: docker sh chmod keytool chown

我有一个有3个约束的Dockerfile:

1。)为了安全起见,Dockerfile中的最终USER语句必须是USER tomcat(它是基于tomcat构建的:8.5.23-jre8-alpine图像)

2。)它无法在/root/目录或$JAVA_HOME

上运行chmod

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时,一切正常。在设置入口点的权限时我缺少什么?

1 个答案:

答案 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用户(例如,使用tomcatsu):

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用户一起使用,您可能需要先进行一系列配置更改。