嵌入式 Tomcat 加固 - 如何 alter/override 在 Spring 启动时公布服务器信息?
Embedded Tomcat Hardening - How to alter/override Advertised server information in Spring boot?
我一直在研究如何在嵌入式 tomcat 上执行 'tomcat hardening',但我找不到改变这 3 个 catalina 服务器信息属性的方法:server.info
、server.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.
- Extract the ServerInfo.properties file from the catalina.jar file: $ cd $CATALINA_HOME/lib $ jar xf catalina.jar
org/apache/catalina/util/ServerInfo.properties
- Navigate to the util directory that was created cd org/apache/Catalina/util
- Open ServerInfo.properties in an editor
- Update the server.info attribute in the ServerInfo.properties file. server.info=
- 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 个解决方案:
Fat Jar 方法 -> ServerInfo.properties in tomcat-embed-core.jar 已修补,可执行的 fat jar 在构建期间打包。但需要修补的 tomcat-embed-core.jar 位于 repo/artifactory 中才能正常工作。
Thin Jar 方法 -> 可执行 jar 与使用 spring-boot-thin-layout 和 spring-boot-thin-maven-plugin(用于构建)的外部库分开。这将依赖项外部化,您可以在本地修补任何 jar 文件而不会损坏可执行的瘦 jar。
目前,这些是我能想到的两种方法来强化 spring-boot 应用程序中的嵌入式 tomcat。
在有人提出更好的解决方案之前,我会将其标记为答案。
我一直在研究如何在嵌入式 tomcat 上执行 'tomcat hardening',但我找不到改变这 3 个 catalina 服务器信息属性的方法:server.info
、server.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.
- Extract the ServerInfo.properties file from the catalina.jar file: $ cd $CATALINA_HOME/lib $ jar xf catalina.jar org/apache/catalina/util/ServerInfo.properties
- Navigate to the util directory that was created cd org/apache/Catalina/util
- Open ServerInfo.properties in an editor
- Update the server.info attribute in the ServerInfo.properties file. server.info=
- 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 个解决方案:
Fat Jar 方法 -> ServerInfo.properties in tomcat-embed-core.jar 已修补,可执行的 fat jar 在构建期间打包。但需要修补的 tomcat-embed-core.jar 位于 repo/artifactory 中才能正常工作。
Thin Jar 方法 -> 可执行 jar 与使用 spring-boot-thin-layout 和 spring-boot-thin-maven-plugin(用于构建)的外部库分开。这将依赖项外部化,您可以在本地修补任何 jar 文件而不会损坏可执行的瘦 jar。
目前,这些是我能想到的两种方法来强化 spring-boot 应用程序中的嵌入式 tomcat。
在有人提出更好的解决方案之前,我会将其标记为答案。