文章目录
1. 身份认证(Authentication)
1.1 强制认证默认化
- 任何未公开的API默认需要认证(如健康检查接口
/health
可单独开放) - 实现:全局启用认证拦截器(如 Spring Security 的
authenticated().anyRequest().authenticated()
)
1.2 禁用弱认证方式
- 默认禁用 Basic Auth(明文传输密码)、Cookie 会话认证(易受 CSRF 攻击)
- 实现:强制使用 Bearer Token(如 JWT)或 OAuth2 Client Credentials
1.3 多因素认证(MFA)
- 对高危操作(如删除账号、修改安全设置)默认要求 MFA
2. 访问控制(Authorization)
2.1 最小权限原则
- 新注册用户/服务账号默认拥有 零权限(
Deny All
) - 实现:RBAC 模型中,新角色不关联任何权限策略
2.2 显式声明权限
- 所有敏感 API 必须显式标注访问要求(如
@PreAuthorize("hasAuthority('user:delete')")
) - 案例:未加注解的 API 自动拒绝访问
2.3 自动继承安全策略
- 相同资源路径的 API(如
/api/v1/users/**
)默认继承父级权限策略
3. 输入输出安全
3.1 请求验证
- 默认拒绝包含非法内容的请求:
- 开启严格 JSON 解析(拒绝冗余字段、畸型结构)
- 自动过滤 HTML/JavaScript 标签(防 XSS)
- 设置参数类型、范围、格式的强校验(如
@Valid
+ Bean Validation)
3.2 响应安全
- 默认屏蔽敏感数据:
- 返回 JSON 自动脱敏手机号、邮箱等字段(如
"phone": "138****1234"
) - 禁止返回完整错误栈
- HTTP 头默认移除版本信息(如
X-Powered-By: Express
)
- 返回 JSON 自动脱敏手机号、邮箱等字段(如
4. 数据保护(Data Protection)
4.1 传输层安全
- 强制 HTTPS:HTTP 请求自动重定向至 HTTPS
- 实现:配置 80 → 443 跳转 +
Strict-Transport-Security: max-age=31536000
4.2 静态数据加密
- 数据库字段默认加密(如 AWS RDS 自动加密)
- 日志文件加密存储
- 环境变量密钥自动从保险柜加载(如 HashiCorp Vault)
5. 安全配置基线
配置项 | 默认安全值 | 作用 |
---|---|---|
HTTP 方法控制 | 禁用 TRACE 、PUT 、DELETE (若未使用) |
减少攻击面 |
CORS 策略 | Access-Control-Allow-Origin: 精确域名 |
阻止跨域恶意请求 |
会话管理 | Token 有效期 ≤1 小时 + 开启滑动过期 | 降低会话劫持风险 |
依赖库漏洞扫描 | CI/CD 流水线默认启用(如 Snyk/Dependabot) | 阻断高危组件引入 |
6. 自动化防护机制
6.1 API 网关层防护
- 默认开启 WAF 规则(如 OWASP CRS 防护 SQL 注入)
- 自动限制高频请求(速率限制默认值:100 次/分钟/IP)
6.2 安全头自动注入
默认启用关键安全头:
Content-Security-Policy: default-src 'none'
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
7. 运维与监控
7.1 默认安全审计
- 记录所有 API 请求元数据(用户/IP/参数)至只读存储
- 高危操作(如删除)审计日志默认实时告警
7.2 不可关闭的安全更新
- 安全补丁默认自动安装(K8s 配置
imagePullPolicy: Always
)
8. 实践案例:Spring Boot API 的默认安全配置
# application.yml
security:
require-ssl: true # 强制HTTPS
filter-order: -100 # 安全过滤器最高优先级
headers:
content-security-policy: "default-src 'self'"
hsts: max-age=31536000
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(authz -> authz
.requestMatchers("/public/**").permitAll()
.anyRequest().authenticated() // 其他API默认需认证
)
.csrf(csrf -> csrf.ignoringRequestMatchers("/public/**"))
.sessionManagement(sess -> sess.sessionCreationPolicy(STATELESS));
return http.build();
}
}
9. 关键思维:安全范式的转变
- 传统做法(危险):
开放大部分权限 → 手动配置禁止内容 - Security by Default(安全):
默认拒绝一切 → 显式开放最小权限集合
10. 效果验证
- 渗透测试指标:未经授权访问的 API 成功率应为 0%
- 安全审计:90%+ 的 API 请求包含正确权限声明
11. 核心原则总结
在 Web API 中应用默认安全原则的本质:
🔒 无认证凭证 = 不可访问
🔒 无[显式]授权 = 操作驳回
🔒 无加密传输 = 连接中断
通过开发阶段的强约束设计,将安全基因注入系统生命线
最终目标:即使开发者疏忽、运维遗漏,系统仍能主动捍卫核心资产