安全最佳实践

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 地址活动
  • 大量的速率限制触发

定期安全审计

每月检查

  • 审查审计日志
  • 检查异常活动
  • 更新依赖包
  • 审查用户权限

每季度检查

  • 进行渗透测试
  • 审查安全策略
  • 更新安全文档
  • 培训团队成员

应急响应

发现安全问题时

  1. 立即禁用受影响的账号
  2. 通知所有相关用户
  3. 调查问题根源
  4. 修复漏洞
  5. 更新安全策略
  6. 记录事件和响应

联系我们

如果发现安全漏洞,请发送邮件至:

  • security@authguard.com

请勿在公开渠道披露安全漏洞。

合规性

GDPR

AuthGuard 支持 GDPR 合规:

  • 用户数据导出
  • 用户数据删除
  • 数据处理记录
  • 隐私政策

数据保留

  • 审计日志保留 90 天
  • 用户数据在账号删除后立即删除
  • 备份数据保留 30 天

总结

遵循这些最佳实践可以显著提高应用的安全性。记住:

  • 使用强密码和密钥
  • 启用 HTTPS
  • 定期审查日志
  • 保持软件更新
  • 监控异常活动

安全是一个持续的过程,而不是一次性的任务。