安全文档
概览
创建包括政策、指南、合规要求和最佳实践在内的全面安全文档,用于安全应用开发和操作。
何时使用
- 安全政策
- 合规文档(SOC 2、GDPR、HIPAA)
- 安全指南和最佳实践
- 事件响应计划
- 访问控制政策
- 数据保护政策
- 漏洞披露政策
- 安全审计报告
安全政策模板
# 安全政策
**版本:** 2.0
**最后更新:** 2025-01-15
**审核计划:** 季度
**所有者:** 安全团队
**联系:** security@example.com
## 目录
1. [概览](#概览)
2. [范围](#范围)
3. [认证与访问控制](#认证-访问控制)
4. [数据保护](#数据保护)
5. [应用安全](#应用安全)
6. [基础设施安全](#基础设施安全)
7. [事件响应](#事件响应)
8. [合规](#合规)
9. [安全培训](#安全培训)
---
## 1. 概览
### 目的
本安全政策定义了安全标准、实践和程序,以保护[公司名称]的信息资产、客户数据和基础设施。
### 目标
- 保护数据的机密性、完整性和可用性
- 遵守监管要求(GDPR、SOC 2等)
- 最小化安全风险和漏洞
- 明确安全责任
- 定义事件响应程序
### 范围
本政策适用于:
- 所有员工、承包商和第三方供应商
- 所有系统、应用程序和基础设施
- 所有客户和公司数据
- 包括本地和云资源
---
## 2. 认证与访问控制
### 2.1 密码要求
**最低要求:**
- 长度:最少12个字符
- 复杂性:大小写字母、数字和符号混合
- 历史:不能重复最后5个密码
- 过期:90天(特权账户)
- 锁定:5次失败尝试触发30分钟锁定
**示例强密码:**
好的:MyC0mplex!Pass#2025 坏的:password123
**实施:**
```javascript
// 密码验证
function validatePassword(password) {
const minLength = 12;
const requirements = {
length: password.length >= minLength,
uppercase: /[A-Z]/.test(password),
lowercase: /[a-z]/.test(password),
number: /[0-9]/.test(password),
special: /[!@#$%^&*(),.?":{}|<>]/.test(password)
};
return Object.values(requirements).every(Boolean);
}
2.2 多因素认证(MFA)
要求:
- 强制用于:
- 生产系统访问
- 管理账户
- 面向客户的应用程序
- VPN访问
- 源代码仓库
支持方法:
- TOTP(Google Authenticator, Authy)
- SMS(仅备份,非主用)
- 硬件令牌(YubiKey)
- 生物识别(指纹、Face ID)
实施:
// MFA验证
async function verifyMFA(userId, token) {
const user = await User.findById(userId);
const secret = user.twoFactorSecret;
// 验证TOTP令牌
const isValid = speakeasy.totp.verify({
secret,
encoding: 'base32',
token,
window: 2 // 允许1分钟时间漂移
});
if (isValid) {
await logSecurityEvent('mfa_success', userId);
return true;
}
await logSecurityEvent('mfa_failure', userId);
return false;
}
2.3 基于角色的访问控制(RBAC)
最小权限原则: 用户获得其角色所需的最小访问权限。
角色:
| 角色 | 权限 | 访问级别 |
|---|---|---|
| 管理员 | 全系统访问 | 读写/删除全部 |
| 开发者 | 代码、暂存环境 | 读写开发/暂存 |
| 支持 | 客户数据(有限) | 读取客户数据 |
| 审计员 | 日志、审计跟踪 | 只读全部 |
| 用户 | 自己的数据 | 读写自己的数据 |
实施:
// 权限中间件
const requirePermission = (permission) => {
return async (req, res, next) => {
const user = req.user;
const userPermissions = await getUserPermissions(user.role);
if (!userPermissions.includes(permission)) {
await logSecurityEvent('unauthorized_access', user.id, {
permission,
endpoint: req.path
});
return res.status(403).json({
error: '权限不足',
required: permission
});
}
next();
};
};
// 使用
app.delete('/api/users/:id', requirePermission('users:delete'), deleteUser);
3. 数据保护
3.1 数据分类
| 分类 | 描述 | 示例 | 保护 |
|---|---|---|---|
| 公开 | 非敏感,公开可用 | 营销材料 | 无需保护 |
| 内部 | 仅限内部使用 | 公司政策 | 访问控制 |
| 机密 | 敏感商业数据 | 财务报告 | 加密+MFA |
| 受限 | 高度敏感 | PII、密码、密钥 | 加密+严格访问 |
3.2 加密标准
数据静态存储:
- 算法:AES-256
- 密钥管理:AWS KMS / HashiCorp Vault
- 数据库:透明数据加密(TDE)
// 加密敏感数据存储前
const crypto = require('crypto');
function encryptData(plaintext, key) {
const iv = crypto.randomBytes(16);
const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);
let encrypted = cipher.update(plaintext, 'utf8', 'hex');
encrypted += cipher.final('hex');
const authTag = cipher.getAuthTag();
return {
encrypted,
iv: iv.toString('hex'),
authTag: authTag.toString('hex')
};
}
数据传输中:
- 协议:TLS 1.3(最低TLS 1.2)
- 密码套件:仅限强密码套件
- 证书:有效的SSL/TLS证书
# Nginx TLS配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
3.3 数据保留
| 数据类型 | 保留期限 | 删除方法 |
|---|---|---|
| 客户数据 | 账户删除+30天 | 安全擦除 |
| 访问日志 | 90天 | 自动删除 |
| 审计日志 | 7年 | 归档后删除 |
| 备份 | 30天 | 覆盖+粉碎 |
4. 应用安全
4.1 安全编码实践
输入验证:
// ✅ 好的 - 验证和清理输入
const validator = require('validator');
function createUser(req, res) {
const { email, name } = req.body;
// 验证电子邮件
if (!validator.isEmail(email)) {
return res.status(400).json({ error: '无效电子邮件' });
}
// 清理名称
const sanitizedName = validator.escape(name);
// 使用参数化查询
db.query(
'INSERT INTO users (email, name) VALUES ($1, $2)',
[email, sanitizedName]
);
}
// ❌ 坏的 - SQL注入漏洞
function createUserBad(req, res) {
const { email, name } = req.body;
db.query(`INSERT INTO users VALUES ('${email}', '${name}')`);
}
XSS防护:
// 内容安全策略头
app.use((req, res, next) => {
res.setHeader(
'Content-Security-Policy',
"default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline';"
);
next();
});
// 清理输出
import DOMPurify from 'isomorphic-dompurify';
function renderComment(comment) {
const clean = DOMPurify.sanitize(comment, {
ALLOWED_TAGS: ['b', 'i', 'em', 'strong'],
ALLOWED_ATTR: []
});
return clean;
}
4.2 安全头
// 安全头中间件
app.use((req, res, next) => {
// 防止点击劫持
res.setHeader('X-Frame-Options', 'DENY');
// XSS保护
res.setHeader('X-Content-Type-Options', 'nosniff');
res.setHeader('X-XSS-Protection', '1; mode=block');
// HTTPS强制执行
res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
// 引荐政策
res.setHeader('Referrer-Policy', 'strict-origin-when-cross-origin');
next();
});
4.3 API安全
速率限制:
const rateLimit = require('express-rate-limit');
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15分钟
max: 100, // 每个IP限制每个windowMs 100个请求
message: '此IP请求过多',
standardHeaders: true,
legacyHeaders: false
});
app.use('/api/', limiter);
5. 基础设施安全
5.1 网络安全
防火墙规则:
- 默认拒绝所有
- 仅允许所需端口
- 白名单信任IP用于管理访问
# 示例iptables规则
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允许特定IP的SSH
iptables -A INPUT -p tcp -s 203.0.113.0/24 --dport 22 -j ACCEPT
# 允许HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
5.2 服务器加固
检查清单:
- [ ] 禁用root SSH登录
- [ ] 使用SSH密钥,禁用密码认证
- [ ] 自动安装安全更新
- [ ] 启用防火墙(ufw/iptables)
- [ ] 配置fail2ban
- [ ] 禁用未使用的服务
- [ ] 启用审计日志
- [ ] 设置入侵检测(AIDE, Tripwire)
6. 事件响应
6.1 安全事件严重性
| 严重性 | 描述 | 响应时间 | 示例 |
|---|---|---|---|
| 严重 | 大规模数据泄露,勒索软件 | 立即 | 数据库暴露,加密被破坏 |
| 高 | 重大安全漏洞 | < 1小时 | 管理账户被入侵,DDoS |
| 中 | 有限的安全问题 | < 4小时 | XSS漏洞,钓鱼尝试 |
| 低 | 轻微安全问题 | < 24小时 | 弱密码,过时库 |
6.2 事件响应计划
阶段1:检测(0-15分钟)
- 通过监控/用户报告接收警报
- 分类严重性级别
- 组建事件响应团队
- 创建事件工单
阶段2:遏制(15-60分钟)
- 隔离受影响系统
- 阻止恶意IP/域名
- 吊销被入侵的凭证
- 启用额外监控
阶段3:调查(1-4小时)
- 分析日志和取证
- 确定攻击向量
- 确定泄露范围
- 记录发现
阶段4:根除(4-24小时)
- 移除恶意软件/后门
- 修补漏洞
- 更新安全控制
- 验证系统已清理
阶段5:恢复(24-48小时)
- 从干净的备份中恢复
- 逐步恢复服务
- 监控重新感染
- 更新文档
阶段6:事件后(1周)
- 进行事后分析
- 更新安全政策
- 实施预防措施
- 培训团队学习经验教训
7. 合规
7.1 GDPR合规
要求:
- [ ] 数据处理记录
- [ ] 隐私政策
- [ ] 饼干同意
- [ ] 数据主体权利(访问、删除、可移植性)
- [ ] 数据泄露通知(72小时)
- [ ] 数据保护影响评估(DPIA)
7.2 SOC 2合规
信任服务标准:
- 安全: 防止未经授权的访问
- 可用性: 系统按承诺可用
- 处理完整性: 处理是完整和准确的
- 机密性: 保密信息受到保护
- 隐私: 个人信息得到适当处理
8. 漏洞披露
报告安全问题
联系: security@example.com PGP密钥: [链接到公钥]
奖励计划:
- 严重:$5,000 - $10,000
- 高:$1,000 - $5,000
- 中:$500 - $1,000
- 低:$100 - $500
范围:
- ✅ 范围内:生产系统、API、移动应用
- ❌ 范围外:测试环境、第三方服务
9. 安全审计日志
所有安全事件必须记录:
function logSecurityEvent(event, userId, metadata = {}) {
logger.security({
timestamp: new Date().toISOString(),
event,
userId,
ip: metadata.ip,
userAgent: metadata.userAgent,
resource: metadata.resource,
outcome: metadata.outcome
});
}
// 记录事件:
// - login_success, login_failure
// - password_change
// - mfa_enabled, mfa_disabled
// - permission_change
// - data_export
// - admin_action