我们目前正在为我们的SaaS启动重新设计我们的访问控制系统(在过去的两年中,它已经与业务一起成长,并决定在这一点上清理它)。访问控制系统应该为客户提供服务,每个用户有500-10,000人。
它应支持:
现在的挑战是,基于角色的访问控制似乎只满足1-3,而不是4或5。ABAC现在是要走的路吗?
总的来说,我认为我们有类似于JIRA的要求,它似乎提供了一个非常灵活但也非常复杂(不直观)的权限系统。
您对如何最好地设计一个访问控制系统有什么建议吗?例如,我们应该问自己哪些问题,以及我们可能需要做哪些权衡?
发布于 2019-08-28 12:42:48
其他评论和回答以及你的帖子都指向了你正确的方向。您需要一个足够灵活的框架,以满足当前和未来的授权需求。该框架(或模型)确实是基于属性的访问控制(abac)。它也被称为动态授权管理和基于策略的访问控制。Gartner、Kuppinger Cole和公理学(我工作的地方)都就这一主题撰写了大量文章:
尽管如此,考虑到您的需求,ABAC只解决了一半的等式:授权策略和逻辑。它不能解决属性管理问题。您仍然需要考虑用户或资源的元数据或属性(在您的情况下的项目),这些元数据或属性将驱动您拥有的授权策略。
只读用户(即一些用户可能只登录和查看项)
您需要定义一个角色或角色,您可以分配给用户,以表示他们是只读的。也许这是你系统中的基线角色。也许是因为没有这个角色,但事实是你成功地通过了认证。
只有少数用户可以更改全局设置(如管理集成、计费信息等)。
是什么让这些用户与众不同?“管理员”或“超级用户”等角色?您需要定义该角色,并且需要一个流程将该角色分配给用户。
只有少数用户可以更改我们三个产品模块之一的设置。
和上面一样的故事。
对于每个创建的资源(例如,一个项目、一个团队、.),只有项目成员/团队成员可以更改资源。
就像你自己说的,这是针对ABAC的。您需要编写一个简单的策略(或规则--单词是可互换的),状态(伪代码)可以是也要用阿尔法:
A user with role=="..." can do action=="edit" on object of type=="record" if record.assignedProject == user.assignedProject.默认情况下,所有用户都可以查看所有项目,但是应该可以“隐藏”项目,以便只有项目成员可以查看隐藏的项目。
参见下面阿尔法中的一个例子。
思考策略和用例是很棒的,但是您也需要考虑决策的执行。ABAC有一个策略执行点(PEP)和策略决策点(PDP)的概念。PEP是橡胶击中道路的地方:你在保护什么?一个门户网站?一个业务流程?API?无论哪种方式,您都需要有一个PEP或拦截器,能够应用正确的授权。从高层来看,这个体系结构是什么样的:

ALFA是授权的缩写语言,与XACML一起是授权的两个主要标准之一。ALFA是XACML遵循的相同模型(策略集、策略、规则)的简化表示法。我根据您的用例编写了一些示例:
namespace com.axiomatics.examples{
/**
* Projects
*/
policyset projects{
target clause objectType == "project"
apply firstApplicable
/**
* View Projects
*/
policy viewProjects{
target clause action == "view"
apply firstApplicable
/** Anyone can view a project */
rule viewVisibleProjects{
target clause project.hidden == false
permit
}
/**
* Only members can view hidden projects - it should be possible to "hide" projects so that only the project members may view the hidden project.
*/
rule viewHiddenProjects{
target clause project.hidden == true
permit
condition stringAtLeastOneMemberOf(user.name, project.members)
}
}
}
/**
* For each created resource (e.g. a project, a team, ...), only the project members / team members may change the resource.
*/
policyset records{
target clause objectType == "record"
apply firstApplicable
/**
* Edit records
*/
policy editRecord{
target clause action == "edit"
apply firstApplicable
/** Project members can edit a record in their project */
rule viewVisibleProjects{
permit
condition record.project == user.assignedProject
}
}
}
/**
* Global settings - Only a few users may change global settings (like managing integrations, billing information etc.)
*/
policy globalSettings{
target clause objectType == "global settings"
apply firstApplicable
/**
* Administrators can view and change global settings
*/
rule administrators{
target clause user.role=="administrator"
clause action=="view" or action=="edit"
permit
}
}
}ABAC有几个很好的实现:
发布于 2019-08-27 09:11:04
您可以创建权限,例如:
从用户的角度来看,这是相当简单和可以理解的。从开发人员的角度来看,检查权限有点复杂,但仍然可以管理。
如果您这样做,那么您就在技术上执行ABAC,因为这些权限比固定角色更具有动态性。但它看起来仍然很像RBAC。
https://security.stackexchange.com/questions/216004
复制相似问题