Docker Tomcat 9.0.45无状态容器强化-更改ServerInfo.properties



作为为Tomcat定义的强化任务之一,我应该将$CATALINA_HOME/bin/version.sh的输出更改为输出伪值。

从我的发现来看,这似乎很直接。所有的文章基本上都指向:从catalina.jar中提取ServerInfo.properties,修改它,重新提交它,然后重新启动Tomcat。

然而,在无状态容器的世界里,我必须提取它,修改它,重新提交它,START tomcat。如果在tomcat启动后重新启动容器,则容器将死亡。以下是我在容器入口点shell脚本中尝试的步骤:

jar -xf /opt/tomcat/lib/catalina.jar org/apache/catalina/util/ServerInfo.properties
sed -i 's@server.info=.*@server.info=Server@' /opt/tomcat/org/apache/catalina/util/ServerInfo.properties
sed -i 's@server.number=.*@server.info=0.0@' /opt/tomcat/org/apache/catalina/util/ServerInfo.properties
jar -uf /opt/tomcat/lib/catalina.jar org/apache/catalina/util/ServerInfo.properties

然而,在9.0.45中,重新提交到catalina.jar时抛出了一个错误:

jar: Package org.apache.catalina.ssi missing from ModulePackages class file attribute

对此进行调查后,我发现这篇文章:在ModulePackages类文件属性中缺少jar:Package org.apache.catalina.ssi

它本质上说这是新版tomcat中的一个bug,而绕过它的人使用了7zip而不是jar。所以我用以下内容修改了我的代码:

mkdir -p /opt/tomcat/test
pushd /opt/tomcat/test
7z x -y /opt/tomcat/lib/catalina.jar:org/apache/catalina/util/ServerInfo.properties
sed -i 's@server.info=.*@server.info=Server@' /opt/tomcat/test/ServerInfo.properties
sed -i 's@server.number=.*@server.info=0.0@' /opt/tomcat/test/ServerInfo.properties
7z u /opt/tomcat/lib/catalina.jar:org/apache/catalina/util/ServerInfo.properties /opt/tomcat/test/ServerInfo.properties
popd

虽然据我所知,这确实起到了的作用(备份位置(测试(中的ServerInfo.properties文件确实被成功修改,并且我在容器控制台日志输出中收到了来自7zip的成功指示符,用于重新提交(,但在tomcat启动并运行version.sh之后,它仍然报告实际的verison。

重申一下,这些更改是在tomcat启动之前应用的,所以即使所有文档都说在更改后重新启动tomcat,我也希望我不必重新启动tomcat(同样,因为此操作会杀死容器并擦除任何交互式容器更改(无状态((。

编辑1:为了确认,在容器启动后,我已经执行到容器中,以验证入口点脚本是否成功。我手动从catalina.jar中提取了该文件,并验证了操作似乎确实成功,因为从catalina.jar中交互式提取的ServerInfo.properties确实反映了更改(因此该过程似乎有效(,但运行$catalina_HOME/bin/version.sh仍然显示实际版本。。。

还有另一个选项,它更简单,工作也很好。

或者,可以通过创建文件CATALINA_BASE/lib.org/apache/CATALINA/util/ServerInfo.properties来更改版本号,内容如下
https://tomcat.apache.org/tomcat-9.0-doc/security-howto.html#web.xml

您不需要替换catalina.jar
中的任何内容,只需按如下方式创建此额外的配置文件即可。

mkdir -p "${CATALINA_HOME}/lib/org/apache/catalina/util"
echo "server.info=X" > "${CATALINA_HOME}/lib/org/apache/catalina/util/ServerInfo.properties"
## proceed with tomcat start...

奖金
从服务器响应中的HTTP标头中删除服务器信息(同时检查此项(。

## turn off server info and stacktraces on error pages
file="${CATALINA_HOME}"/conf/server.xml
xmlstarlet edit -L 
--delete "//Connector[starts-with(@protocol, 'HTTP')]/@server" 
--insert "//Connector[starts-with(@protocol, 'HTTP')]" -t attr -n "server" -v "X" 
--delete "//Valve[@className='org.apache.catalina.valves.ErrorReportValve']" 
--subnode "/Server/Service[@name='Catalina']/Engine[@name='Catalina']/Host[@name='localhost']" -t elem -n "Valve" 
--insert "/Server/Service[@name='Catalina']/Engine[@name='Catalina']/Host[@name='localhost']/Valve[not(@className)]" -t attr -n "className" -v "org.apache.catalina.valves.ErrorReportValve" 
--insert "//Valve[@className='org.apache.catalina.valves.ErrorReportValve']" -t attr -n "showReport" -v "false" 
--insert "//Valve[@className='org.apache.catalina.valves.ErrorReportValve']" -t attr -n "showServerInfo" -v "false" 
${file}

最新更新