我正在研究各种类型的访问控制模型,并且知道abac和rbac是受欢迎的模型。
对于我的一个项目,我有一个基本的场景,我无法理解……
首先,我对迟到的回应道歉。这是我的内联评论。
我正在研究各种类型的访问控制模型并且来了 知道abac和rbac是最受欢迎的。
历史上,访问控制已通过访问控制列表(ACL),基于角色的访问控制(RBAC)和最近基于属性的访问控制(ABAC)来解决。 ACL变得笨拙且难以管理,这就是NIST在1992年提出RBAC的原因(是的,它已经很久了)。 RBAC是众所周知的,成熟的,并且内置于大多数IAM产品和应用程序中。例如,用户目录(LDAP,AD ...)维护用户和角色分配,并为应用程序提供应用程序随后可用于确定是否应授予访问权限的角色。使用RBAC,更细粒度的访问(例如,根据您的情况下的关系进行访问,用户只能看到自己的数据)是不可能的,因此(a)应用程序开发人员编写自定义代码以实现正确访问或(b)您使用ABAC。
ABAC使您能够通过使用策略来描述可以(或不可能)发生的内容,从而根据任何类型的属性(不仅仅是角色而不仅仅是用户属性)定义细粒度访问。 ABAC有时称为PBAC(基于策略的访问控制)。您可以参考XACML,它是实现ABAC策略的语言。你也可以看看 阿尔法 ( 维基百科 ),一种直接映射到XACML的简单语言。
ABAC还定义了一个具有策略决策点(PDP)概念的体系结构,该策略决策点根据其配置的策略处理您的授权请求。 PDP(在您的情况下是WSO2 Balana WSO2 IS的一部分)是从策略执行点(PEP)调用的,例如您的应用程序或位于应用程序前面的东西(例如,您的WSO2 API Manager中的API网关或拦截器)。
对于我的一个项目,我有一个基本的场景,我无法理解 我应该选择RBACor ABAC吗?显然RBAC是ABACso的子集 我绝对应该选择ABAC,但ABAC需要一些经验 在xacml中编写策略。我们正在使用WSO IS和APIM。
我不会说RBAC是ABAC的子集。确实是从功能角度来看。但它不是一个与另一个。 ABAC将通过引入更多属性,策略和上述架构来扩展RBAC。
我的身份服务器(IS)中有管理员,所有者和成员角色。 管理员可以查看,删除和更新用户。 所有者可以查看和更新。 会员只能查看。
我的身份服务器(IS)中有管理员,所有者和成员角色。
这很棒。您正在做的是定义您的授权要求。这些将直接映射到您的ALFA / XACML策略。
我正在使用HTTP动词来实现期望结果,即所有者无法访问DELETE请求,并且成员无法访问PUT&删除。
在ABAC,我们也使用行动。这些可能是普通的旧人类行为(查看,编辑,删除,批准......),然后可以映射到HTTP动词。
在下面的文字中,我用粗体标记了我认为是您的额外授权要求。
我有一个仪表板,我在其中显示不同的部分,如最高用户,计费,服务,顶级消费者等。 我需要根据服务器的用户角色和属性填充导航栏,例如 的 成员不应该有权访问导航栏中的其他用户(添加,列表) 强> 。导航栏项依赖于用户角色,因此我们可以通过RBAC管理它们?
我有一个仪表板,我在其中显示不同的部分,如最高用户,计费,服务,顶级消费者等。
我需要根据服务器的用户角色和属性填充导航栏,例如 的 成员不应该有权访问导航栏中的其他用户(添加,列表) 强> 。导航栏项依赖于用户角色,因此我们可以通过RBAC管理它们?
这将通过ABAC政策处理。见下文
我们计划添加操作,营销,支持等角色。这是否意味着我们需要创建一个单独的数据库模式来维护每个角色的访问权限?
没有!您不必创建新的数据库模式,更不用说在自定义系统中维护访问权限了。使用这些策略。
在仪表板中,我需要隐藏/显示用户,服务等中的视图,更新和删除按钮 的 成员可以查看用户但无权更新或删除用户 强> 。他们无法查看统计信息,结算信息和其他私人信息。 的 所有者可以查看与其部门/组织相关的所有用户 强> 但 的 管理员可以查看所有部门/组织的所有用户 强> 。在这里,我们需要为所有消费者使用相同的API,但api应对不同的角色做出不同的响应。角色可以是10s和100s,因此ee不能为每个角色创建不同的api。 题 我们可以通过RBAC实现所有这些场景,但是为了管理导航栏和视图相关的实现,我们需要在服务器中添加业务逻辑,而不是使用WSO2-IS和WSO2-APIM。有没有办法管理隐藏/显示按钮和部分等视图权限,甚至使用相同的API,但它应该为不同的API消费者返回不同的结果。
在仪表板中,我需要隐藏/显示用户,服务等中的视图,更新和删除按钮 的 成员可以查看用户但无权更新或删除用户 强> 。他们无法查看统计信息,结算信息和其他私人信息。
的 所有者可以查看与其部门/组织相关的所有用户 强> 但 的 管理员可以查看所有部门/组织的所有用户 强> 。在这里,我们需要为所有消费者使用相同的API,但api应对不同的角色做出不同的响应。角色可以是10s和100s,因此ee不能为每个角色创建不同的api。 题
我们可以通过RBAC实现所有这些场景,但是为了管理导航栏和视图相关的实现,我们需要在服务器中添加业务逻辑,而不是使用WSO2-IS和WSO2-APIM。有没有办法管理隐藏/显示按钮和部分等视图权限,甚至使用相同的API,但它应该为不同的API消费者返回不同的结果。
当然是。这是使用ABAC和策略的目的。鉴于您正在使用WSO2 IS,请查看该产品中的PDP Balana。有其他解决方案,例如AuthZForce(开源)或Axiomatics(我工作的地方)
以下是使用ALFA编写的示例策略和下面的XACML翻译
namespace haris { /** * User Records */ policyset users { target clause axiomatics.objectType == "user record" apply firstApplicable /** * View user record */ policy viewUser { target clause axiomatics.actionId == "view" // This can be the HTTP verb apply firstApplicable /** * Administrators can view all users */ rule administrator{ target clause axiomatics.user.role == "administrator" permit } /** * Owners can view users in their department */ rule owners{ target clause axiomatics.user.role == "owner" permit condition axiomatics.user.department == axiomatics.record.department } /** * Members can view their own user record only */ rule member{ permit condition axiomatics.user.username == axiomatics.record.owner } } /** * Update user */ policy updateUser { target clause axiomatics.actionId == "update" // This can be the HTTP verb apply firstApplicable /** * Administrator can update any user */ rule administrator{ target clause axiomatics.user.role == "administrator" permit } /** * Owner can update any user */ rule owner{ target clause axiomatics.user.role == "owner" permit // TODO: determine what an owner can update } } /** * Delete user */ policy deleteUser { target clause axiomatics.actionId == "delete" // This can be the HTTP verb apply firstApplicable /** * Administrator can delete any user */ rule administrator{ target clause axiomatics.user.role == "administrator" permit } } } }
和XML版本
<?xml version="1.0" encoding="UTF-8"?><!--This file was generated by the ALFA Plugin for Eclipse from Axiomatics AB (http://www.axiomatics.com). --><!--Any modification to this file will be lost upon recompilation of the source ALFA file --> <xacml3:PolicySet PolicyCombiningAlgId="urn:oasis:names:tc:xacml:1.0:policy-combining-algorithm:first-applicable" PolicySetId="http://axiomatics.com/alfa/identifier/haris.users" Version="1.0" xmlns:xacml3="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17"> <xacml3:Description>User Records</xacml3:Description> <xacml3:PolicySetDefaults> <xacml3:XPathVersion>http://www.w3.org/TR/1999/REC-xpath-19991116 </xacml3:XPathVersion> </xacml3:PolicySetDefaults> <xacml3:Target> <xacml3:AnyOf> <xacml3:AllOf> <xacml3:Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal"> <xacml3:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">user record</xacml3:AttributeValue> <xacml3:AttributeDesignator AttributeId="axiomatics.objectType" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false" /> </xacml3:Match> </xacml3:AllOf> </xacml3:AnyOf> </xacml3:Target> <xacml3:Policy PolicyId="http://axiomatics.com/alfa/identifier/haris.users.viewUser" RuleCombiningAlgId="urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:first-applicable" Version="1.0"> <xacml3:Description>View user record</xacml3:Description> <xacml3:PolicyDefaults> <xacml3:XPathVersion>http://www.w3.org/TR/1999/REC-xpath-19991116 </xacml3:XPathVersion> </xacml3:PolicyDefaults> <xacml3:Target> <xacml3:AnyOf> <xacml3:AllOf> <xacml3:Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal"> <xacml3:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">view</xacml3:AttributeValue> <xacml3:AttributeDesignator AttributeId="axiomatics.actionId" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false" /> </xacml3:Match> </xacml3:AllOf> </xacml3:AnyOf> </xacml3:Target> <xacml3:Rule Effect="Permit" RuleId="haris.users.viewUser.administrator"> <xacml3:Description>Administrators can view all users </xacml3:Description> <xacml3:Target> <xacml3:AnyOf> <xacml3:AllOf> <xacml3:Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal"> <xacml3:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">administrator</xacml3:AttributeValue> <xacml3:AttributeDesignator AttributeId="axiomatics.user.role" Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false" /> </xacml3:Match> </xacml3:AllOf> </xacml3:AnyOf> </xacml3:Target> </xacml3:Rule> <xacml3:Rule Effect="Permit" RuleId="haris.users.viewUser.owners"> <xacml3:Description>Owners can view users in their department </xacml3:Description> <xacml3:Target> <xacml3:AnyOf> <xacml3:AllOf> <xacml3:Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal"> <xacml3:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">owner</xacml3:AttributeValue> <xacml3:AttributeDesignator AttributeId="axiomatics.user.role" Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false" /> </xacml3:Match> </xacml3:AllOf> </xacml3:AnyOf> </xacml3:Target> <xacml3:Condition> <xacml3:Apply FunctionId="urn:oasis:names:tc:xacml:3.0:function:any-of-any"> <xacml3:Function FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-equal" /> <xacml3:AttributeDesignator AttributeId="axiomatics.user.department" Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false" /> <xacml3:AttributeDesignator AttributeId="axiomatics.record.department" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false" /> </xacml3:Apply> </xacml3:Condition> </xacml3:Rule> <xacml3:Rule Effect="Permit" RuleId="haris.users.viewUser.member"> <xacml3:Description>Members can view their own user record only </xacml3:Description> <xacml3:Target /> <xacml3:Condition> <xacml3:Apply FunctionId="urn:oasis:names:tc:xacml:3.0:function:any-of-any"> <xacml3:Function FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-equal" /> <xacml3:AttributeDesignator AttributeId="axiomatics.user.username" Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false" /> <xacml3:AttributeDesignator AttributeId="axiomatics.record.owner" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false" /> </xacml3:Apply> </xacml3:Condition> </xacml3:Rule> </xacml3:Policy> <xacml3:Policy PolicyId="http://axiomatics.com/alfa/identifier/haris.users.updateUser" RuleCombiningAlgId="urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:first-applicable" Version="1.0"> <xacml3:Description>Update user</xacml3:Description> <xacml3:PolicyDefaults> <xacml3:XPathVersion>http://www.w3.org/TR/1999/REC-xpath-19991116 </xacml3:XPathVersion> </xacml3:PolicyDefaults> <xacml3:Target> <xacml3:AnyOf> <xacml3:AllOf> <xacml3:Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal"> <xacml3:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">update</xacml3:AttributeValue> <xacml3:AttributeDesignator AttributeId="axiomatics.actionId" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false" /> </xacml3:Match> </xacml3:AllOf> </xacml3:AnyOf> </xacml3:Target> <xacml3:Rule Effect="Permit" RuleId="haris.users.updateUser.administrator"> <xacml3:Description>Administrator can update any user </xacml3:Description> <xacml3:Target> <xacml3:AnyOf> <xacml3:AllOf> <xacml3:Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal"> <xacml3:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">administrator</xacml3:AttributeValue> <xacml3:AttributeDesignator AttributeId="axiomatics.user.role" Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false" /> </xacml3:Match> </xacml3:AllOf> </xacml3:AnyOf> </xacml3:Target> </xacml3:Rule> <xacml3:Rule Effect="Permit" RuleId="haris.users.updateUser.owner"> <xacml3:Description>Owner can update any user</xacml3:Description> <xacml3:Target> <xacml3:AnyOf> <xacml3:AllOf> <xacml3:Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal"> <xacml3:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">owner</xacml3:AttributeValue> <xacml3:AttributeDesignator AttributeId="axiomatics.user.role" Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false" /> </xacml3:Match> </xacml3:AllOf> </xacml3:AnyOf> </xacml3:Target> </xacml3:Rule> </xacml3:Policy> <xacml3:Policy PolicyId="http://axiomatics.com/alfa/identifier/haris.users.deleteUser" RuleCombiningAlgId="urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:first-applicable" Version="1.0"> <xacml3:Description>Delete user</xacml3:Description> <xacml3:PolicyDefaults> <xacml3:XPathVersion>http://www.w3.org/TR/1999/REC-xpath-19991116 </xacml3:XPathVersion> </xacml3:PolicyDefaults> <xacml3:Target> <xacml3:AnyOf> <xacml3:AllOf> <xacml3:Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal"> <xacml3:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">delete</xacml3:AttributeValue> <xacml3:AttributeDesignator AttributeId="axiomatics.actionId" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false" /> </xacml3:Match> </xacml3:AllOf> </xacml3:AnyOf> </xacml3:Target> <xacml3:Rule Effect="Permit" RuleId="haris.users.deleteUser.administrator"> <xacml3:Description>Administrator can delete any user </xacml3:Description> <xacml3:Target> <xacml3:AnyOf> <xacml3:AllOf> <xacml3:Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal"> <xacml3:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">administrator</xacml3:AttributeValue> <xacml3:AttributeDesignator AttributeId="axiomatics.user.role" Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false" /> </xacml3:Match> </xacml3:AllOf> </xacml3:AnyOf> </xacml3:Target> </xacml3:Rule> </xacml3:Policy> </xacml3:PolicySet>
如何针对单个api返回不同的数据,但针对不同的角色/用户。
我们假设您有一个API,例如 /api/profiles/{profileID} 。有两种方法可以使用API:
/api/profiles/{profileID}
为此,您需要实施策略执行点(PEP)。这可能是WSO2的API管理器。 PEP负责
如果决定是Permit,则呼叫将转发到您的后端API。如果不是,您可以按照讨论的方式返回HTTP 403/404。
如果它是403,则呼叫确实转到后端,最终从后端转换响应并通过PEP,它可以再次调用PDP,例如编辑数据。
我是否需要在我的服务器中涉及业务逻辑,例如获取导航栏项目,获取api-usage统计信息,管理员和组织/部门的完整数据访问权限以及成员的受限数据。如何执行这些基本操作?
不,你没有。在构建菜单或导航项时,您还可以调用PDP并询问给定用户是否可以访问给定的一组功能,例如“Alice可以查看nav-bar项目#123吗?”。您需要最少的业务逻辑来调用PDP。
经过一番观察,我可以想到一件事。
使用上面 WSO2 APIM api得到 swagger.json 给定的 API (这些应该/将拥有所有可用的api)。现在使用相关 HTTP-verbs 使用角色和响应来映射资源。
WSO2 APIM
swagger.json
API
HTTP-verbs
例如。如果成员不应该访问 DELETE 然后使用这种方法,我们可以要求服务器返回当前页面/视图的所有权限,并将这些值映射到前端以隐藏/显示按钮/视图或整个内容。
DELETE
的 下行: 强> 为避免重复和重复,我们可以将这些映射保存在数据库中。但是这种逻辑需要您自己的服务器中的一些业务逻辑以及对数据库读/写操作的访问。