Spring Boot 安全性最佳實踐

Spring Boot 安全性最佳實踐

image

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,企業信息化, 團隊管理 資訊,請關注我的微信訂閱號:

image_thumb2_thumb_thumb_thumb_thumb

作者:Petter Liu
出處:http://www.cnblogs.com/wintersun/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。 該文章也同時發佈在我的獨立博客中-Petter Liu Blog。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章