docker tomcat 9.0.45无状态容器强化-更改serverinfo.properties

jdg4fx2g  于 2021-10-10  发布在  Java
关注(0)|答案(1)|浏览(429)

作为为tomcat定义的强化任务之一,我应该更改 $CATALINA_HOME/bin/version.sh 输出假值。
从我能找到的情况来看,这似乎很直接。所有的文章基本上都指向:从catalina.jar中提取serverinfo.properties,修改它,重新提交它,然后重新启动tomcat。
但在无状态容器世界中,我必须提取、修改、重新提交、启动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:为了确认,在容器启动后,我已执行到容器中,以验证entrypoint脚本是否成功。我手动从catalina.jar中提取了该文件,并验证了操作是否成功,因为从catalina.jar中交互提取的serverinfo.properties确实反映了更改(因此该过程似乎有效),但运行$catalina_home/bin/version.sh仍然显示实际版本。。。

7ivaypg9

7ivaypg91#

还有另一种选择,它更简单,也很好用。
或者,可以通过创建文件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}

相关问题