spring boot 安全配置基线
一、概述
SpringBoot是由Pivotal团队提供的基于Spring的全新框架。
Spring Boot是一个用于快速构建基于Spring框架的Java应用程序的开源框架。它旨在简化Spring应用程序的开发过程,通过提供一种约定优于配置的方式,减少开发者对配置的需求,从而提高开发效率。
SpringBoot并不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式,简省了繁重的配置,并提供了各种启动器,使开发者能快速上手。
Spring Boot是一个功能强大且易于使用的框架,适用于各种规模的Java应用开发,尤其适合微服务架构的应用。
二、安全基线
1、基础安全框架
1.1 依赖与版本管理
- 依赖配置:确保引入 spring-boot-starter-security,并选择最新稳定版本。
#xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
- 默认防护:默认情况下,所有端点均需认证,需显式配置放行规则。
1.2 禁用默认账户
- 关闭自动生成密码:避免在日志中暴露默认密码。
# application.properties
spring.security.user.password= # 置空禁用默认用户
2、认证与授权
2.1 用户认证
- 密码加密:强制使用强哈希算法(如 BCrypt),禁用明文存储。
#java
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(12); // 强度因子推荐 >=10
}
- 多因素认证(MFA):集成如 Google Authenticator 或短信验证码。
2.2 权限控制
- RBAC 模型:基于角色的访问控制,最小权限分配。
#java
http.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/admin/**").hasRole("ADMIN")
.requestMatchers("/api/user/**").hasAnyRole("USER", "ADMIN")
.requestMatchers("/public/**").permitAll()
.anyRequest().authenticated()
);
- 方法级安全:使用 @PreAuthorize 注解细化控制。
#java
@PreAuthorize("hasRole('ADMIN') or #userId == authentication.principal.id")
public void updateUser(Long userId, User user) { ... }
3、通信安全
3.1 HTTPS 强制启用
- 配置 SSL:使用有效证书,禁用 HTTP 重定向。
#properties
server.ssl.enabled=true
server.ssl.key-store-type=PKCS12
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-password=your-strong-password
- 生产环境最佳实践:通过 Nginx/Apache 反向代理管理 SSL,启用 HSTS 头。
# Nginx 配置示例
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
3.2 防止中间人攻击
- 证书固定(Certificate Pinning):在移动端或高安全场景中使用。
- 禁用弱加密协议:如 TLS 1.0/1.1,仅允许 TLS 1.2+。
#properties
# 配置 Tomcat 支持的协议
server.ssl.enabled-protocols=TLSv1.2,TLSv1.3
4、防御常见攻击
4.1 CSRF 防护
- 默认启用:表单提交需携带 _csrf Token。
- API 场景豁免:若使用无状态 JWT,可选择性关闭。
#java
http.csrf(csrf -> csrf
.ignoringRequestMatchers("/api/**")
);
4.2 XSS 防护
- 响应头配置:
#java
http.headers(headers -> headers
.xssProtection(xss -> xss.headerValue("1; mode=block"))
.contentSecurityPolicy(csp -> csp.policyDirectives("default-src 'self'"))
);
- 输入输出过滤:使用 OWASP Java Encoder 转义 HTML/JS。
#java
String safeOutput = Encode.forHtml(userInput);
4.3 SQL 注入防护
- ORM 框架安全:使用 JPA/Hibernate 的参数化查询。
#java
@Query("SELECT u FROM User u WHERE u.username = :username")
User findByUsername(@Param("username") String username);
- 禁用原生 SQL 拼接:避免直接拼接用户输入。
5、敏感数据保护
5.1 配置加密
- 加密数据库密码/密钥:使用 Jasypt 或 Spring Cloud Vault。
#properties
# Jasypt 加密示例
spring.datasource.password=ENC(密文)
#bash
# 生成密文
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI \
input="your-password" password=master-key algorithm=PBEWithMD5AndTripleDES
5.2 日志脱敏
- 过滤敏感信息:如身份证号、密码、Token。
#java
@Bean
public CommonsRequestLoggingFilter logFilter() {
CommonsRequestLoggingFilter filter = new CommonsRequestLoggingFilter();
filter.setIncludeQueryString(true);
filter.setIncludePayload(true);
filter.setMaxPayloadLength(10000);
filter.setIncludeHeaders(false);
filter.setAfterMessagePrefix("REQUEST DATA: ");
return filter;
}
6、Actuator 端点安全
6.1 暴露控制
- 仅开放必要端点:关闭敏感端点(如 env, heapdump)。
#properties
management.endpoints.web.exposure.include=health,info
management.endpoints.web.exposure.exclude=env
- IP 白名单限制:结合 Spring Security 的 hasIpAddress。
#java
.requestMatchers("/actuator/**").hasIpAddress("192.168.1.0/24")
6.2 健康检查定制
- 隐藏详情:生产环境仅返回简单状态。
#properties
management.endpoint.health.show-details=never
7、会话与 Cookie 安全
7.1 会话管理
- 超时设置:会话有效期建议 ≤30 分钟。
#properties
server.servlet.session.timeout=30m
- 并发控制:限制同一用户会话数量。
#java
http.sessionManagement(session -> session
.maximumSessions(1)
.expiredUrl("/login?expired")
);
7.2 Cookie 安全属性
- Secure & HttpOnly:防止 XSS 窃取 Cookie。
#properties
server.servlet.session.cookie.secure=true
server.servlet.session.cookie.http-only=true
server.servlet.session.cookie.same-site=strict
8、依赖与漏洞管理
8.1 依赖扫描
- 使用 OWASP Dependency-Check:集成到 CI/CD 流程。
#xml
<!-- 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>
8.2 容器镜像安全
- 基础镜像选择:使用官方镜像(如 eclipse-temurin:17-jdk-jammy)。
- 漏洞扫描工具:Trivy、Clair 定期扫描镜像。
9、生产环境加固
9.1 防火墙与网络隔离
- 限制端口暴露:仅开放必要端口(如 443)。
- 安全组规则:仅允许可信 IP 访问管理端口。
9.2 密钥管理
- 禁用硬编码密钥:使用 Kubernetes Secrets 或 HashiCorp Vault。
#yaml
# Kubernetes Secret 示例
apiVersion: v1
kind: Secret
metadata:
name: db-secret
data:
password: <base64-encoded>
10、监控与应急响应
10.1 安全日志集中化
- 集成 ELK/Splunk:收集登录失败、异常访问等事件。
#properties
logging.level.org.springframework.security=DEBUG
10.2 定期渗透测试
- 工具推荐:OWASP ZAP、Burp Suite。
- 修复流程:漏洞发现 → 优先级评估 → 修复 → 复测。
三、总结
以上配置需结合 OWASP Top 10 和 CIS 基准进行调整,并通过自动化工具(如 Snyk、Checkmarx)持续检测。关键点包括:
- 零信任原则:默认拒绝所有请求,显式放行必要资源。
- 纵深防御:多层防护(网络、应用、数据层)叠加。
- 持续更新:依赖版本、安全策略随威胁情报动态调整。