Spring Boot 安全性最佳實踐
1.實施 HTTPS
HTTPS 在傳輸過程中對資料進行加密,防止未經授權的各方截獲和破譯敏感資訊。這對於處理使用者憑證、金融交易或任何其他機密資料的應用程式尤為重要。因此,安全通訊是不容置疑的。您必須使用 HTTPS 來保護傳輸中的資料。
在應用程式屬性中,確保啟用 TLS/SSL:
server.port=8443 server.ssl.key-store=classpath:keystore.jks server.ssl.key-store-password=yourpassword server.ssl.key-password=yourpassword
調整檔案路徑,確保將 "keystore.jks"、"key-store-password "和 "key-password "替換為實際的 keystore 檔案、keystore 密碼和私鑰密碼。
如果想強制執行 HTTPS 並完全禁止 HTTP 訪問,可以修改 Spring Security 配置,將所有 HTTP 流量重定向到 HTTPS。下面是實現方法:
@Override protected void configure(HttpSecurity http) throws Exception { http .requiresChannel() .requestMatchers(r -> r.getHeader("X-Forwarded-Proto") != null) .requiresSecure() .and() .authorizeRequests() .antMatchers("/").permitAll() // Allow access to the home page .anyRequest().authenticated() .and() .formLogin().and() .httpBasic().and() .csrf().and(); // Retaining CSRF configuration }
.requiresChannel().requestMatchers(r -> r.getHeader("X-Forwarded-Proto") != null).requiresSecure() 對所有請求強制執行 HTTPS。requestMatchers 部分用於處理應用程式位於代理或負載平衡器後面的情況,X-Forwarded-Proto 用於確定協議。如果要在 Spring Boot 應用程式中使用 WebSecurityConfigurerAdapter 強制執行 HTTPS,可以配置安全設定以確保安全連線。下面是一個完整的示例:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .requiresChannel() .requestMatchers(r -> r.getHeader("X-Forwarded-Proto") != null) .requiresSecure() // Enforce HTTPS .and() .authorizeRequests() .antMatchers("/").permitAll() // Allow access to the home page .anyRequest().authenticated() .and() .formLogin().and() .httpBasic().and() .csrf().and(); // Retain CSRF protection } }
實施 HTTPS 後,徹底測試應用程式,確保功能無縫連線。定期監控 SSL/TLS 配置,檢查是否存在漏洞或證書過期。
2.啟用 CSRF 保護
跨站請求偽造(CSRF)攻擊可能是毀滅性的。Spring Security 預設啟用 CSRF 保護。請確保沒有誤將其禁用:
http .csrf().disable(); // Avoid this in production
3.嚴格驗證輸入
絕不相信使用者輸入。始終驗證型別、長度、格式和範圍。使用 Spring 內建的驗證功能:
import javax.validation.constraints.NotEmpty; public class UserInput { @NotEmpty(message = "Name cannot be empty") private String name; // getters and setters }
4.使用引數化查詢
SQL 注入是網路應用程式中常見的非常關鍵的漏洞,攻擊者可以完全接管應用程式的資料庫。
在 Spring Boot 中,可以透過使用引數化查詢或 JPA 資源庫來緩解 SQL 注入攻擊:
@Repository public interface UserRepository extends JpaRepository<User, Long> { @Query("SELECT u FROM User u WHERE u.email = :email") User findByEmail(@Param("email") String email); }
5.啟用方法級安全
當未經授權或低許可權使用者可以訪問應用程式的敏感功能(如通常由管理員角色訪問的功能)時,就會出現方法級授權問題。
這一問題在網路應用程式中非常普遍,已成為 OWASP 評選的網路應用程式十大漏洞之一。
您可以使用 Spring 安全註解在方法級別限制訪問許可權,從而避免這一安全問題:
@PreAuthorize("hasRole('ADMIN')") public void deleteUser(Long id) { // deletion logic }
6.加密敏感資料
想要避免資料洩露?敏感資料應該加密。使用 Spring 的 @EncryptablePropertySource 對屬性檔案進行加密:
@EncryptablePropertySource(name = "EncryptedProperties", value = "classpath:encrypted.properties") @Configuration public class EncryptionConfig { // Configuration details }
7.定期更新依賴項
Spring Boot 漏洞經常出現在第三方軟體包和外掛中。及時更新依賴項,下載開發人員建立的補丁,確保已知的安全漏洞得到修復。使用 Maven 或 Gradle 等工具可輕鬆進行管理。
最近,Trivy 等開源依賴關係掃描工具增加了對掃描易受攻擊的 Java 依賴關係的支援。
8.實施正確的身份驗證和授權
利用 Spring Security 強大的身份驗證和授權機制。配置身份驗證提供程式、userDetailsService 和密碼編碼器:
@Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth .userDetailsService(userDetailsService) .passwordEncoder(passwordEncoder()); }
9.審計和記錄安全事件
安全審計對於正確評估組織應用程式的安全狀況至關重要。我們強烈建議跟蹤所有與安全相關的事件。Spring Boot Actuator 和 Spring Security 的審計功能非常有用:
public class CustomAuditListener extends AbstractAuthenticationAuditListener { @Override public void onApplicationEvent(AbstractAuthenticationEvent event) { // Logging logic } }
10.進行安全測試
定期測試應用程式是否存在安全漏洞。
您可以使用 Spring Boot 自身的測試功能來編寫測試:
@SpringBootTest public class SecurityConfigurationTest { // Test cases }
但這種方法可能會很耗時,尤其是因為您需要為多種型別的安全漏洞建立和維護所有測試用例。更快、更可靠的替代方法是使用支援 Spring Boot 的專用 API 測試工具(如 Escape),它將直接在 CI/CD 中根據 100 多種安全最佳實踐和漏洞測試您的應用程式,並幫助您修復所有問題。
結論
這篇文章基於Spring Security, Spring Boot 中的安全性不是事後的想法,而是應用程式設計的一個重要方面。透過遵循這些最佳實踐,開發人員可以顯著改善 Spring Boot 應用程式的安全狀況。請記住,全面的安全性不僅需要最佳實踐,還需要實施強大的訪問控制措施、執行安全的編碼實踐以及採用最新的安全技術,從而大幅降低風險敞口,保護您的寶貴資產免受潛在威脅。
今天先到這兒,希望對雲原生,技術領導力, 企業管理,系統架構設計與評估,團隊管理, 專案管理, 產品管管,團隊建設 有參考作用 , 您可能感興趣的文章:
領導人怎樣帶領好團隊
構建創業公司突擊小團隊
國際化環境下系統架構演化
微服務架構設計
影片直播平臺的系統架構演化
微服務與Docker介紹
Docker與CI持續整合/CD
網際網路電商購物車架構演變案例
網際網路業務場景下訊息佇列架構
網際網路高效研發團隊管理演進之一
訊息系統架構設計演進
網際網路電商搜尋架構演化之一
企業資訊化與軟體工程的迷思
企業專案化管理介紹
軟體專案成功之要素
人際溝通風格介紹一
精益IT組織與分享式領導
學習型組織與企業
企業創新文化與等級觀念
組織目標與個人目標
初創公司人才招聘與管理
人才公司環境與企業文化
企業文化、團隊文化與知識共享
高效能的團隊建設
專案管理溝通計劃
構建高效的研發與自動化運維
某大型電商雲平臺實踐
網際網路資料庫架構設計思路
IT基礎架構規劃方案一(網路系統規劃)
餐飲行業解決方案之客戶分析流程
餐飲行業解決方案之採購戰略制定與實施流程
餐飲行業解決方案之業務設計流程
供應鏈需求調研CheckList
企業應用之效能實時度量系統演變
如有想了解更多軟體設計與架構, 系統IT,企業資訊化, 團隊管理 資訊,請關注我的微信訂閱號:
作者:Petter Liu
出處:http://www.cnblogs.com/wintersun/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。
該文章也同時釋出在我的獨立部落格中-Petter Liu Blog。