【问题标题】:Setting up LDAP authorization using OpenLDAP使用 OpenLDAP 设置 LDAP 授权
【发布时间】:2019-04-20 10:54:25
【问题描述】:

这和这里问的一样:LDAP authorization

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

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

那么,应该有一组用户。例如Tom、Dick 和 Harry 将加入 FinanceUsers 组。

到目前为止一切顺利。我可以通过设置 memberOf 来做到这两点。

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

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

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

【问题讨论】:

  • 忘了提一下,我不能简单地检查当前用户是否在财务组中,然后再检查财务组是否在 customerInfoEditor 组中,因为多个组可能在 customerInfoEditor 组中并且已登录in user 可以在任何一个或多个这些组中。

标签: ldap authorization openldap


【解决方案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 objectclass 使表示成员资格的能力成为可能:

# 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 条目来保存组和角色成员资格,因为权限由组成员授予。
  • 如果成为组成员只是一个条件但不足以授予权限,或者如果它独立于您的访问策略,那么您需要使用角色成员资格来进行适当的授权。

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

【讨论】:

    【解决方案2】:

    您可能会查看autogroup overlay for OpenLDAP,它将根据过滤器而不是使用嵌套组成员身份填充您的 cutomerInfoEditor 组成员资格。

    您可以在目录中使用嵌套组成员资格并在代码中处理它。如果您的 customerInfoEditor only 包含一层嵌套组(即其成员是组,但那些组都没有组作为成员),您可以根据customerInfoEditor 的成员列表构建过滤器。

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

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

    该 |是一个或运算符。过滤器说找到一个用户((uid 是用户通过身份验证的值)和(他们是 financeUsers 的成员或 salesUsers 的成员或任何其他用户的成员))

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

    您可以通过获取用户的完全限定 DN (FQDN) 并将搜索库更改为用户的 FQDN 来加快查询速度。那么过滤器将只是

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

    在任何一种情况下,取回 1 条记录意味着他们应该被分配访问权限。 0 表示它们不应该是。并且 >1 很奇怪——在这种情况下,我通常会抛出一个错误,指示用户拨打我们的服务台。

    如果您的角色组(如 customerInfoEditor)可能有多个嵌套级别(financeUsers 是成员,但 financeUsers 成员是 accountsRecievableUsers、accountsPayableUsers、cfoUsers 等组,并且其中一些组甚至可能有组作为成员)然后...好吧,就个人而言,因为我自动完成所有配置...我只需在我的配置工作流程中为所有这些组添加另一个“添加到组”事件, em> 使用深度嵌套的组。当我将某人添加到 cfoUsers 时,我还将添加到 customerInfoEditor 并且角色组将仅包含用户帐户作为成员。

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

    【讨论】:

    • 谢谢。我明白你在说什么。我试试看能不能正确实现。
    猜你喜欢
    • 2013-10-28
    • 2014-07-26
    • 2011-09-08
    • 2020-12-03
    • 2014-05-18
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    相关资源
    最近更新 更多