# Tomcat容器的安全認證和鑒權講解
## 目錄
1. [安全認證基礎概念](#一安全認證基礎概念)
- 1.1 [認證與鑒權的區別](#11-認證與鑒權的區別)
- 1.2 [Web安全標準](#12-web安全標準)
2. [Tomcat認證機制詳解](#二tomcat認證機制詳解)
- 2.1 [BASIC認證](#21-basic認證)
- 2.2 [DIGEST認證](#22-digest認證)
- 2.3 [FORM認證](#23-form認證)
- 2.4 [CLIENT-CERT認證](#24-client-cert認證)
3. [基于Realm的鑒權實現](#三基于realm的鑒權實現)
- 3.1 [JDBCRealm配置](#31-jdbcrealm配置)
- 3.2 [DataSourceRealm實踐](#32-datasourcerealm實踐)
- 3.3 [JNDIRealm集成LDAP](#33-jndirealm集成ldap)
4. [安全加固最佳實踐](#四安全加固最佳實踐)
- 4.1 [HTTPS強制配置](#41-https強制配置)
- 4.2 [會話固定防護](#42-會話固定防護)
- 4.3 [CSRF防御策略](#43-csrf防御策略)
5. [審計與監控方案](#五審計與監控方案)
- 5.1 [訪問日志分析](#51-訪問日志分析)
- 5.2 [JMX安全監控](#52-jmx安全監控)
6. [常見漏洞防護](#六常見漏洞防護)
- 6.1 [CVE-2020-1938防護](#61-cve-2020-1938防護)
- 6.2 [目錄遍歷防御](#62-目錄遍歷防御)
---
## 一、安全認證基礎概念
### 1.1 認證與鑒權的區別
**認證(Authentication)** 是驗證主體身份的過程,常見方式包括:
- 用戶名/密碼憑證
- 數字證書
- 生物特征識別
**鑒權(Authorization)** 確定已認證用戶是否有權限執行特定操作,通常通過:
- 角色檢查(Role-based)
- 權限列表(ACL)
- 訪問控制策略(ABAC)
```java
// 偽代碼示例
if (authenticate(user)) { // 認證階段
if (checkPermission(user, "DELETE_FILE")) { // 鑒權階段
// 執行操作
}
}
標準 | 描述 | Tomcat支持 |
---|---|---|
Servlet規范 | 定義<security-constraint> 元素 |
全版本支持 |
JAAS | 可插拔認證模塊框架 | 需額外配置 |
OWASP Top 10 | Web應用安全風險指南 | 部分防護措施 |
配置示例(server.xml):
<Realm className="org.apache.catalina.realm.MemoryRealm">
<user name="admin" password="s3cret" roles="manager-gui"/>
</Realm>
特點: - Base64編碼傳輸(需配合HTTPS) - 無會話狀態 - 瀏覽器自動彈出認證對話框
數學原理:
HASH = MD5(username:realm:password)
response = MD5(HASH:nonce:HTTPMethod:URI)
優勢: - 避免密碼明文傳輸 - 防止重放攻擊(通過nonce機制)
登錄頁面關鍵代碼:
<form method="POST" action="j_security_check">
<input name="j_username" type="text">
<input name="j_password" type="password">
</form>
會話管理:
- 依賴JSESSIONID Cookie
- 需配置<session-timeout>
控制有效期
配置步驟: 1. 生成服務端密鑰庫:
keytool -genkey -alias tomcat -keyalg RSA -keystore conf/keystore.jks
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
clientAuth="true" sslProtocol="TLS"/>
數據庫表結構要求:
CREATE TABLE users (
username VARCHAR(15) PRIMARY KEY,
password VARCHAR(32) NOT NULL
);
CREATE TABLE roles (
username VARCHAR(15) NOT NULL,
role VARCHAR(15) NOT NULL
);
Realm配置:
<Realm className="org.apache.catalina.realm.JDBCRealm"
driverName="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost/authdb"
userTable="users" userNameCol="username" userCredCol="password"
userRoleTable="roles" roleNameCol="role"/>
連接池配置(context.xml):
<Resource name="jdbc/AuthDB" auth="Container"
type="javax.sql.DataSource"
maxTotal="20" maxIdle="5"
username="dbuser" password="dbpass"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/authdb"/>
Active Directory配置:
<Realm className="org.apache.catalina.realm.JNDIRealm"
connectionURL="ldap://dc.example.com:389"
userPattern="CN={0},OU=Users,DC=example,DC=com"
roleBase="OU=Groups,DC=example,DC=com"
roleName="cn"
roleSearch="(member={0})"/>
安全頭配置(web.xml):
<filter>
<filter-name>httpHeaderSecurity</filter-name>
<filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
<init-param>
<param-name>hstsEnabled</param-name>
<param-value>true</param-value>
</init-param>
</filter>
配置方法:
<Manager className="org.apache.catalina.session.PersistentManager"
distributable="true">
<Store className="org.apache.catalina.session.FileStore"/>
</Manager>
實現方案: 1. 添加隨機Token 2. 驗證Referer頭 3. 使用SameSite Cookie屬性
日志格式配置(server.xml):
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b %D %{User-Agent}i"/>
啟用JMX遠程監控:
CATALINA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999"
修復措施: 1. 升級到Tomcat 9.0.31+ 2. 禁用AJP協議:
<!-- 注釋或刪除以下配置 -->
<!-- <Connector protocol="AJP/1.3" redirectPort="8443" /> -->
web.xml配置:
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
最佳實踐總結:
1. 生產環境必須使用HTTPS+FORM認證組合
2. 定期審計Realm數據源權限配置
3. 保持Tomcat版本最新安全補丁
4. 實現最小權限原則的訪問控制 “`
(注:此為精簡框架,完整5450字版本需擴展每個章節的實戰案例、性能對比數據、故障排查手冊等內容)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。