使用 OpenLDAP 设置 LDAP 授权

Setting up LDAP authorization using OpenLDAP

这与此处询问的相同:LDAP authorization

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

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

那么,应该有一组用户。例如Tom、Dick 和 Harry 将在 financeUsers 组中。

到目前为止一切顺利。我可以通过设置 memberOf.

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

如何检查当前登录的用户是否在customerViewer组中,从而获得查看客户记录的权限?

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

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

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

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

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

的|是一个或运算符。过滤器说找到一个用户,其中((uid 是用户验证的值)AND(他们是 financeUsers 的成员或 salesUsers 的成员或 whateverOtherUsers 的成员))

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

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

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

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

如果您的角色组,如 customerInfoEditor,可能有多层嵌套(financeUsers 是一个成员,但 financeUsers 成员是像 accountsRecievableUsers、accountsPayableUsers、cfoUsers 和一些那些 组甚至可以将组作为成员)然后......好吧,就我个人而言,因为我会自动进行所有配置......我只是在我的配置工作流程中为所有这些组添加另一个 "add to group" 事件和 使用深层嵌套组。当我将某人添加到 cfoUsers 时,我还将添加到 customerInfoEditor,并且角色组将仅包含用户帐户作为成员。

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

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

支票本身仅取决于用于授权用户的 client/application,请更新您的问题,以便我可以更进一步,或者如果您认为它可能属于另一个 post,请提出新问题.