1. 概述
OpenFGA 是一个面向开发人员的可扩展开源授权系统,允许为任何类型的应用程序实施授权,并随着复杂性的增加而平稳发展。
受 Google 内部授权系统 Google 的 Zanzibar 的启发,OpenFGA 依赖于 Relationship-Based Access Control,它允许开发人员轻松实现 Role-Based Access Control,并提供额外的能力来实现 Attribute-Based Access Control。
2. 授权概念
2.1 身份验证和授权
身份验证可确保用户的身份。授权确定用户是否可以对特定资源执行特定操作。
例如,当登录 Google 时,身份验证是验证您的用户名和密码是否正确的过程。授权是确保您可以访问给定的 Google 服务或功能的过程。
2.2 细粒度授权
细粒度授权 (FGA) 意味着能够授予特定用户在特定资源中执行特定操作的权限。
精心设计的 FGA 系统允许您管理数百万个对象和用户的权限。随着系统不断添加对象并更新其用户的访问权限,这些权限可能会迅速更改。
比如Google Drive:可以授予对文档或文件夹的访问权限,也可以授予单个用户或作为一个组的用户,并且随着新文档的创建以及与特定用户或组共享,访问权限会定期更改。
2.3 基于角色的访问控制(RBAC)
在基于角色的访问控制 (RBAC) 中,根据用户在系统中的角色为用户分配权限。例如,用户需要editor该角色来编辑内容。
RBAC 系统使您能够定义用户、组、角色和权限,然后将它们存储在一个集中位置。应用程序访问该信息以做出授权决策。
2.4 基于属性的访问控制(ABAC)
在基于属性的访问控制 (ABAC) 中,权限是根据用户或资源拥有的一组属性授予的。例如,同时分配了 and 属性的用户有权发布和删除具有指定属性的帖子。
实现 ABAC 的应用程序需要检索存储在多个数据源(如 RBAC 服务、用户目录和特定于应用程序的数据源)中的信息,以做出授权决策。
基于策略的访问控制(PBAC)
基于策略的访问控制 (PBAC) 是指在应用程序代码外部以集中方式管理授权策略的能力。ABAC 的大多数实现也是 PBAC。
2.5 基于关系的访问控制(ReBAC)
基于关系的访问控制 (ReBAC) 使用户访问规则能够根据给定用户与给定对象的关系以及该对象与其他对象的关系为条件。例如,如果给定用户可以访问给定文档的父文件夹,则该用户可以查看该文档。
ReBAC 是 RBAC 的超集:您可以使用 ReBAC 完全实现 RBAC。 当属性可以以关系的形式表示时,ReBAC 还允许您本地求解 ABAC。例如,“用户的管理者”、“父文件夹”、“文档的所有者”、“用户的部门”可以定义为关系。
OpenFGA 扩展了 ReBAC,使使用条件或上下文元组表达其他 ABAC 场景变得更加简单。
ReBAC 也可以被视为 PBAC,因为授权策略是集中的。
3. OpenFGA相关概念
OpenFGA 服务通过确定对象和用户之间是否存在关系来回答授权检查。检查时候将引用您的授权模型与授权权限的关系元组。
类型
类型是一个字符串。它定义了一类具有相似特征的对象。
以下是类型的示例:
- workspace
- repository
- organization
- document
类型定义
类型定义定义用户或其他对象可以与此类型相关的所有可能关系。
下面是类型定义的一个示例(DSL):
type document
relations
define viewer: [user]
define commenter: [user]
define editor: [user]
define owner: [user]
授权模型
授权模型将一个或多个类型定义组合在一起。这用于定义系统的权限模型。
下面是一个授权模型示例(DSL):
model
schema 1.1
type document
relations
define viewer: [domain#member, user]
define commenter: [domain#member, user]
define editor: [domain#member, user]
define owner: [domain#member, user]
type domain
relations
define member: [user]
type user
授权模型与关系元组一起确定用户和对象之间是否存在关系。
Store存储
存储是用于组织授权检查数据的 OpenFGA 实体。
每个存储区都包含授权模型的一个或多个版本,并且可以包含各种关系元组。存储数据不能在存储之间共享;建议将可能与授权结果相关或影响授权结果的所有数据存储在一个存储中。
可以为单独的授权需求或隔离的环境(例如开发/生产)创建单独的存储。
对象
对象表示系统中的实体。用户与它的关系由关系元组和授权模型定义。
对象是类型和标识符的组合。
例如:
workspace:fb83c013-3060-41f4-9590-d3233a67938f
repository:auth0/express-jwt
organization:org_ajUc9kJ
document:new-roadmap
用户、关系和对象是关系元组的构建块。
用户
用户是系统中可以与对象相关的实体。
用户是类型、标识符和可选关系的组合。
例如
任何标识符:例如 或user:anneuser:4179af14-f0c0-4930-88fd-5570c7bf6f59
任何对象:例如,或workspace:fb83c013-3060-41f4-9590-d3233a67938frepository:auth0/express-jwtorganization:org_ajUc9kJ
一组或一组用户(也称为 UsersSet):例如,它将与对象相关的用户集表示为organization:org_ajUc9kJ#membersorganization:org_ajUc9kJmember
每个人,使用特殊语法:*
用户、关系和对象是关系元组的构建块。