142 lines
5.9 KiB
Markdown
142 lines
5.9 KiB
Markdown
# 09-安全规范
|
||
|
||
> **最重要分册之一**,涵盖安全原则、开发规范、扫描要求
|
||
|
||
---
|
||
|
||
## 一、软件安全基本原则
|
||
|
||
### 安全设计原则
|
||
- **默认拒绝** —— 无授权即不允许访问
|
||
- **开放设计** —— 安全不依赖机制保密,依赖密钥/口令
|
||
- **特权分离** —— 细分特权分给多个主体;禁止 root 远程访问
|
||
- **最小特权** —— 每个程序/用户仅拥有完成任务所需最小权限
|
||
- **最少公共机制** —— 共享机制降到最少
|
||
- **完全仲裁** —— 授权检查覆盖每个访问操作
|
||
- **零信任** —— 假设用户/外部部件都不安全
|
||
- **访问控制** —— 严禁用用户输入参数作为访问控制依据;使用 RBAC;基于角色展示前端页面
|
||
|
||
### 会话管理原则
|
||
- Session ID 必须足够随机且无法预测
|
||
- 含敏感信息的会话必须 SSL 加密
|
||
- **权限变动时必须重新生成 Session ID**
|
||
- 同一用户尽量只允许一个会话存在
|
||
- 建议尽可能缩短会话寿命
|
||
|
||
### 缓存管理原则
|
||
- 所有缓存数据必须设置过期时间
|
||
- 要求强一致性的系统不能使用缓存
|
||
- 预防缓存雪崩/缓存穿透
|
||
|
||
### 安全开发原则
|
||
- **输入验证** —— 所有输入都需安全验证;**所有输入必须在服务端验证**
|
||
- **客户端不可信任** —— 敏感数据从服务端获取,不直接使用客户端身份信息
|
||
- **错误消息** —— 仅显示一般错误信息,不暴露系统/网络/应用敏感信息
|
||
- **URL 加密传输** —— URL 中敏感信息应加密
|
||
- **注释代码** —— 不能包含敏感信息
|
||
- **最小化** —— 输入信息最小化、返回信息最小化,错误信息对用户屏蔽
|
||
- **失败终止** —— 不符合验证的数据直接终止,不修正继续
|
||
|
||
### 安全部署原则
|
||
- **【强制】** 禁用 root 权限运行业务应用;不要在容器内以 root 运行
|
||
- **【强制】** 创建服务专属账号启动服务
|
||
- **【强制】** Linux 下避免文件权限设为 777
|
||
- **【强制】** 防火墙默认禁止所有域间流量
|
||
- **【强制】** 为临时安全策略设置生效时间段
|
||
- 记录日志、定期审计
|
||
|
||
### 禁止弱口令
|
||
- 长度 ≥ 8 位
|
||
- 包含数字、小写字母、大写字母、特殊符号 4 类中至少 3 类
|
||
- 口令与用户名无相关性
|
||
- 更换默认出厂口令
|
||
- 避免键盘排序密码
|
||
|
||
---
|
||
|
||
## 二、通用安全开发规范
|
||
|
||
| 编号 | 规则 | 级别 |
|
||
|------|------|:----:|
|
||
| 1 | 禁止在日志中保存口令、密钥和其他敏感数据 | **强制** |
|
||
| 2 | 禁止使用私有或弱加密算法 | **强制** |
|
||
| 3 | 口令哈希存储必须加入盐值 | **强制** |
|
||
| 4 | 禁止将敏感信息硬编码在程序中 | **强制** |
|
||
| 5 | 使用强随机数(禁止 `java.util.Random`) | **强制** |
|
||
| 6 | 禁止在生产环境保留任何后门程序 | **强制** |
|
||
|
||
### 推荐加密算法
|
||
| 类型 | 推荐算法 | 最低密钥长度 |
|
||
|------|----------|:----------:|
|
||
| 对称加密 | SM4 | 128 位 |
|
||
| 非对称加密 | SM2 | 256 位 |
|
||
| 数字签名 | SM2 | — |
|
||
| 摘要算法 | SM3 | — |
|
||
|
||
### 盐值(Salt)要求
|
||
- 至少 8 字节,由安全随机数产生
|
||
- 每个存储入口盐值不同
|
||
- 推荐进行 50000 次哈希迭代(有性能限制时至少 5000 次)
|
||
|
||
---
|
||
|
||
## 三、Java 安全开发规范(关键项)
|
||
|
||
| 规则 | 说明 |
|
||
|------|------|
|
||
| **SQL 注入防护** | 使用参数化查询(`PreparedStatement`),禁止拼接用户输入 |
|
||
| **XML 注入防护** | 白名单校验 + 使用安全的 XML 库 |
|
||
| **命令注入防护** | 系统命令做白名单限制 |
|
||
| **XSS 防护** | 前端输出必须安全过滤/正确转义 |
|
||
| **文件上传** | 校验文件扩展名 + 大小限制 |
|
||
| **URL 跳转** | 白名单验证 URL 参数 |
|
||
| **异常处理** | 禁止抛出敏感数据信息;不允许忽略异常;不允许抛出 RuntimeException/Exception/Throwable |
|
||
| **序列化** | 不要序列化未加密敏感数据(用 `transient`);避免内存泄漏;反序列化避免恶意代码 |
|
||
| **I/O 操作** | 临时文件及时删除;避免在共享目录操作文件;避免外部进程阻塞在 I/O 流 |
|
||
| **密码存储** | 建议用字符数组存储密码(非 String) |
|
||
|
||
### 输入验证核心规则
|
||
1. **【强制】** 禁止对用户输入未过滤的参数进行 SQL 拼接
|
||
2. **【强制】** 禁止对用户输入未过滤的参数进行 XML 拼接
|
||
3. **【强制】** 禁止用户输入未经校验的系统命令作为入参
|
||
4. **【强制】** 禁止向前端输出未经安全过滤的数据
|
||
5. **【强制】** 禁止上传未经安全校验的文件
|
||
6. **【强制】** 页面跳转 URL 参数做白名单验证
|
||
7. **【强制】** 禁止向 `Runtime.exec()` 传递不可信数据
|
||
|
||
---
|
||
|
||
## 四、代码安全扫描要求
|
||
|
||
### 扫描时机
|
||
- **【强制 C1】** 软件上线发布前必须进行源代码安全扫描
|
||
- **【强制 C2】** 开发期间提交代码评审时需进行代码质量扫描
|
||
- **【强制 C3】** 代码安全扫描缺陷处理、审计、代码安全基线
|
||
|
||
### 扫描类型
|
||
| 类型 | 说明 |
|
||
|------|------|
|
||
| SCA | 软件成分分析 |
|
||
| SAST | 静态应用安全测试 |
|
||
| DAST | 动态应用安全测试 |
|
||
| SonarQube | 代码质量扫描 |
|
||
|
||
### 安全评估分级
|
||
- 阻断级问题 → 必须修复才能上线
|
||
- 严重级问题 → 必须修复
|
||
- 一般级问题 → 建议修复
|
||
- 轻微级问题 → 可选修复
|
||
|
||
---
|
||
|
||
## 五、研发云平台安全要求
|
||
|
||
- **【强制】** 系统接入须提供安全扫描、漏洞扫描、渗透测试报告
|
||
- **【强制】** API 对接使用 TLS 1.3+,敏感数据应用层加密(AES-256)
|
||
- **【强制】** 页面集成通过 iframe 须用 HTTPS + 公网可信证书
|
||
- **【强制】** CSP 头严格限制 iframe 来源,添加 sandbox 属性
|
||
- **【强制】** 链接跳转实施白名单机制
|
||
- **【强制】** 日志保留至少 6 个月
|
||
- **【强制】** 具备安全事件应急处置预案
|
||
- **【禁止】** 研发云与接入系统间禁止批量同步:用户信息、项目信息、用户角色和权限
|