权限系统检查清单

权限系统出了问题,后果往往不是「小 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 设置 SecureHttpOnlySameSite 属性

错误信息

  • 登录失败时返回通用错误信息,如「用户名或密码错误」,不要提示「用户名不存在」或「密码错误」
  • 密码找回、注册等流程同样使用通用提示,防止用户枚举

二、授权控制

认证解决「你是谁」,授权解决「你能做什么」。授权出问题,最常见的表现就是水平越权和垂直越权。

角色设计

  • 角色基于实际工作职能设计,不要基于系统模块或数据库表来建角色
  • 遵循最小权限原则(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

权限检查流程

权限检查不是一次性工作,而是贯穿开发和运维的持续过程。下面按阶段说明每个环节需要做什么。

流程图画布 · 115%
Mermaid 流程图加载中...

开发阶段

  • 在设计阶段明确角色模型和权限矩阵,形成文档
  • 实现统一的认证和授权中间件,不要在各处重复编写权限检查逻辑
  • 每个涉及数据的 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 个检查项。建议你把这份清单作为团队的标准流程:每次开发新的权限功能时对照检查,每次安全复盘时逐条验证。

权限系统的安全不取决于最严格的那个环节,而取决于最薄弱的那个环节。每一个检查项背后,都可能对应着一次真实的安全事故。

参考资料

  1. OWASP Top 10 - A01 Broken Access Control - OWASP 官方对失效访问控制的详细说明
  2. OWASP Authentication Cheat Sheet - OWASP 认证安全速查表
  3. Role-Based Access Control Best Practices - Cerbos - Cerbos 的 RBAC 最佳实践指南
  4. The Essential Security Checklist for User Identity - Logto - Logto 的用户身份安全清单
  5. RBAC Implementation Guide - IBM - IBM 的 RBAC 实施指南
  6. Why Broken Access Control Still Dominates the OWASP Top 10 - Auth0 - Auth0 对访问控制漏洞趋势的分析
  7. API Security Checklist - F5 - API 安全最佳实践清单
  8. A Case Study of the Capital One Data Breach - ResearchGate - Capital One 数据泄露案例分析