安全最佳实践
AuthGuard 已经实施了多层安全措施,但您仍需要遵循以下最佳实践来确保应用的安全性。
环境变量安全
必须设置的环境变量
# 强随机JWT密钥(至少32字符)
JWT_SECRET=your-super-secret-jwt-key-at-least-32-characters
# 数据库连接字符串
DATABASE_URL=postgresql://user:password@host:5432/database
# 管理员密码
ADMIN_PASSWORD=your-strong-admin-password
生成强随机密钥
# Linux/Mac
openssl rand -base64 32
# Node.js
node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"
# Python
python -c "import secrets; print(secrets.token_urlsafe(32))"
密码安全
密码强度要求
AuthGuard 强制执行以下密码策略:
- 最少 8 个字符
- 必须包含字母
- 必须包含数字
- 最多 128 个字符
建议的密码策略
对于生产环境,建议要求更强的密码:
- 至少 12 个字符
- 包含大小写字母
- 包含数字
- 包含特殊字符
- 不使用常见密码
速率限制
AuthGuard 已实施以下速率限制:
| API | 时间窗口 | 最大尝试 | 锁定时间 | |-----|---------|---------|---------| | 登录 | 15分钟 | 5次 | 30分钟 | | 注册 | 1小时 | 3次 | - | | 验证 | 5分钟 | 10次 | 15分钟 |
生产环境建议
对于生产环境,建议使用 Redis 替代内存速率限制器:
import Redis from 'ioredis';
const redis = new Redis(process.env.REDIS_URL);
export async function checkRateLimit(key: string, limit: number, window: number) {
const current = await redis.incr(key);
if (current === 1) {
await redis.expire(key, window);
}
return current <= limit;
}
API 密钥安全
保护 AppKey 和 AppSecret
- 永远不要在客户端代码中硬编码
AppSecret - 使用环境变量存储敏感信息
- 定期轮换
AppSecret - 为不同环境使用不同的密钥
密钥轮换
# 1. 生成新的 AppSecret
new_secret = generate_app_secret()
# 2. 更新应用配置
update_application(app_id, app_secret=new_secret)
# 3. 更新所有客户端配置
# 4. 验证新密钥工作正常
# 5. 废弃旧密钥
网络安全
启用 HTTPS
生产环境必须使用 HTTPS:
server {
listen 443 ssl http2;
server_name api.yourdomain.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
# 强制使用 TLS 1.2+
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
}
CORS 配置
限制允许的来源:
// next.config.js
module.exports = {
async headers() {
return [
{
source: '/api/:path*',
headers: [
{ key: 'Access-Control-Allow-Origin', value: 'https://yourdomain.com' },
{ key: 'Access-Control-Allow-Methods', value: 'GET,POST,PUT,DELETE' },
{ key: 'Access-Control-Allow-Headers', value: 'Authorization,Content-Type' },
],
},
];
},
};
审计日志
AuthGuard 自动记录以下操作:
- 用户登录/登出
- 用户注册
- 应用创建/更新/删除
- 用户创建/更新/删除/封禁
- 设备绑定/解绑
查询审计日志
-- 查看最近的登录尝试
SELECT * FROM audit_logs
WHERE action = 'LOGIN'
ORDER BY created_at DESC
LIMIT 100;
-- 查看特定用户的操作
SELECT * FROM audit_logs
WHERE user_id = 123
ORDER BY created_at DESC;
-- 查看失败的登录尝试
SELECT ip_address, COUNT(*) as attempts
FROM audit_logs
WHERE action = 'LOGIN'
AND created_at > NOW() - INTERVAL '1 hour'
GROUP BY ip_address
HAVING COUNT(*) > 5;
数据库安全
连接安全
- 使用 SSL/TLS 连接数据库
- 限制数据库访问 IP
- 使用强密码
- 定期备份数据
防止 SQL 注入
AuthGuard 使用参数化查询防止 SQL 注入:
// ✓ 安全 - 使用参数化查询
await pool.query('SELECT * FROM users WHERE id = $1', [userId]);
// ✗ 不安全 - 字符串拼接
await pool.query(`SELECT * FROM users WHERE id = ${userId}`);
监控和告警
设置监控
使用 Sentry 或类似工具监控错误:
import * as Sentry from '@sentry/nextjs';
Sentry.init({
dsn: process.env.SENTRY_DSN,
environment: process.env.NODE_ENV,
tracesSampleRate: 1.0,
});
告警规则
设置以下告警:
- 登录失败率超过 10%
- API 错误率超过 5%
- 数据库连接失败
- 异常的 IP 地址活动
- 大量的速率限制触发
定期安全审计
每月检查
- 审查审计日志
- 检查异常活动
- 更新依赖包
- 审查用户权限
每季度检查
- 进行渗透测试
- 审查安全策略
- 更新安全文档
- 培训团队成员
应急响应
发现安全问题时
- 立即禁用受影响的账号
- 通知所有相关用户
- 调查问题根源
- 修复漏洞
- 更新安全策略
- 记录事件和响应
联系我们
如果发现安全漏洞,请发送邮件至:
- security@authguard.com
请勿在公开渠道披露安全漏洞。
合规性
GDPR
AuthGuard 支持 GDPR 合规:
- 用户数据导出
- 用户数据删除
- 数据处理记录
- 隐私政策
数据保留
- 审计日志保留 90 天
- 用户数据在账号删除后立即删除
- 备份数据保留 30 天
总结
遵循这些最佳实践可以显著提高应用的安全性。记住:
- 使用强密码和密钥
- 启用 HTTPS
- 定期审查日志
- 保持软件更新
- 监控异常活动
安全是一个持续的过程,而不是一次性的任务。