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

Docker Tomcat 9.0.45 Stateless Container Hardening - Change ServerInfo.properties

作为为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

对此进行调查,我发现了这篇文章:jar: Package org.apache.catalina.ssi missing from ModulePackages class file attribute

...本质上说这是 tomcat 较新版本中的一个错误,绕过它的人使用 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

...虽然这个 did 在我所知的范围内工作(备份位置(测试)中的 ServerInfo.properties 文件已成功修改并且我在重新提交的容器控制台日志输出中收到了来自 7zip 的成功指示器),在 tomcat 启动并且我 运行 version.sh 之后,它仍然报告实际版本。

重申一下,这些更改正在应用 之前 tomcat 曾经启动过,所以即使所有文档都说要在 tomcat 之后重新启动-change,我希望我不必重新启动 tomcat(同样,因为此操作会终止容器并擦除任何交互式容器更改(无状态))。

编辑 1: 为了确认,在容器启动后,我已经执行到容器中以验证入口点脚本是否成功。我手动从 catalina.jar 中提取文件并验证操作似乎确实成功,因为从 catalina.jar 中交互式提取的 ServerInfo.properties 确实反映了更改(因此该过程似乎有效) 但 运行ning $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 headers 中删除服务器信息(同时检查 this)。

## 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}