![如何使用 Apache httpd 上的 mod_ldap 和 mod_authnz_ldap 为许多用户提供网页的身份验证和授权?](https://linux22.com/image/759292/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20Apache%20httpd%20%E4%B8%8A%E7%9A%84%20mod_ldap%20%E5%92%8C%20mod_authnz_ldap%20%E4%B8%BA%E8%AE%B8%E5%A4%9A%E7%94%A8%E6%88%B7%E6%8F%90%E4%BE%9B%E7%BD%91%E9%A1%B5%E7%9A%84%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%E5%92%8C%E6%8E%88%E6%9D%83%EF%BC%9F.png)
我正在尝试通过 .htaccess 为 Apache httpd 网站上的数百名用户提供功能,以限制 AD 服务器中不同用户和组对其网页的访问。Apache 允许我使用 mod_ldap 和 mod_authnz_ldap 轻松实现这一点,而且我了解其工作原理。我可以使用各种“require user”和“require ldap-group”指令来限制用户。问题在于与用户社区共享该权限。
第一个问题是,因为我使用的是带 LDAP 的 AD,所以我需要有一个绑定用户名/密码,该用户名/密码通过 AuthLDAPBindDN 和 AuthLDAPBindPassword 在 .htaccess 中提供。我不希望用户在 .htaccess 中使用自己的用户名和密码作为绑定用户,因为这样不太安全。同时,我不知道发布通用绑定用户/密码有多安全。也许这不是问题?毕竟,绑定用户无法登录任何系统,我们的 AD 服务器无法从部门外部访问,每个用户都可以做通用绑定用户可以做的任何事情。话虽如此,如果有一种方法可以在不共享绑定用户和密码的情况下做到这一点,我相信最终会更好。
理想情况下,Apache httpd 会允许我为 AuthLDAPBindDN 和 AuthLDAPBindPassword 设置一个 DEFAULT,如果用户未在所有情况下覆盖该值,则会自动使用该值。据我所知,它并没有这样做。
另一种方法是使用别名。用户的身份验证别名 (AuthProviderAlias) 和组的授权别名 (AuthzProviderAlias ldap-group) 的语法不同。
对于用户身份验证,我可以使用以下方法很好地设置默认值:
<AuthnProviderAlias my-ldap>
AuthLDAPURL ...
AuthLDAPBindDN ...
AuthLDAPBindPassword ...
</AuthnProviderAlias>
现在,当用户在 .htaccess 中使用:AuthBasicProvider my-ldap 时,这些值将被继承。这太棒了。他们可以限制用户的访问权限。
但是对于团体授权部分,事情就变得困难了。
首先,我有许多不同的组,我希望用户可以灵活地使用其中任何一个组来允许对其页面进行受限访问。据我所知,没有一种语法可以将一个 AuthzProviderAlias 应用于系统上的每个组。我需要为每个组定义如下内容:
<AuthzProviderAlias ldap-group mygroup ....>
AuthLDAPURL
AuthLDAPBindDN
AuthLDAPBindPassword ...
Require ldap-group cn=mygroup,...
</AuthzProviderAlias>
好的 - 如果有必要,我可以编写一个脚本来生成别名文件以匹配我们系统上的所有组。但感觉不对。
现在,用户可以在 .htaccess 中“Require mygroup”。但是,如果他们想要 require group1 或 group2 怎么办?Satisfy 指令不适用于多个 require 指令。
现在我似乎需要提供将不同组组合在一起的组别名——组 A 和组 B、组 A 和组 C——可能性无穷无尽。这感觉不对
所以我想我的问题是……如果我共享一个通用的绑定用户名和密码并将其发布到 Google 索引和全世界都可以看到的一个页面上,这真的很糟糕吗?这是那些希望所有用户都能够通过 Apache httpd 使用 LDAP 身份验证的人所做的吗?该绑定用户无法登录任何系统,并且我们的 AD 服务器无法从部门外部访问。我不认为这会让用户能够做他们以前无法做的事情。
答案1
如果您在全局配置中设置以下内容,它会起作用吗?
<Location />
AuthLDAPURL ...
AuthLDAPBindDN ...
AuthLDAPBindPassword ...
</Location>
我想知道这些指令是否被其余配置继承。那将是一个简单的解决方案。
答案2
我认为你的<AuthzProviderAlias>
解决方案可行。它几乎与创建授权提供者别名。它将要求您为每个 LDAP 组创建一个单独的别名,但您至少可以使用 mod_macro 自动完成大部分样板工作:
<Macro LdapGroupAlias $name $dn>
<AuthzProviderAlias ldap-group $name $dn>
AuthLDAPURL ...
AuthLDAPBindDN ...
AuthLDAPBindPassword ...
</AuthzProviderAlias>
</Macro>
Use LdapGroupAlias group1 cn=group1,...
Use LdapGroupAlias group2 cn=group2,...
...
然后您的用户可以根据需要组合这些组,例如:
Require group1
Require group2
等等,包括<RequireAny>
、<RequireAll>
和<RequireNone>
以任意方式组合组。因此,您不需要为每个组组合创建一个新别名 - 每个组只需一个别名。