使用 Amazon Verified Permissions 实现精细授权 - 基于 Cedar 策略的访问控制
使用 Cedar 策略语言将授权逻辑从应用程序代码中外部化,通过 Cognito 集成实现基于令牌的授权判定。
Verified Permissions 概述
Verified Permissions 是以托管方式提供应用程序精细授权的服务,每秒可处理数千个授权请求。传统上,授权逻辑通常以 if 语句实现在应用程序代码中,策略变更需要代码部署。Verified Permissions 使用 Cedar 策略语言将授权规则外部化,无需代码部署即可反映策略变更。Cedar 是 Amazon 开发的开源授权策略语言,设计上支持形式验证。策略评估是确定性的 - 相同的输入始终返回相同的授权决定,使调试和审计变得容易。
Cedar 策略与 Cognito 集成
Cedar 策略由 permit (允许) 和 forbid (拒绝) 语句构成。以声明方式编写规则如「用户 A 允许对文档 X 执行 read 操作」「管理员角色允许对所有资源执行所有操作」。forbid 策略优先于 permit 策略,确保特定条件下的访问拒绝能可靠实施。条件子句 (when/unless) 可表达动态条件如「仅在工作时间内允许访问」「仅当 IP 地址在公司网络范围内时允许」。与 Cognito 的集成中,将 ID 令牌的声明 (组、自定义属性) 用作 Cedar 策略的主体属性,实现基于令牌的授权判定。常见模式是在 API Gateway 的授权器中部署 Lambda,调用 Verified Permissions 的 IsAuthorized API。
策略存储与批量授权
策略存储是 Cedar 策略的集合,按应用程序创建。通过 Schema 定义实体类型 (User、Document、Folder) 和操作 (Read、Write、Delete),自动化策略的语法验证。定义 Schema 可防止创建引用不存在的实体类型或操作的策略。IsAuthorized API 授权单个请求,BatchIsAuthorized API 一次最多授权 30 个请求。批量 API 在列表页面需要一次性判定多个资源的访问权限时非常有效,与重复调用单个 API 相比可降低延迟。通过策略模板定义通用模式,使用模板链接策略动态绑定用户或资源,提高策略管理效率。通过 CloudTrail 记录授权请求日志,用于访问模式分析和审计。 要全面学习 Verified Permissions 的最佳实践,请参阅技术书籍 (Amazon)。
设计最佳实践与常见陷阱
策略设计推荐使用 RBAC (基于角色) 和 ABAC (基于属性) 相结合的混合模型。基本权限通过角色管理,「仅文档所有者可删除」等细粒度条件通过属性表达。常见陷阱是策略数量增长导致调试困难。当单个策略存储中积累数千个策略时,追踪特定授权决定由哪个策略评估变得困难。对策是利用策略模板抽象通用模式,控制实体策略数量。此外,将 Cedar 形式验证工具集成到 CI 管道中,在部署前检测策略冲突 (同一请求同时适用 permit 和 forbid 的状态) 至关重要。实施授权结果缓存时,缓存 TTL 需要与策略变更即时反映需求之间做权衡。需要实时响应的应用设置较短的 TTL (数秒),读取频率高且策略变更罕见的应用可设置较长的 TTL (数分钟)。
与其他授权方式的比较
应用程序授权有多种方法,根据需求选择。IAM 策略专注于 AWS 资源的访问控制,不适用于应用程序内基于业务逻辑的授权 (如「仅文档创建者可编辑」)。Verified Permissions 负责这一应用层授权。Open Policy Agent (OPA) 可用 Rego 语言进行通用策略描述,但需要自行托管策略引擎并管理可用性。Verified Permissions 作为托管服务,由 AWS 保证可用性和可扩展性,运维负担较低。Cognito 基于组的授权适用于简单的 RBAC,但不支持资源级别的细粒度控制或策略的声明式管理。对于多租户 SaaS,按租户隔离策略存储以物理防止租户间策略干扰的设计是有效的。
Verified Permissions 的定价
Verified Permissions 按授权请求数计费。每 100 万请求约 15 美元,策略存储管理和 Schema 定义不产生额外费用。通过与 Cognito 的集成,分离用户认证 (Cognito) 和授权 (Verified Permissions),将授权逻辑从应用程序代码中外部化。对于请求量大的应用程序,可通过缓存授权结果来减少请求数以优化成本。注意 BatchIsAuthorized API 每次调用最多处理 30 个请求,但计费按包含的请求数 (即 30 个请求) 计算。
总结
Verified Permissions 是使用 Cedar 策略语言将应用程序授权外部化的服务。通过与 Cognito 的集成分离用户认证和授权,通过策略存储的 Schema 自动化语法验证。BatchIsAuthorized API 批量授权多个请求,策略模板提高通用模式的管理效率。RBAC 与 ABAC 的混合设计兼顾简单的角色管理和细粒度的条件访问控制,通过 CloudTrail 记录授权请求的审计日志。