从自定义 ABAC 切换到 XACML
Switch from custom ABAC to XACML
我将使用 OAuth2 和 XACML(使用 AuthZForce)保护我的 Spring 云应用程序。
我已经实现了一个简单的 ABAC 解决方案,可以处理以下用例,但我想切换到 XACML。可能吗?
旧域名
我有(在数据库中):
- 策略(例如 subject.id==resource.ownerId),由执行点检查以做出决定
- 权限(例如 DELETE_USER),具有一些已定义的策略
- 拥有某些权限的角色(例如 EMPLOYEE)
- 具有一些默认值和公司可用角色和权限的功能(例如 PREMIUM)
- 公司,有一些特点
- 分配给公司的用户
用例
现在公司的用户可以创建新角色 ROLE_X。他可以为这个角色分配一些权限。
更新
因为这道题原本包含两个不同的题,所以我决定把第二题外包()
您存储策略的位置在很大程度上是无关紧要的。这将取决于您使用的引擎,例如AuthZForce(我已经联系了作者,所以他可以插话)、SunXACML、WSO2 或 Axiomatics。
免责声明:我在 Axiomatics 工作。我们确实使用数据库来存储 XACML 策略,但这不会更改授权要求或建模。
我对你的原作有几点评论 post。
subject.id==resource.ownerId
就是我们在 XACML 中通常所说的条件。您将 2 个属性放在一起来实现关系。
- 您提到权限,例如
DELETE_USER
。在 XACML 中,您通常将它们拆分为原子属性,例如一方面是一个动作,另一方面是一个对象或资源 (USER
)。 RBAC 是基于角色和权限的,而 ABAC 是基于属性的。理想情况下,这些属性表示单个方面(用户,试图删除...)
ROLE
仍然存在于 ABAC 中。它将成为您政策的基础。
- 特征和公司是您会使用的属性。
考虑到这一点,您可以编写如下策略(使用 ALFA 表示法):
namespace axiomatics{
namespace user{
attribute role{
category = subjectCat
id = "axiomatics.user.role"
type = string
}
attribute company{
category = subjectCat
id = "axiomatics.user.company"
type = string
}
attribute userId{
category = subjectCat
id = "axiomatics.user.userId"
type = string
}
}
namespace action{
attribute actionId{
category = actionCat
id = "axiomatics.action.actionId"
type = string
}
}
namespace resource{
attribute company{
category = resourceCat
id = "axiomatics.resource.company"
type = string
}
attribute owner{
category = resourceCat
id = "axiomatics.resource.owner"
type = string
}
}
policyset springapp{
apply firstApplicable
policy employees{
target clause user.role == "employee"
apply firstApplicable
/**
* Employees can create roles in their own company
*/
rule createRole{
target clause action.actionId=="create"
condition user.company==resource.company
permit
}
/**
* Employees can delete roles they own
*/
rule allowDelete{
target clause action.actionId == "delete"
condition user.userId == resource.owner
permit
}
}
}
}
我将使用 OAuth2 和 XACML(使用 AuthZForce)保护我的 Spring 云应用程序。
我已经实现了一个简单的 ABAC 解决方案,可以处理以下用例,但我想切换到 XACML。可能吗?
旧域名
我有(在数据库中):
- 策略(例如 subject.id==resource.ownerId),由执行点检查以做出决定
- 权限(例如 DELETE_USER),具有一些已定义的策略
- 拥有某些权限的角色(例如 EMPLOYEE)
- 具有一些默认值和公司可用角色和权限的功能(例如 PREMIUM)
- 公司,有一些特点
- 分配给公司的用户
用例
现在公司的用户可以创建新角色 ROLE_X。他可以为这个角色分配一些权限。
更新
因为这道题原本包含两个不同的题,所以我决定把第二题外包(
您存储策略的位置在很大程度上是无关紧要的。这将取决于您使用的引擎,例如AuthZForce(我已经联系了作者,所以他可以插话)、SunXACML、WSO2 或 Axiomatics。
免责声明:我在 Axiomatics 工作。我们确实使用数据库来存储 XACML 策略,但这不会更改授权要求或建模。
我对你的原作有几点评论 post。
subject.id==resource.ownerId
就是我们在 XACML 中通常所说的条件。您将 2 个属性放在一起来实现关系。- 您提到权限,例如
DELETE_USER
。在 XACML 中,您通常将它们拆分为原子属性,例如一方面是一个动作,另一方面是一个对象或资源 (USER
)。 RBAC 是基于角色和权限的,而 ABAC 是基于属性的。理想情况下,这些属性表示单个方面(用户,试图删除...) ROLE
仍然存在于 ABAC 中。它将成为您政策的基础。- 特征和公司是您会使用的属性。
考虑到这一点,您可以编写如下策略(使用 ALFA 表示法):
namespace axiomatics{
namespace user{
attribute role{
category = subjectCat
id = "axiomatics.user.role"
type = string
}
attribute company{
category = subjectCat
id = "axiomatics.user.company"
type = string
}
attribute userId{
category = subjectCat
id = "axiomatics.user.userId"
type = string
}
}
namespace action{
attribute actionId{
category = actionCat
id = "axiomatics.action.actionId"
type = string
}
}
namespace resource{
attribute company{
category = resourceCat
id = "axiomatics.resource.company"
type = string
}
attribute owner{
category = resourceCat
id = "axiomatics.resource.owner"
type = string
}
}
policyset springapp{
apply firstApplicable
policy employees{
target clause user.role == "employee"
apply firstApplicable
/**
* Employees can create roles in their own company
*/
rule createRole{
target clause action.actionId=="create"
condition user.company==resource.company
permit
}
/**
* Employees can delete roles they own
*/
rule allowDelete{
target clause action.actionId == "delete"
condition user.userId == resource.owner
permit
}
}
}
}