# APP授权系统：Amazon Verified Permissions最佳实践

企业有自建的web或者APP，传统的授权模块需要编写大量代码实现授权逻辑，并且如果业务或者安全审计人员需要查看代码才能理解逻辑，开发并不经常维护代码逻辑文档。如果调整授权逻辑意味着要调整代码，需要业务，产品和开发多次沟通，费时费力。如果使用AVP，则能够像写IAM策略一样写自建应用的授权逻辑，不仅方便业务或者安全审核查看和理解，也节省了开发的时间，可以投入到业务的核心功能实现上。

## 什么是Amazon Verified Permissions？

Amazon Verified Permissions 是为了解决现代应用程序中复杂访问控制需求而设计的，特别适用于那些需要细粒度权限管理的场合。在企业应用场景中，它能够根据员工的职位、部门以及特定的业务规则，精确地控制对敏感数据的访问权限，从而降低数据泄露的风险。在多用户协作平台上，通过细化不同角色（项目经理、开发人员或测试人员）在不同上下文（项目阶段、任务紧急性等）下的访问权限，使得项目管理更加高效、透明。

在服务于消费者的应用程序中，Amazon Verified Permissions 也表现出色。它能够根据用户的购买历史、浏览习惯等个性化信息，动态地调整内容或服务的访问权限，为用户提供更加定制化的体验。例如，在一个在线教育平台，根据学生的学习进度和课程订阅情况调整其对不同课程内容的访问权限。

对于物联网（IoT）领域，Amazon Verified Permissions 也极具应用价值。随着智能家居、智能城市等概念的普及，如何安全、有效地管理大量设备成为一大挑战。Amazon Verified Permissions 可以根据设备的位置、状态以及用户的使用场景，实时调整对设备的控制权限，从而有效提升整个系统的安全性和灵活性。

总的来说，Amazon Verified Permissions 的应用场景广泛，能够帮助开发人员在保障安全性的同时，提高应用程序的灵活性和用户体验。通过使用[Cedar](https://docs.cedarpolicy.com/)（一种可表达和可分析的开源策略语言），一个表达能力丰富且易于分析的策略语言，开发人员可以轻松定义复杂的访问控制策略，从而满足日益增长的权限管理需求。

## 传统授权方式V.S. AVP授权

### 自建权限系统

我们需要创建一个自定义数据库模式来支持该系统。我们是否使用角色、组、属性？我们支持通配符吗？Regex?如果我们创建的数据库行相互冲突（一行说允许，另一行说拒绝），那么我们如何解决冲突或计算优先级？

除了最简单的用例，我们都需要一个用户界面来管理权限。这很好，但如果我们对应用程序做出任何大的改动，都需要进行数据库更新和重构。

不知不觉中，你已经构建了整个应用程序来支持权限。这非常耗时。即使您使用的是开源开发人员工具包，构建一个系统来安全地存储、管理、评估和报告权限也会占用宝贵的开发人员资源，而无法构建您需要交付的功能。

要做好这一点非常困难。随着应用程序的复杂性和规模不断扩大，满足新需求的挑战也越来越大。在受监管的垂直行业中，对治理功能的要求会很高，例如能够让审计人员了解谁有权访问哪些内容，以及谁赋予了他们访问权限。

消费者应用程序需要扩展到数百万用户，同时保持可接受的性能水平。要做到这一点并不容易，尤其是在权限由基于角色和属性的规则组合而成的情况下。

### AVP授权

您可以使用Verified Permissions增强权限控制。决定用户可以看到什么级别的UI界面，允许使用什么API。

1. **UI权限** 允许开发者控制用户允许看到什么。比如，银行应用中可能需要决定是否转账按钮在一个特定的账户是可以看见的。
2. **API权限** 允许开发者控制用户可以用什么。比如，银行应用中可能需要决定用户是否从某个账户允许发起一次转账。

## 构建Zero Trust的应用

构建基于零信任架构的应用程序对于提高系统的安全性和可靠性至关重要。Amazon Verified Permissions 与 Cedar 结合，为开发人员提供了一个强大的工具，以实现这一目标。通过精细化的权限管理和动态权限调整，开发者可以为其应用程序实施零信任安全模型，大大降低潜在的安全威胁。

### 实施零信任模型的步骤

1. **识别和分类数据和资源：** 首先，需要识别应用程序中的敏感数据和关键资源，并进行分类，确定哪些数据和资源需要特别保护。
2. **最小权限原则：** 基于用户的角色和操作需求，应用最小权限原则，确保用户仅能访问其执行任务所必需的信息和资源。
3. **动态权限调整：** 利用 Amazon Verified Permissions 结合 Cedar，根据用户行为、设备状态、应用上下文等因素，实时调整用户访问权限。
4. **连续验证：** 在用户会话期间持续验证用户的身份和权限，确保安全性。任何异常行为都应触发重新验证流程。
5. **监控和审计：** 实现全面的监控和审计机制，记录所有权限相关的操作和决策，以便在需要时进行审查和分析。

通过实施这些步骤，开发人员可以建立一个强大的零信任架构，有效地保护其应用程序不受内外部威胁的影响。Cedar 提供的例子，如 [tinytodo](https://github.com/cedar-policy/cedar-examples/blob/main/tinytodo)，展示了如何在实践中应用这些原则，建立安全的应用程序。这不仅提高了应用的安全性，还能提升用户的信任和满意度。

通过深入理解和应用这些原则和工具，开发人员可以有效地构建更安全、更灵敏的应用程序，为用户提供安全可靠的服务。

## cedar-examples

\[Github][Cedar Examples](https://github.com/cedar-policy/cedar-examples/tree/main) - [`tinytodo`](https://github.com/cedar-policy/cedar-examples/blob/main/tinytodo)

客户端使用Python编写，服务端使用Rust编写，服务端调用Cedar的授权能力为客户端提供授权。这个应用程序允许用户添加待办清单。

通过Cedar可以实现零信任，当用户要执行一个操作的时候，服务端询问Cedar，Cedar授权引擎会根据Cedar policies以及相关的应用程序数据（清单，用户，等等）来评估是否授予权限，如果返回结果Allow，则用户可以执行操作，如果返回结果是Deny，则应用程序报告操作没有权限。

如何搭建这个例子参见Github [Building TinyTodo](https://github.com/cedar-policy/cedar-examples/blob/main/tinytodo/TUTORIAL.md)。搭建好后就可以通过修改Cedar policies观察权限控制的效果。

## 参考资料

\[workshop] [Cedar policy language in action](https://catalog.workshops.aws/cedar-policy-language-in-action/en-US)

\[workshop] [Amazon Verified Permissions Workshop Re:Inforce 2023](https://catalog.us-east-1.prod.workshops.aws/workshops/c2a7a97a-a948-48fd-bd4d-dc2c5aa094b1/en-US)

\[github] [cedar-policy](https://github.com/cedar-policy)

\[blog] [Simplify How You Manage Authorization in Your Applications with Amazon Verified Permissions – Now Generally Available](https://aws.amazon.com/blogs/aws/simplify-how-you-manage-authorization-in-your-applications-with-amazon-verified-permissions-now-generally-available/?sc_channel=sm\&sc_campaign=AWSSecurity_Identity\&sc_publisher=TWITTER\&sc_geo=GLOBAL\&sc_outcome=awareness\&sc_category=AWS%20Identity%20and%20Access%20Management%20\(IAM\)\&trk=AWSSecurity_Identity\&linkId=219735049)

\[blog] [Use Amazon Verified Permissions for fine-grained authorization at scale](https://aws.amazon.com/blogs/security/use-amazon-verified-permissions-for-fine-grained-authorization-at-scale/)

\[youtube] [AWS re:Inforce 2023 - Fine-grained authorization for apps with Amazon Verified Permissions (IAM308)](https://www.youtube.com/watch?v=1AdkZJSmTQI)

\[youtube] [Introduction to Amazon Verified Permissions | Amazon Web Services](https://www.youtube.com/watch?v=Y2xAwDC_QIg)

\[youtube] [Demo of the Cedar Programming Language - The Open Source Language from AWS](https://www.youtube.com/watch?v=PzmDYyyA5xM)

[Overview](https://aws.amazon.com/verified-permissions/)

[User Guide](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide)

[API Reference](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference)

[Workshop](https://catalog.workshops.aws/verified-permissions-in-action/en-US)

[Pricing](https://aws.amazon.com/verified-permissions/pricing/)
