使用OpenLDAP设置LDAP授权

时间:2018-11-17 13:16:10

标签: ldap authorization openldap

这与此处的要求相同:LDAP authorization

我正在尝试将LDAP设置为与PHP应用程序一起使用。我已经设置了身份验证和组成员身份。接下来是什么?

目标是,首先,应该有角色(LDAP中的组?),例如customerViewer,customerInfoUpdater等。

然后,应该有一组用户。例如汤姆,迪克和哈里将加入FinanceUsers组。

到目前为止,一切都很好。我可以通过设置memberOf来做到。

现在,我如何将customerViewer组/权限/权限分配/分配给FinanceUsers组?也就是说,Tom等人被添加到FinanceUsers组,而FinanceUsers被分配到customerViewer组(或者我在这里完全错了吗?)

我如何检查当前登录的用户是否在customerViewer组中,以便他获得查看客户记录的授权?

我正在服务器上使用CentOS 7,并在Windows客户端上安装了Apache LDAP Studio。

2 个答案:

答案 0 :(得分:1)

您可能会研究autogroup overlay for OpenLDAP,它将基于过滤器而不是嵌套的组成员资格来填充cutomerInfoEditor组成员资格。

您可以在目录中使用嵌套的组成员身份,并通过代码进行处理。如果您的customerInfoEditor 包含一层嵌套的组(即其成员是组,但是那些组中没有一个具有组作为成员),则您可以基于customerInfoEditor的成员资格列表构建过滤器。

如果customerInfoEditor的成员是组“ financeUsers”,“ salesUsers”和“ whateverOtherUsers”,则用于确定是否应将特定用户USERINPUT分配给该角色的过滤器是

(&(uid=USERINPUT)(|(memberOf=financeUsers)(memberOf=salesUsers)(memberOf=whateverOtherUsers))

是or运算符。过滤器说找到一个用户((uid是用户进行身份验证的值)并且(他们是financeUsers的成员或salesUsers的成员或whatOtherUsers的成员))的用户

使用代码构建过滤器的或组件可以使您重新定义赋予某人以CustomerInfoEditor角色的权限,而无需更改代码-将yetAnotherGroupOfUsers添加为customerInfoEditor的成员,您的过滤器也会动态更改为也包含该组。

通过获取用户的标准DN(FQDN)并将搜索库更改为用户的FQDN,您也许可以加快查询速度。然后,过滤器将只是

(|(memberOf=financeUsers)(memberOf=salesUsers)(memberOf=whateverOtherUsers))

在任何一种情况下,获得1条记录都意味着应该为其分配访问权限。 0表示不应该。 > 1很奇怪-在这种情况下,我通常会引发一个错误,指示用户致电我们的帮助台。

如果您的角色组(例如customerInfoEditor)可能具有多个嵌套级别(financeUsers是成员,但是FinanceUsers成员是诸如accountRecievableUsers,accountsPayableUsers,cfoUsers之类的组,甚至某些那些组可能具有然后作为成员...)好吧,因为我是自动执行所有我的配置...我只是在我的配置工作流程中为所有这些组添加另一个“添加到组”事件,使用深层嵌套的组。当我将某人添加到cfoUsers时,我还将添加到customerInfoEditor,角色组将仅包含用户帐户作为成员。

但是,如果没有其他选择,我唯一要做的就是在代码中处理组扩展。就I / O而言,这很昂贵,因为您必须查看个人是其成员的所有组,然后查看这些组是哪些 组,并检查看看这些组的成员。如果您只处理单个角色,则可以在找到角色后立即退出扩展,但是如果您需要查找多个角色组,则必须运行直到到达顶部并具有所有个人直接或间接成员的所有组的扩展列表。并且您已经扩展来处理循环的轨道组,否则A是B的成员,B是C的成员,C是D的成员,D是A的成员成为无限扩展循环。

答案 1 :(得分:1)

您可以创建或使用2个组织单位,一个组织单位列出,另一个组织单位保存角色。使用对象类organizationalunit(必需):

# Groups 
dn: ou=groups,dc=example,dc=com
objectclass:organizationalunit
ou: groups
description: generic groups branch

# Roles
dn: ou=roles,dc=example,dc=com
objectclass:organizationalunit
ou: roles
description: generic roles branch

每个组织单位可以包含一个(可能是嵌套的)条目列表,每个条目都通过member属性保存用户成员身份。 groupOfNames对象类使表示成员身份的能力成为可能:

# Create financeUsers group under groups
dn: cn=financeUsers,ou=groups,dc=example,dc=com
objectclass: groupofnames
cn: financeUsers
description: Finance team.
member: uid=someone,ou=people,dc=example,dc=com 
member: uid=someone_else,ou=people,dc=example,dc=com  

# Create customerViewer role under roles
dn: cn=customerViewer,ou=roles,dc=example,dc=com
objectclass: groupofnames
cn: customerViewer 
description: Customer viewer role (every members have 'view' access to Customer entity)
member: uid=someone,ou=people,dc=example,dc=com 
member: uid=somebody,ou=people,dc=example,dc=com  

要记住的是,一切都取决于您的访问策略:

  • 如果成为组成员必须将该成员分配给组角色(在这种情况下,这是一组特定于组的权限),那么您可以考虑使用相同的ldap条目来同时拥有组和角色成员身份,因为权限由组成员授予。
  • 如果成为组成员只是一个条件,但不足以授予权限,或者它独立于您的访问策略,那么您需要使用角色成员资格来进行适当的授权。

检查本身仅取决于用于授权用户的客户端/应用程序,请更新您的问题,以便我进一步探讨或询问一个新问题,如果您认为它可能属于另一篇文章。