一、前言
前段時間,做了一個新項目。在項目打包時,將jdk和tomcat打包到版本包里了,還貼心的附上了在linux環境安裝以及配置教程,結果被懟了。
一則是說不需要安裝jdk,只需要安裝jre,即可讓項目跑起來。jdk是java開發工具,jre是java運行環境,jdk是包含jre的。安裝過jdk的都知道,在安裝jdk的過程中,還會單獨讓裝一個jre的,其實這個地方的jre不用安裝,因為jdk里面是包含jre的,在配置環境變量的時候,也通常不會去配置到單獨安裝的jre的,而是直接指到jdk下的jre。
一則是說這個tomcat不安全,需要給tomcat安全加固和優化。這不就涉及到知識盲點了嗎?
二、tomcat安全加固
1.關閉shutdown端口
在server.xml中一般配置有三個端口,一個是shutdown的端口,監聽停止tomcat的命令,一個是http的監聽端口,再一個是AJP的監聽端口。
shutdown的默認配置如下:
那么當其他用戶能telnet到這個ip的端口,就可以使用SHUTDOWN來停止tomcat服務。
啟動tomcat如下:
在windown10中默認telnet服務是不開啟的,想要嘗試的同學需要先開啟telnet服務。
在cmd中telnet命令如下,點擊確定,在Telnet新窗口輸入SHUTDOWN,即可看到tomcat服務已關閉。
那么就需要修改默認的端口以及關閉tomcat的命令。例子如下:
2.刪除ROOT等預置項目
在webapps下有tomcat預先放置的項目。如下圖:
這些項目使得我訪問http://127.0.0.1:8080就可以訪問tomcat的管理等頁面。
刪除掉之后,再次訪問這個路徑,就會顯示報錯。
3.關閉AJP端口
當用不上ajp端口時,需要將如下代碼注釋掉。
4.注釋tomcat用戶配置
這個用戶配置在tomcat-users.xml中。如下:
5.開啟tomcat的access日志
修改conf/server.xml配置,開啟access日志,在logs目錄下會生成localhost_access_log.txt,記錄每次請求。
如下圖:
6.禁止列出目錄
修改conf/web.xml的listings為false
其實上述的大多數配置,在tomcat9中已經配置,所以為了安全,請使用高版本tomcat.
7.最小權限
安裝使用tomcat時,不要使用root用戶。同時bin目錄下的sh腳本權限要限制在最小范圍。
8.使用https
tomcat默認的使用的是http,需要修改為使用https的connector。
在conf/server.xml中配置https如下:
keyAlias為生成證書的時的別名。
keystoreFile為證書路徑,我這個文件是放在了conf目錄下。
keystorePass為證書密碼。
與此同時需要注意http的redirectPort端口為https的端口號,這樣訪問http的端口就會重定向到https。
附上生成證書的命令:
keytool -genkey -validity 36000 -alias ykqtest -keyalg RSA -keystore d:\test.keystore
36000這個數字是以天為單位,表示證書有效期為100年。
ykqtest是證書的別名。
生成證書后,將keystore文件復制到tomcat的conf目錄下即可。
9.強制https訪問
還需要修改conf/web.xml,使得必須使用https端口才能訪問,配置如下:
<login-config>
·<!-- Authorization setting for SSL -->
<auth-method>CLIENT-CERT</auth-method>
<realm-name>Client Cert Users-only Area</realm-name>
</login-config>
<security-constraint>
<!-- Authorization setting for SSL -->
<web-resource-collection >
<web-resource-name >SSL</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
增加了上面這個配置后,假如關閉了https的connector,只保留http的connector,也無法通過http訪問服務,因為這個地方強制必須使用https來訪問。
10.禁止不安全的請求方式
下列http的不安全的請求方式配置在web.xml中,禁止使用,只允許GET和POST方式
<security-constraint>
<web-resource-collection>
<url-pattern>/*</url-pattern>
<http-method>PUT</http-method>
<http-method>DELETE</http-method>
<http-method>HEAD</http-method>
<http-method>OPTIONS</http-method>
<http-method>TRACE</http-method>
</web-resource-collection>
<auth-constraint>
</auth-constraint>
</security-constraint>
11.加密證書私鑰
上面證書的密鑰是以明文的方式存儲的,還需要將密鑰以加密的方式配置在server.xml文件中。
先建立一個maven項目,來重寫org.apache.coyote.http11.Http11NioProtocol(上述Connector配置的http協議類)中設置證書秘鑰的方法。
1)pom.xml
<!-- 這兩個依賴是Http11NioProtocol類依賴的jar包 -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-juli</artifactId>
<version>9.0.36</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.8</version>
</dependency>
2)重寫Http11NioProtocol類
package com.ykq.util;
import java.util.Base64;
import java.util.Base64.Decoder;
import org.apache.coyote.http11.Http11NioProtocol;
/**
* @author YKQ
* 重寫Http11NioProtocol類
*/
public class ReSetHttpProtocol extends Http11NioProtocol {
/**
* 重寫設置證書密碼的方法
*/
public void setKeystorePass(String certificateKeystorePassword) {
// 原先的方法
//super.setKeystorePass(certificateKeystorePassword);
// 這里簡單使用一個base64加解密來存儲證書密碼,實際環境可以使用AES方式加解密
Decoder decoder = Base64.getDecoder();
String password = new String(decoder.decode(certificateKeystorePassword));
super.setKeystorePass(password);
}
}
3)導出jar包,將其放入tomcat的lib目錄下
4)重新配置https
<Connector port="8443" protocol="com.ykq.util.ReSetHttpProtocol"
minSpareThreads="5" maxSpareThreads="75" enableLookups="true" disableUploadTimeout="true"
acceptCount="100" maxThreads="200" SSLEnabled="true" scheme="https" secure="true"
keystoreFile="conf/test.keystore" keystorePass="MTIzNDU2" keyAlias="ykqtest"
clientAuth="false" sslProtocol="TLS" />
上面的com.ykq.util.ReSetHttpProtocol,就是重寫的Http11NioProtocol。
keystorePass=“MTIzNDU2” 配置的是加密后的證書秘鑰.
12.配置sessionId的長度
在公司的紅線要求中有一條,sessionId的長度必須是48位以上。那么需要在context.xml中配置如下:
<Manager>
<SessionIdGenerator sessionIdLength = "24"/>
</Manager>
這個地方配置長度24,生成的sessionId,即可達到48位。如下圖:
————————————————
版權聲明:本文為CSDN博主「study_alltheway」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_39217714/article/details/107119997