tomcat安全加固,配置https,keystore生成證書,證書密鑰以加密方式配置


一、前言
前段時間,做了一個新項目。在項目打包時,將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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM