权限系统检查清单
权限系统出了问题,后果往往不是「小 bug」级别。一个越权访问可以让普通用户看到其他人的订单数据;一个认证绕过可以让攻击者直接接管管理员账号;一个审计缺失可以让安全事件发生几周后才发现。在 OWASP Top 10 中,Broken Access Control(失效的访问控制)已经连续多年排名第一,根据 Acunetix 的测试数据,94% 的被测应用都存在不同程度的访问控制缺陷。
这说明权限系统不是「写了就行」,而是需要系统性地检查、验证和持续维护。
本文提供一套完整的权限系统检查清单,覆盖认证安全、授权控制、数据安全、审计日志和合规要求五个维度。无论你是从零搭建权限系统,还是对现有系统做安全复盘,都可以直接拿来用。
权限系统检查清单的五个维度
权限系统涉及的环节很多,但归纳起来就是五件事:确认你是谁(认证安全)、控制你能做什么(授权控制)、保护你不该看到的数据(数据安全)、记录你做了什么(审计日志)、确保这些做法符合法规(合规要求)。
一、认证安全
认证是整个权限系统的第一道门。认证出问题,后面所有防线都可能被绕过。
密码策略
- 密码最小长度不低于 8 个字符(启用 MFA 时)或 15 个字符(未启用 MFA 时)
- 密码最大长度至少支持 64 个字符,以支持密码短语
- 允许使用所有字符类型,包括 Unicode 和空白字符,不要设置「必须包含大写字母、数字和特殊符号」的组合规则
- 不要静默截断密码——如果用户设了 30 位密码,存储时不能只取前 16 位
- 使用 Have I Been Pwned 等服务检查密码是否已在已知泄露数据库中出现
- 不要强制用户定期更换密码,只在确认泄露或疑似被入侵时要求重置
密码存储
- 使用 bcrypt、Argon2 或 scrypt 等专用哈希算法存储密码,不要用 MD5 或 SHA-256
- 每次哈希使用独立的随机 salt
- 使用常量时间比较函数验证密码,防止时序攻击
防暴力破解
- 实现账户锁定策略:连续 N 次失败后锁定账户,锁定计数器关联到账户而非 IP
- 实现登录限速(throttling),使用指数退避策略
- 在连续失败几次后要求验证码(CAPTCHA)
- 启用多因素认证(MFA),根据 Microsoft 的分析,MFA 可以阻止约 99.9% 的账户接管攻击
会话管理
- 登录成功后生成新的 Session ID,防止会话固定攻击
- Session ID 足够随机且长度充足(至少 128 bit)
- 设置合理的会话过期时间,空闲超时和绝对超时都要有
- 用户登出后、密码修改后、检测到异常后,立即销毁旧会话
- Cookie 设置
Secure、HttpOnly、SameSite属性
错误信息
- 登录失败时返回通用错误信息,如「用户名或密码错误」,不要提示「用户名不存在」或「密码错误」
- 密码找回、注册等流程同样使用通用提示,防止用户枚举
二、授权控制
认证解决「你是谁」,授权解决「你能做什么」。授权出问题,最常见的表现就是水平越权和垂直越权。
角色设计
- 角色基于实际工作职能设计,不要基于系统模块或数据库表来建角色
- 遵循最小权限原则(Principle of Least Privilege),每个角色只拥有完成工作所需的最少权限
- 建立清晰的角色层级,利用继承减少重复配置,例如 admin > manager > viewer
- 实施职责分离(Separation of Duties),关键操作不能由单一角色完成,比如「审批」和「发起」不能是同一个角色
- 角色数量保持精简,避免权限膨胀——如果一个角色的权限超过 50 项,通常意味着需要拆分
权限检查
- 所有权限检查必须在服务端执行,不要依赖前端隐藏按钮或菜单来控制访问
- API 层面对每个请求进行权限验证,不要假设「通过了网关就是合法的」
- 对资源访问实施对象级别的授权检查(防止 IDOR),例如用户 A 不能通过修改 URL 中的 ID 访问用户 B 的订单
- 权限检查结果要有明确的默认行为:未授权时默认拒绝,而不是默认放行
特殊场景
- 多租户场景下,严格隔离不同租户的数据,每次查询都带上租户 ID 条件
- API 版本升级时,确认旧版本 API 的权限检查没有降级
- 批量操作接口要检查每一项数据的权限,不能因为「有批量权限」就跳过单项检查
- 文件上传和下载接口同样需要权限检查
三、数据安全
权限系统的目标最终是保护数据。即使认证和授权都正确,数据存储和传输环节的安全缺陷也可能导致数据泄露。
传输安全
- 所有认证页面和已认证页面必须通过 HTTPS 访问
- API 通信使用 TLS 1.2 或更高版本
- 内部服务间通信如果在可信网络内可以用 HTTP,但边界处必须加密
存储安全
- 敏感数据(密码、Token、密钥)加密存储,不要明文写入数据库
- 数据库备份文件同样要加密
- 日志中不要记录敏感信息——不要打印密码、完整的 Token 或信用卡号
- 用户个人信息在展示时做脱敏处理,例如手机号显示为
138****5678
Token 和密钥管理
- API Key 和 Token 设置有效期,不要生成永不过期的 Token
- 使用短期 Token + Refresh Token 的方案,Refresh Token 设置轮换机制
- 密钥存储在密钥管理服务(如 AWS Secrets Manager、HashiCorp Vault)中,不要硬编码在代码里
- 密钥泄露后立即轮换,不要只修改配置文件
四、审计日志
没有审计日志的权限系统等于没有监控的金库——被入侵了都不知道。
日志记录
- 记录所有认证成功和失败事件
- 记录所有权限变更操作(角色分配、权限修改)
- 记录所有敏感操作(数据删除、权限提升、配置修改)
- 记录每次访问被拒绝的事件,包括尝试访问的资源、用户身份和时间
- 日志中包含足够的上下文信息:用户 ID、IP 地址、User-Agent、时间戳、操作类型和目标资源
日志保护
- 审计日志写入后不可篡改,使用追加写入或发送到独立的日志系统
- 日志存储设置访问权限,只有安全团队和审计人员可以查看
- 日志保留时间满足合规要求,通常不少于 180 天,金融和医疗行业可能要求更长
异常检测
- 实现实时的异常检测:短时间内大量登录失败、非工作时间的敏感操作、异常的权限提升请求
- 设置告警规则,关键安全事件实时通知安全团队
- 定期审查日志,发现潜在的权限滥用模式
五、合规要求
不同行业和地区有不同的合规要求,权限系统的设计需要把这些因素考虑进去。
通用合规
- GDPR:用户有权查看、修改和删除自己的个人数据;数据最小化原则;需要明确的法律依据处理数据
- SOC 2:要求实施逻辑访问控制、记录访问审计、定期审查权限分配
- ISO 27001:信息安全管理体系要求,包括访问控制策略、用户注册和注销流程
行业合规
- PCI DSS:处理信用卡数据的系统,要求限制对持卡人数据的访问、实施访问控制机制、定期测试安全系统和流程
- HIPAA:医疗数据系统,要求实施技术访问控制、审计控制、完整性控制
- 国内《个人信息保护法》和《数据安全法》:要求数据分类分级、访问控制、安全审计
合规实践
- 建立用户入职和离职的权限分配/回收流程
- 定期(至少每季度)进行权限审查,回收不再需要的权限
- 维护权限变更的完整审计追踪
- 准备合规审计所需的文档和证据
常见错误和避坑指南
在实际项目中,权限系统的问题往往不是「完全没做」,而是「做了一半」或者「以为做了但没生效」。下面是一些高频错误。
| 常见错误 | 风险说明 | 正确做法 |
|---|---|---|
| 只在前端隐藏按钮控制权限 | 攻击者可以直接调用 API 绕过限制 | 服务端每个 API 都做权限校验 |
| 用自增 ID 作为资源标识符 | 攻击者可以遍历 ID 访问他人数据(IDOR) | 使用不可猜测的标识符(UUID),并加上归属校验 |
| 所有用户共用一个「已登录」权限 | 登录后可以做任何事,没有角色区分 | 实现 RBAC 或 ABAC,区分不同角色的权限 |
| 权限写死在代码里 | 修改权限需要重新部署 | 将权限配置外置到数据库或配置中心 |
| 忘记检查 API 旧版本的权限 | 旧版本 API 成为权限绕过入口 | 旧版本 API 应用相同或更严格的权限检查 |
| 审计日志只记录成功操作 | 无法发现攻击尝试 | 同时记录成功和失败的操作 |
| Token 永不过期 | Token 泄露后永久有效 | 设置合理的过期时间,使用 Refresh Token 轮换 |
| 密码用 MD5 存储 | 容易被彩虹表破解 | 使用 bcrypt / Argon2 + 独立 salt |
权限检查流程
权限检查不是一次性工作,而是贯穿开发和运维的持续过程。下面按阶段说明每个环节需要做什么。
开发阶段
- 在设计阶段明确角色模型和权限矩阵,形成文档
- 实现统一的认证和授权中间件,不要在各处重复编写权限检查逻辑
- 每个涉及数据的 API 都加上归属校验(ownership check)
- 在代码中预埋审计日志点,记录关键操作
测试阶段
- 编写专门的权限测试用例,覆盖水平越权、垂直越权、未认证访问等场景
- 使用自动化安全扫描工具(如 OWASP ZAP、Burp Suite)检测常见漏洞
- 让非开发者尝试越权操作,验证系统是否有效拦截
上线前
- 对照权限矩阵逐一检查每个角色的实际权限是否与预期一致
- 确认所有敏感操作都有审计日志
- 检查合规要求是否满足(GDPR、PCI DSS 等)
- 进行渗透测试或邀请第三方安全审计
上线后
- 部署实时异常检测和告警
- 定期(至少每季度)审查用户权限,回收离职人员和不再需要的权限
- 定期轮换密钥和 Token
- 关注安全社区的新漏洞披露,及时更新依赖和修复
真实案例分析
案例一:GitHub IDOR 漏洞(2012)
2012 年,GitHub 被发现存在一个严重的 IDOR 漏洞。攻击者发现,修改邮箱地址的接口只验证了请求是否来自已登录用户,没有验证请求中指定的邮箱是否属于当前用户。攻击者可以通过修改请求参数中的邮箱 ID,将其他用户的邮箱地址修改为自己的邮箱,从而接管任意账户。
这个漏洞的本质是:资源访问接口只做了「是否登录」的检查,缺少「是否有权操作这个资源」的检查。
教训: 每个涉及资源操作的 API,都必须校验当前用户是否有权操作目标资源。不能因为是「修改自己的信息」就省略归属校验。
案例二:Capital One 数据泄露(2019)
2019 年,Capital One 遭受数据泄露,约 1.06 亿人的个人信息和财务数据被泄露。攻击者利用了一个配置错误的 Web 应用防火墙(WAF),通过服务端请求伪造(SSRF)获取了 AWS IAM 角色的临时凭证,进而访问了 S3 存储桶中的大量敏感数据。
这个事件的核心问题是权限配置过于宽泛——IAM 角色拥有的权限远超实际需要,攻击者获取凭证后可以访问大量不相关的数据。
教训: 遵循最小权限原则不是一句口号。IAM 角色、Service Account、API Key 的权限都要精确到具体操作和具体资源范围,不能用「通配符全开」的方式配置。
权限系统完整检查清单
以下是可以直接使用的完整检查清单,共 25 项,分为 5 个类别。
认证安全(5 项)
- 密码最小长度不低于 8 字符,最大长度至少支持 64 字符
- 密码使用 bcrypt / Argon2 存储,每次使用独立 salt
- 实现登录失败锁定和限速机制,防止暴力破解
- 启用多因素认证(MFA),至少对管理员角色强制启用
- 登录失败返回通用错误信息,不泄露用户是否存在
授权控制(6 项)
- 角色基于工作职能设计,遵循最小权限原则
- 所有权限检查在服务端执行,不依赖前端控制
- 每个资源操作 API 校验用户是否有权操作目标资源(防 IDOR)
- 多租户场景下严格隔离租户数据
- 实施职责分离,关键操作不由单一角色完成
- API 旧版本应用相同或更严格的权限检查
数据安全(5 项)
- 全站 HTTPS,TLS 1.2 以上
- 敏感数据加密存储,备份文件同样加密
- 日志中不记录密码、完整 Token 等敏感信息
- Token 设置有效期,使用 Refresh Token 轮换
- 密钥存储在密钥管理服务中,不硬编码
审计日志(5 项)
- 记录所有认证成功和失败事件
- 记录所有权限变更和敏感操作
- 日志包含完整上下文(用户 ID、IP、时间、操作、目标资源)
- 日志不可篡改,独立存储,保留期不少于 180 天
- 实现异常检测和实时告警
合规要求(4 项)
- 满足目标市场的法规要求(GDPR / 个人信息保护法 / PCI DSS 等)
- 建立用户入职和离职的权限分配 / 回收流程
- 至少每季度进行一次权限审查
- 维护权限变更的完整审计追踪
工具和服务推荐
| 类别 | 工具 / 服务 | 用途 |
|---|---|---|
| 认证服务 | Auth0 / Clerk / Logto | 开箱即用的认证方案,支持 MFA、SSO |
| 授权引擎 | Cerbos / Oso / Open Policy Agent | 集中式策略管理,支持 RBAC / ABAC |
| 安全扫描 | OWASP ZAP / Burp Suite | 自动化检测权限漏洞 |
| 密钥管理 | AWS Secrets Manager / HashiCorp Vault | 安全存储和轮换密钥 |
| 审计日志 | ELK Stack / Datadog / Splunk | 集中式日志管理和异常检测 |
| 合规管理 | Vanta / Drata | 自动化合规监控和证据收集 |
总结
权限系统不是一次开发完成就万事大吉的事情。它需要在设计阶段认真规划、在开发阶段仔细实现、在测试阶段充分验证、在上线后持续监控和审查。
本文的检查清单涵盖了认证安全、授权控制、数据安全、审计日志和合规要求五个维度共 25 个检查项。建议你把这份清单作为团队的标准流程:每次开发新的权限功能时对照检查,每次安全复盘时逐条验证。
权限系统的安全不取决于最严格的那个环节,而取决于最薄弱的那个环节。每一个检查项背后,都可能对应着一次真实的安全事故。
参考资料
- OWASP Top 10 - A01 Broken Access Control - OWASP 官方对失效访问控制的详细说明
- OWASP Authentication Cheat Sheet - OWASP 认证安全速查表
- Role-Based Access Control Best Practices - Cerbos - Cerbos 的 RBAC 最佳实践指南
- The Essential Security Checklist for User Identity - Logto - Logto 的用户身份安全清单
- RBAC Implementation Guide - IBM - IBM 的 RBAC 实施指南
- Why Broken Access Control Still Dominates the OWASP Top 10 - Auth0 - Auth0 对访问控制漏洞趋势的分析
- API Security Checklist - F5 - API 安全最佳实践清单
- A Case Study of the Capital One Data Breach - ResearchGate - Capital One 数据泄露案例分析