嵌入式 Tomcat 加固 - 如何 alter/override 在 Spring 启动时公布服务器信息?

Embedded Tomcat Hardening - How to alter/override Advertised server information in Spring boot?

我一直在研究如何在嵌入式 tomcat 上执行 'tomcat hardening',但我找不到改变这 3 个 catalina 服务器信息属性的方法:server.infoserver.built, server.number

有没有办法改变 spring application.property 文件中的这 3 个属性?或者通过其他方式?

Configuration below is a guide for hardening tomcat server specifically for ServerInfo.properties but NOT on embedded tomcat

Rationale:
Altering the server.info attribute may make it harder for attackers to determine which vulnerabilities affect the server platform.

Required Configuration:

Perform the following to alter the server platform string that gets displayed when clients connect to the tomcat server.

  1. Extract the ServerInfo.properties file from the catalina.jar file: $ cd $CATALINA_HOME/lib $ jar xf catalina.jar org/apache/catalina/util/ServerInfo.properties
  2. Navigate to the util directory that was created cd org/apache/Catalina/util
  3. Open ServerInfo.properties in an editor
  4. Update the server.info attribute in the ServerInfo.properties file. server.info=
  5. Update the catalina.jar with the modified ServerInfo.properties file. $ jar uf catalina.jar org/apache/catalina/util/ServerInfo.properties

更新:

我尝试通过在其中修改 ServerInfo.properties 覆盖 tomcat-embed-core-9.0.36 来修改应用程序 fat jar。但是当我通过 Java 启动应用程序时,我得到了这个错误:

原因:java.lang.IllegalStateException:无法打开嵌套条目 'BOOT-INF/lib/tomcat-embed-core-9.0.36.jar'。它已被压缩,嵌套的 jar 文件必须在不压缩的情况下存储。请检查用于创建可执行 jar 文件的机制 在 org.springframework.boot.loader.jar.JarFile.createJarFileFromFileEntry(JarFile.java:283) 在 org.springframework.boot.loader.jar.JarFile.createJarFileFromEntry(JarFile.java:265) 在 org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:254) ... 还有 6 个

想出了 2 个解决方案:

  1. Fat Jar 方法 -> ServerInfo.properties in tomcat-embed-core.jar 已修补,可执行的 fat jar 在构建期间打包。但需要修补的 tomcat-embed-core.jar 位于 repo/artifactory 中才能正常工作。

  2. Thin Jar 方法 -> 可执行 jar 与使用 spring-boot-thin-layout 和 spring-boot-thin-maven-plugin(用于构建)的外部库分开。这将依赖项外部化,您可以在本地修补任何 jar 文件而不会损坏可执行的瘦 jar。

目前,这些是我能想到的两种方法来强化 spring-boot 应用程序中的嵌入式 tomcat。

在有人提出更好的解决方案之前,我会将其标记为答案。