Spring Boot 应用部署安全实践指南

Spring Boot 应用部署安全实践指南

一句话总结:安全不是一次性任务,而是一个持续的过程。
本指南从 传输层安全、应用层安全、依赖与运维安全 三个维度,结合 Spring Boot 的最佳实践,协助你构建纵深防御的安全体系。


核心安全实践概览

安全领域

威胁

防护措施

Spring Boot 实践

传输安全 (HTTPS)

窃听、中间人攻击

加密通信通道

配置 SSL/TLS,强制 HTTP → HTTPS

认证与授权

未授权访问

控制访问权限

Spring Security,密码使用 BCrypt 哈希

CSRF

跨站请求伪造

校验请求合法性

Spring Security 内置 CSRF Token

XSS

跨站脚本注入

输入验证 + 输出编码

Bean Validation、Jsoup 清洗、CSP

SQL 注入

数据库攻击

参数化查询

JPA / Hibernate / MyBatis 的预编译语句

依赖安全

第三方漏洞

检测与升级

OWASP Dependency-Check,定期更新

HTTP 安全头

浏览器端攻击

浏览器内置防护

HSTS、X-Content-Type-Options、CSP


1. 传输层安全:启用 HTTPS

步骤 1:申请证书

  • 生产环境:使用 CA 签发的证书(Let’s Encrypt 免费、DigiCert 等)
  • 测试环境:自签证书
keytool -genkey -alias mydomain -keyalg RSA 
  -keystore keystore.p12 -storetype PKCS12 -validity 365

步骤 2:Spring Boot 配置

server.port=8443
server.ssl.key-store-type=PKCS12
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-password=your-secret-password
server.ssl.key-alias=mydomain

步骤 3:强制 HTTPS

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http.requiresChannel(channel -> channel.anyRequest().requiresSecure());
    return http.build();
}

2. 应用层安全:Spring Security

2.1 认证与密码存储

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}
// user.setPassword(passwordEncoder.encode(rawPassword));

2.2 防护 CSRF

  • 默认开启:Spring Security 为每个会话生成 CSRF Token
  • 表单项目:Thymeleaf 自动带上 Token
  • 前后端分离:需从 Cookie/响应头中读取 Token,带入 X-CSRF-TOKEN 请求头

⚠️ 只有无状态 API 服务时才思考关闭:

http.csrf(csrf -> csrf.disable()); // 不推荐

3. 输入输出安全:XSS 与 SQL 注入

3.1 防护 XSS

  • 输入验证:JSR-303 注解 (@NotBlank, @Email)
  • 富文本清洗
String safeHtml = Jsoup.clean(unsafeHtml, Whitelist.basicWithImages());
  • 输出转义:Thymeleaf 默认 th:text 转义
  • CSP 策略
http.headers(headers -> headers
    .addHeaderWriter(new StaticHeadersWriter(
        "Content-Security-Policy",
        "default-src 'self'; script-src 'self' https://cdn.safe.com;")));

3.2 防护 SQL 注入

  • JPA 示例
@Query("SELECT u FROM User u WHERE u.username = :username")
User findByUsername(@Param("username") String username);
  • MyBatis 示例
<select id="findUser" resultType="User">
    SELECT * FROM user WHERE username = #{username}
</select>
<!-- 绝对不要用 ${} 拼接 SQL -->

4. 依赖安全与漏洞扫描

OWASP Dependency-Check (Maven)

<plugin>
    <groupId>org.owasp</groupId>
    <artifactId>dependency-check-maven</artifactId>
    <version>8.2.1</version>
    <executions>
        <execution>
            <goals><goal>check</goal></goals>
        </execution>
    </executions>
</plugin>

执行:

mvn verify
mvn dependency-check:check

依赖更新检查:

mvn versions:display-dependency-updates

5. HTTP 安全头配置

http.headers(headers -> headers
    .contentSecurityPolicy(csp -> csp.policyDirectives("default-src 'self'"))
    .httpStrictTransportSecurity(hsts -> hsts
        .includeSubDomains(true).maxAgeInSeconds(31536000))
    .frameOptions(frame -> frame.sameOrigin())
    .xssProtection(xss -> xss
        .headerValue(XXssProtectionHeaderWriter.HeaderValue.ENABLED_MODE_BLOCK))
    .contentTypeOptions(contentType -> {})
);

常用安全头

  • HSTS:强制 HTTPS
  • X-Frame-Options:防点击劫持
  • X-Content-Type-Options:防 MIME 嗅探
  • CSP:核心 XSS 防御手段

6. 纵深防御总结

  1. 网络层:HTTPS、防火墙
  2. 系统层:最小化权限、定期更新
  3. 应用层:Spring Security、CSRF、XSS、SQL 注入防护
  4. 依赖层:依赖扫描、漏洞修复
  5. 运维层:Actuator 加固、日志审计

上线前用 OWASP ZAPBurp Suite 进行渗透测试,能提前发现大部分隐患。


这份指南相当于一个 Spring Boot 安全全景手册,从证书、到 CSRF/XSS/SQL 注入、再到依赖与 HTTP 头,都覆盖了。

© 版权声明

相关文章

1 条评论

  • 头像
    左左 读者

    收藏了,感谢分享

    无记录
    回复