Apache 模块 mod_authnz_ldap

Description:允许使用 LDAP 目录存储用于 HTTP 基本身份验证的数据库。
Status:Extension
Module Identifier:authnz_ldap_module
Source File:mod_authnz_ldap.c
Compatibility:在 2.1 版和更高版本中可用

Summary

此模块允许诸如_之类的身份验证前端通过 ldap 目录对用户进行身份验证。

mod_authnz_ldap支持以下功能:

  • 已知支持OpenLDAP SDK(包括 1.x 和 2.x),Novell LDAP SDKiPlanet (Netscape) SDK。

  • 可以通过用 LDAP 过滤器表示策略来实现复杂的授权策略。

  • 通过mod_ldap使用大量的 LDAP 操作缓存。

  • 支持基于 SSL 的 LDAP(需要 Netscape SDK)或 TLS(需要 OpenLDAP 2.x SDK 或 Novell LDAP SDK)。

使用mod_auth_basic时,此模块通过_3 值的AuthBasicProvider指令调用。

Contents

General caveats

该模块根据mod_ldap的配置缓存身份验证和授权结果。对后备 LDAP 服务器所做的更改不会立即反映在 HTTP Server 上,包括但不限于用户锁定/撤消,密码更改或组成员身份更改。有关缓存可调参数的详细信息,请查阅mod_ldap中的指令。

Operation

向用户授予访问权分为两个阶段。第一阶段是身份验证,其中mod_authnz_ldap身份验证提供程序验证用户的凭据有效。这也称为搜索/绑定阶段。第二阶段是授权,其中mod_authnz_ldap确定是否允许通过身份验证的用户访问所讨论的资源。这也称为“比较”阶段。

mod_authnz_ldap同时注册 authn_ldap 身份验证提供程序和 authz_ldap 授权处理程序。可以使用ldap值通过AuthBasicProvider指令启用 authn_ldap 身份验证提供程序。 authz_ldap 处理程序通过添加ldap-userldap-dnldap-group值来扩展Require指令的授权类型。

验证阶段

在身份验证阶段,mod_authnz_ldap在目录中搜索与 HTTP Client 端传递的用户名匹配的条目。如果找到单个唯一匹配项,则mod_authnz_ldap尝试使用条目的 DN 加上 HTTP Client 端提供的密码来绑定到目录服务器。因为它先进行搜索,然后进行绑定,所以通常称为搜索/绑定阶段。以下是在搜索/绑定阶段执行的步骤。

  • 通过将AuthLDAPURL指令中提供的属性和过滤器与 HTTP Client 端传递的用户名相结合,生成搜索过滤器。

  • 使用生成的过滤器搜索目录。如果搜索未完全返回一个条目,请拒绝或拒绝访问。

  • 获取从搜索中检索到的条目的可分辨名称,并尝试使用该 DN 和 HTTP Client 端传递的密码来绑定到 LDAP 服务器。如果绑定不成功,请拒绝或拒绝访问。

在搜索/绑定阶段使用以下指令

AuthLDAPURL指定 LDAP 服务器,基本 DN,要在搜索中使用的属性以及要使用的其他搜索过滤器。
AuthLDAPBindDN在搜索阶段要绑定的可选 DN。
AuthLDAPBindPassword在搜索阶段要绑定的可选密码。

授权阶段

在授权阶段,mod_authnz_ldap尝试确定用户是否被授权访问资源。其中许多检查都需要mod_authnz_ldap在 LDAP 服务器上执行比较操作。这就是为什么此阶段通常称为比较阶段的原因。 mod_authnz_ldap接受以下Require指令以确定凭据是否可接受:

  • 如果存在Require ldap-user指令,并且该指令中的用户名与 Client 端传递的用户名匹配,则授予访问权限。

  • 如果存在Require ldap-dn指令,并且该指令中的 DN 与从 LDAP 目录获取的 DN 匹配,则授予访问权限。

  • 如果存在Require ldap-group指令,则授予访问权限,并且从 LDAP 目录(或 Client 端传递的用户名)中提取的 DN 出现在 LDAP 组中,或者可能在其子组之一中。

  • 如果存在Require ldap-attribute指令,并且从 LDAP 目录获取的属性与给定值匹配,则授予访问权限。

  • 如果存在Require ldap-filter指令,则授予访问权限,并且搜索过滤器成功找到与已验证用户的 dn 匹配的单个用户对象。

  • 否则,拒绝或拒绝访问

也可以使用其他Require值,这可能需要加载其他授权模块。

mod_authnz_ldap在比较阶段使用以下指令:

AuthLDAPURLURL 中指定的属性用于Require ldap-user操作的比较操作。
AuthLDAPCompareDNOnServer确定Require ldap-dn指令的行为。
AuthLDAPGroupAttribute确定用于Require ldap-group指令中的比较的属性。
AuthLDAPGroupAttributeIsDN指定在对Require ldap-group指令进行比较时是使用用户 DN 还是用户名。
AuthLDAPMaxSubGroupDepth确定在Require ldap-group指令中进行比较时要评估的子组的最大深度。
AuthLDAPSubGroupAttribute确定在Require ldap-group伪指令中进行比较期间获取当前组的子组成员时要使用的属性。
AuthLDAPSubGroupClass指定 LDAP objectClass 值,该值用于标识在Require ldap-group指令的子组处理期间查询的目录对象是否确实是组对象(与用户对象相对)。

要求指令

在授权阶段使用 Apache 的Require指令来确保允许用户访问资源。 mod_authnz_ldap 使用ldap-userldap-dnldap-groupldap-attributeldap-filter扩展了授权类型。也可以使用其他授权类型,但可能需要加载其他授权模块。

从 v2.4.8 开始,LDAP require 指令中支持expressions

Require ldap-user

Require ldap-user指令指定哪些用户名可以访问资源。 mod_authnz_ldap从目录中检索到唯一的 DN 后,它将使用Require ldap-user中指定的用户名执行 LDAP 比较操作,以查看该用户名是否为刚获取的 LDAP 条目的一部分。通过在行上放置多个用户名(用空格分隔),可以授予多个用户访问权限。如果用户名中有空格,则必须用双引号将其引起来。也可以通过使用多个Require ldap-user指令来授予多个用户访问权限,每行一个用户。例如,对于_6 的AuthLDAPURL(即使用cn进行搜索),可以使用以下 Require 指令来限制访问:

Require ldap-user "Barbara Jenson"
Require ldap-user "Fred User"
Require ldap-user "Joe Manager"

由于mod_authnz_ldap处理此指令的方式,Barbara Jenson 可以以* Barbara Jenson Babs Jenson *或她在 LDAP 条目中拥有的任何其他cn的身份登录。仅需要Require ldap-user行即可支持用户条目中属性的所有值。

如果在上面的 URL 中使用了uid属性而不是cn属性,则以上三行可以压缩为

Require ldap-user bjenson fuser jmanager

Require ldap-group

该伪指令指定允许其成员访问的 LDAP 组。它采用 LDAP 组的专有名称。注意:组名称不要用引号引起来。例如,假定 LDAP 目录中存在以下条目:

dn: cn=Administrators, o=Example
objectClass: groupOfUniqueNames
uniqueMember: cn=Barbara Jenson, o=Example
uniqueMember: cn=Fred User, o=Example

以下指令将授予对 Fred 和 Barbara 的访问权限:

Require ldap-group cn=Administrators, o=Example

如果AuthLDAPMaxSubGroupDepth设置为大于 0 的值,也可以在指定的 LDAP 组的子组中找到成员。例如,假定 LDAP 目录中存在以下条目:

dn: cn=Employees, o=Example
objectClass: groupOfUniqueNames
uniqueMember: cn=Managers, o=Example
uniqueMember: cn=Administrators, o=Example
uniqueMember: cn=Users, o=Example

dn: cn=Managers, o=Example
objectClass: groupOfUniqueNames
uniqueMember: cn=Bob Ellis, o=Example
uniqueMember: cn=Tom Jackson, o=Example

dn: cn=Administrators, o=Example
objectClass: groupOfUniqueNames
uniqueMember: cn=Barbara Jenson, o=Example
uniqueMember: cn=Fred User, o=Example

dn: cn=Users, o=Example
objectClass: groupOfUniqueNames
uniqueMember: cn=Allan Jefferson, o=Example
uniqueMember: cn=Paul Tilley, o=Example
uniqueMember: cn=Temporary Employees, o=Example

dn: cn=Temporary Employees, o=Example
objectClass: groupOfUniqueNames
uniqueMember: cn=Jim Swenson, o=Example
uniqueMember: cn=Elliot Rhodes, o=Example

以下指令将允许访问 Bob Ellis,Tom Jackson,Barbara Jenson,Fred User,Allan Jefferson 和 Paul Tilley,但不允许访问 Jim Swenson 或 Elliot Rhodes(因为它们的子组深度为 2) :

Require ldap-group cn=Employees, o=Example
AuthLDAPMaxSubGroupDepth 1

该指令的行为由AuthLDAPGroupAttributeAuthLDAPGroupAttributeIsDNAuthLDAPMaxSubGroupDepthAuthLDAPSubGroupAttributeAuthLDAPSubGroupClass指令修改。

Require ldap-dn

Require ldap-dn指令允许 Management 员根据专有名称授予访问权限。它指定必须匹配的 DN 才能授予访问权限。如果从目录服务器检索到的专有名称与Require ldap-dn中的专有名称匹配,则将授予授权。注意:专有名称不要用引号引起来。

以下指令将授予对特定 DN 的访问权限:

Require ldap-dn cn=Barbara Jenson, o=Example

该指令的行为由AuthLDAPCompareDNOnServer指令修改。

Require ldap-attribute

Require ldap-attribute指令允许 Management 员基于 LDAP 目录中经过身份验证的用户的属性来授予访问权限。如果目录中的属性与配置中给定的值匹配,则授予访问权限。

以下指令将授予具有 employeeType = active 属性的任何人访问权限

Require ldap-attribute employeeType="active"

可以在同一行上用空格分隔指定多个属性/值对,也可以在多个Require ldap-attribute指令中指定它们。列出多个属性/值对的效果是“或”运算。如果任何列出的属性值与用户对象中相应属性的值匹配,将授予访问权限。如果属性的值包含空格,则仅该值必须在双引号内。

以下指令将授予具有 city 属性等于“ San Jose”或 status 等于“ Active”的任何人的访问权限

Require ldap-attribute city="San Jose" status="active"

Require ldap-filter

Require ldap-filter指令允许 Management 员基于复杂的 LDAP 搜索过滤器授予访问权限。如果过滤器搜索返回的 dn 与经过身份验证的用户 dn 匹配,则授予访问权限。

以下指令将授予拥有手机且在市场部门的任何人访问权限

Require ldap-filter "&(cell=*)(department=marketing)"

Require ldap-filter指令和Require ldap-attribute指令之间的区别在于ldap-filter使用指定的搜索过滤器而不是简单的属性比较对 LDAP 目录执行搜索操作。如果仅需要简单的属性比较,则ldap-attribute执行的比较操作将比ldap-filter使用的搜索操作更快,尤其是在大型目录中。

Examples

使用其 UID 进行搜索,将访问权限授予 LDAP 目录中存在的任何人。

AuthLDAPURL "ldap://ldap1.example.com:389/ou=People, o=Example?uid?sub?(objectClass=*)"
Require valid-user

下一个示例与上述相同;但是省略了具有有用默认值的字段。另外,请注意使用冗余 LDAP 服务器。

AuthLDAPURL "ldap://ldap1.example.com ldap2.example.com/ou=People, o=Example"
Require valid-user
  • 下一个示例与上一个示例相似,但是使用通用名称而不是 UID。请注意,如果目录中的多个人共享同一个cn,这可能会出现问题,因为对cn 的搜索必须 仅返回一个条目。这就是为什么不推荐这种方法的原因:最好选择一个在目录中保证唯一的属性,例如uid
AuthLDAPURL "ldap://ldap.example.com/ou=People, o=Example?cn"
Require valid-user

将访问权限授予 Administrators 组中的任何人。用户必须使用其 UID 进行身份验证。

AuthLDAPURL ldap://ldap.example.com/o=Example?uid
Require ldap-group cn=Administrators, o=Example
  • 将访问权限授予组中名称与虚拟主机的主机名匹配的任何人。在此示例中,expression用于构建过滤器。
AuthLDAPURL ldap://ldap.example.com/o=Example?uid
Require ldap-group cn=%{SERVER_NAME}, o=Example
  • 下一个示例假定“示例”中所有携带字母数字寻呼机的人的 LDAP 属性均为qpagePagerID。该示例仅向具有字母数字寻呼机的人员(通过其 UID 进行身份验证)授予访问权限:
AuthLDAPURL ldap://ldap.example.com/o=Example?uid??(qpagePagerID=*)
Require valid-user
  • 下一个示例演示了使用过滤器来完成复杂的 Management 要求的功能。如果没有过滤器,则必须创建一个新的 LDAP 组,并确保该组的成员与寻呼机用户保持同步。这对于过滤器来说是微不足道的。目标是向拥有寻呼机的任何人授予访问权限,再向没有寻呼机但需要访问同一资源的 Joe Manager 授予访问权限:
AuthLDAPURL ldap://ldap.example.com/o=Example?uid??(|(qpagePagerID=*)(uid=jmanager))
Require valid-user

刚开始时,这最后看起来可能会令人困惑,因此,它有助于基于谁的联系来评估搜索过滤器的外观,如下所示。如果 Fred 用户以fuser的身份连接,则过滤器将如下所示

(&(|(qpagePagerID=*)(uid=jmanager))(uid=fuser))

仅当* fuser 具有寻呼机时,以上搜索才会成功。当 Joe Manager 以 jmanager *身份连接时,过滤器看起来像

(&(|(qpagePagerID=*)(uid=jmanager))(uid=jmanager))

无论* jmanager *是否具有寻呼机,上述搜索都会成功。

Using TLS

要使用 TLS,请参见mod_ldap指令LDAPTrustedClientCertLDAPTrustedGlobalCertLDAPTrustedMode

可以向AuthLDAPURL添加可选的第二个参数,以覆盖LDAPTrustedMode设置的默认连接类型。这将使由* ldap:// * Url 构建的连接升级为同一端口上的安全连接。

Using SSL

要使用 SSL,请参见mod_ldap指令LDAPTrustedClientCertLDAPTrustedGlobalCertLDAPTrustedMode

要指定安全的 LDAP 服务器,请在AuthLDAPURL指令中使用* ldaps:// ,而不是 ldap:// *。

公开登录信息

当此模块执行* authentication *时,在AuthLDAPURL指令中指定的 ldap 属性将放在带有前缀“ AUTHENTICATE_”的环境变量中。

当此模块执行* authorization *时,AuthLDAPURL指令中指定的 ldap 属性将放置在带有前缀“ AUTHORIZE_”的环境变量中。

如果属性字段包含用户名,用户的常用名和电话 Numbers,则 CGI 程序将有权访问此信息,而无需进行第二次独立的 LDAP 查询来收集此附加信息。

这有可能极大简化某些 Web 应用程序中所需的编码和配置。

使用 Active Directory

Active Directory 安装可能同时支持多个域。为了在域之间区分用户,可以将名为“用户主体名称”(UPN)的标识符添加到目录中的用户条目。该 UPN 通常采用用户帐户名的形式,后跟特定域的域组件,例如[email protected]

您可能希望将mod_authnz_ldap模块配置为对组成 Active Directory 林的任何域中存在的用户进行身份验证。这样,可以同时使用同一查询对[email protected][email protected]进行身份验证。

为了使之实用,Active Directory 支持全局编录的概念。此全局编录是 Active Directory 林中所有 Active Directory 服务器的选定属性的只读副本。通过查询全局目录,可以在单个查询中查询所有域,而查询不会跨越可能很慢的链接跨越服务器。

如果启用,则全局编录是运行在端口 3268(对于 SSL 为 3269)上的独立目录服务器。要搜索用户,请在子树中搜索具有空搜索根的* userPrincipalName *属性,如下所示:

AuthLDAPBindDN [email protected]
AuthLDAPBindPassword password
AuthLDAPURL ldap://10.0.0.1:3268/?userPrincipalName?sub

用户需要以[email protected]的形式 Importing 其用户主体名称作为登录名。

将 Microsoft FrontPage 与 mod_authnz_ldap 一起使用

通常,FrontPage 使用特定于 FrontPage Web 的用户/组文件(即mod_authn_filemod_authz_groupfile模块)来处理所有身份验证。不幸的是,不可能仅通过添加适当的指令而更改为 LDAP 身份验证,因为它会破坏 FrontPage Client 端中的* Permissions *表单,后者试图修改基于文本的标准授权文件。

创建 FrontPage 网站后,向其中添加 LDAP 身份验证只需向在网站中创建的* every * .htaccess文件添加以下指令即可

AuthLDAPURL       "the url"
AuthGroupFile     "mygroupfile"
Require group     "mygroupfile"

工作原理

FrontPage 通过将Require valid-user指令添加到.htaccess文件来限制对 Web 的访问。 Require valid-user指令对于就 LDAP 而言有效的任何用户都将成功。这意味着在 LDAP 目录中具有条目的任何人都被视为有效用户,而 FrontPage 仅将本地用户文件中的那些人视为有效用户。通过使用组文件授权替换 ldap-group,Apache 可以在处理授权用户时查阅本地用户文件(由 FrontPage Management),而不是 LDAP。

如上指定添加指令后,FrontPage 用户将能够从 FrontPage Client 端执行所有 Management 操作。

Caveats

  • 选择 LDAP URL 时,用于身份验证的属性应该是对于放入mod_authn_file用户文件中同样有效的属性。用户 ID 是理想的选择。

  • 通过 FrontPage 添加用户时,FrontPage Management 员应选择 LDAP 目录中已经存在的用户名(出于明显的原因)。另外,Management 员 Importing 表单的密码也将被忽略,因为 Apache 实际上将根据 LDAP 数据库中的密码而不是本地用户文件中的密码进行身份验证。这可能会引起 Web Management 员的困惑。

  • 为了使用 FrontPage 支持,必须使用mod_auth_basicmod_authn_filemod_authz_groupfile编译 Apache。这是因为 Apache 仍将使用mod_authz_groupfile组文件来确定用户对 FrontPage 网站的访问范围。

  • 指令必须放在.htaccess文件中。尝试将它们放在<Location><Directory>指令中将不起作用。这是因为mod_authnz_ldap必须能够获取 FrontPage .htaccess文件中的AuthGroupFile指令,以便它知道在哪里寻找有效的用户列表。如果mod_authnz_ldap指令与 FrontPage 指令不在同一.htaccess文件中,则该破解将不起作用,因为mod_authnz_ldap将永远没有机会处理.htaccess文件,并且将无法找到 FrontPage 托管的文件。用户文件。

AuthLDAPAuthorizePrefix Directive

Description:指定授权期间设置的环境变量的前缀
Syntax:AuthLDAPAuthorizePrefix prefix
Default:AuthLDAPAuthorizePrefix AUTHORIZE_
Context:directory, .htaccess
Override:AuthConfig
Status:Extension
Module:mod_authnz_ldap
Compatibility:在 2.3.6 版和更高版本中可用

该指令允许您覆盖在 LDAP 授权期间用于环境变量设置的前缀。如果指定了* AUTHENTICATE_ *,则无论 LDAP 是否执行了身份验证,授权或同时执行了这两种操作,这些环境变量的使用者将看到相同的信息。

Note

根据Require valid-user对用户进行授权时,未设置授权变量。

AuthLDAPBindAuthoritative Directive

Description:确定当可以将用户 Map 到 DN 但服务器无法成功绑定用户凭据时是否使用其他身份验证提供程序。
Syntax:AuthLDAPBindAuthoritative off|on
Default:AuthLDAPBindAuthoritative on
Context:directory, .htaccess
Override:AuthConfig
Status:Extension
Module:mod_authnz_ldap

默认情况下,仅当无法将用户 Map 到 DN 时才查询后续身份验证提供程序,但如果可以将用户 Map 到 DN 且无法通过 LDAP 绑定验证其密码就不会查询。如果AuthLDAPBindAuthoritative设置为* off *,则 LDAP 绑定(使用当前用户的凭据)由于任何原因而失败时,其他配置的身份验证模块将有机会验证用户。

这允许 LDAP 和AuthUserFile中都存在的用户在 LDAP 服务器可用但用户帐户被锁定或否则无法使用密码时进行身份验证。

See also

AuthLDAPBindDN Directive

Description:绑定到 LDAP 服务器时使用的可选 DN
Syntax:AuthLDAPBindDN distinguished-name
Context:directory, .htaccess
Override:AuthConfig
Status:Extension
Module:mod_authnz_ldap

搜索条目时用于绑定到服务器的可选 DN。如果未提供,mod_authnz_ldap将使用匿名绑定。

AuthLDAPBindPassword Directive

Description:与绑定 DN 结合使用的密码
Syntax:AuthLDAPBindPassword password
Context:directory, .htaccess
Override:AuthConfig
Status:Extension
Module:mod_authnz_ldap
Compatibility:* exec:*已在 2.4.5 中添加。

与绑定 DN 结合使用的绑定密码。请注意,绑定密码可能是敏感数据,应适当保护。仅在绝对需要它们搜索目录时,才应使用AuthLDAPBindDNAuthLDAPBindPassword

如果该值以 exec 开头:将会执行结果命令,并且程序返回到标准输出的第一行将用作密码。

#Password used as-is
AuthLDAPBindPassword secret

#Run /path/to/program to get my password
AuthLDAPBindPassword exec:/path/to/program

#Run /path/to/otherProgram and provide arguments
AuthLDAPBindPassword "exec:/path/to/otherProgram argument1"

AuthLDAPCharsetConfig Directive

Description:字符集转换配置文件的语言
Syntax:AuthLDAPCharsetConfig file-path
Context:server config
Status:Extension
Module:mod_authnz_ldap

AuthLDAPCharsetConfig伪指令将语言的位置设置为字符集转换配置文件。文件路径是相对于ServerRoot的。该文件指定字符集的语言扩展列表。大多数 Management 员使用提供的charset.conv文件,该文件将公共语言 extensions 与字符集相关联。

该文件包含以下格式的行:

Language-Extension charset [Language-String] ...

extensions 的大小写无关紧要。空行和以井号(#)开头的行将被忽略。

AuthLDAPCompareAsUser Directive

Description:使用经过身份验证的用户的凭据执行授权比较
Syntax:AuthLDAPCompareAsUser on|off
Default:AuthLDAPCompareAsUser off
Context:directory, .htaccess
Override:AuthConfig
Status:Extension
Module:mod_authnz_ldap
Compatibility:在 2.3.6 版和更高版本中可用

设置后且mod_authnz_ldap已验证用户身份,用于授权的 LDAP 比较将使用已验证用户的查询专有名称(DN)和 HTTP 基本身份验证密码,而不是服务器配置的凭据。

  • ldap-attribute ldap-user ldap-group *(仅单级)授权检查使用比较。

当同时启用了AuthLDAPSearchAsUser时,此伪指令仅对嵌套组处理期间执行的比较有效。

仅当 LDAP 服务器不接受匿名比较并且您不能使用专用的AuthLDAPBindDN时,才应使用此伪指令。

See also

AuthLDAPCompareDNOnServer Directive

Description:使用 LDAP 服务器比较 DN
Syntax:AuthLDAPCompareDNOnServer on|off
Default:AuthLDAPCompareDNOnServer on
Context:directory, .htaccess
Override:AuthConfig
Status:Extension
Module:mod_authnz_ldap

设置后,mod_authnz_ldap将使用 LDAP 服务器比较 DN。这是比较 DN 的唯一简单方法。 mod_authnz_ldap将在目录中搜索用Require dn指令指定的 DN,然后检索 DN 并将其与从用户条目中检索的 DN 进行比较。如果未设置此指令,则mod_authnz_ldap只是进行字符串比较。通过这种方法可能会得到假阴性,但是速度要快得多。请注意,在大多数情况下,mod_ldap缓存可以加快 DN 比较。

AuthLDAPDereferenceAliases Directive

Description:模块何时取消引用别名
Syntax:AuthLDAPDereferenceAliases never|searching|finding|always
Default:AuthLDAPDereferenceAliases always
Context:directory, .htaccess
Override:AuthConfig
Status:Extension
Module:mod_authnz_ldap

该伪指令指定mod_authnz_ldap在 LDAP 操作期间何时取消引用别名。默认值为always

AuthLDAPGroupAttribute Directive

Description:LDAP 属性用于标识组的用户成员。
Syntax:AuthLDAPGroupAttribute attribute
Default:AuthLDAPGroupAttribute member uniqueMember
Context:directory, .htaccess
Override:AuthConfig
Status:Extension
Module:mod_authnz_ldap

此伪指令指定用于检查组中用户成员的 LDAP 属性。通过多次指定此指令可以使用多个属性。如果未指定,则mod_authnz_ldap使用memberuniqueMember属性。

AuthLDAPGroupAttributeIsDN Directive

Description:检查组成员身份时使用 Client 端用户名的 DN
Syntax:AuthLDAPGroupAttributeIsDN on|off
Default:AuthLDAPGroupAttributeIsDN on
Context:directory, .htaccess
Override:AuthConfig
Status:Extension
Module:mod_authnz_ldap

设置为on时,此伪指令指示在检查组成员身份时使用 Client 端用户名的专有名称。否则,将使用用户名。例如,假设 Client 端发送了用户名bjenson,它对应于 LDAP DN cn=Babs Jenson, o=Example。如果设置了此伪指令,mod_authnz_ldap将检查该组是否具有cn=Babs Jenson, o=Example作为成员。如果未设置此指令,则mod_authnz_ldap将检查该组是否具有bjenson作为成员。

AuthLDAPInitialBindAsUser Directive

Description:确定服务器是否使用基本身份验证用户自己的用户名而不是匿名或使用服务器的硬编码凭据来执行初始 DN 查找
Syntax:AuthLDAPInitialBindAsUser off|on
Default:AuthLDAPInitialBindAsUser off
Context:directory, .htaccess
Override:AuthConfig
Status:Extension
Module:mod_authnz_ldap
Compatibility:在 2.3.6 版和更高版本中可用

默认情况下,服务器将以匿名方式或使用专用用户和密码将基本身份验证用户名转换为 LDAP 专有名称(DN)。该指令强制服务器使用传入用户提供的逐字用户名和密码来执行初始 DN 搜索。

如果逐字用户名不能直接绑定,但是需要一些修饰,请参见AuthLDAPInitialBindPattern

仅当 LDAP 服务器不接受匿名搜索并且您不能使用专用的AuthLDAPBindDN时,才应使用此伪指令。

Not available with authorization-only

仅当此模块对用户进行身份验证时,才可以使用此伪指令;而当该模块专门用于授权时,则无效。

See also

AuthLDAPInitialBindPattern Directive

Description:指定绑定到 LDAP 服务器以执行 DN 查找时要使用的基本身份验证用户名的转换
Syntax:AuthLDAPInitialBindPattern regex substitution
Default:AuthLDAPInitialBindPattern (.*) $1 (remote username used verbatim)
Context:directory, .htaccess
Override:AuthConfig
Status:Extension
Module:mod_authnz_ldap
Compatibility:在 2.3.6 版和更高版本中可用

如果AuthLDAPInitialBindAsUser设置为* ON *,则基本身份验证用户名将根据正则表达式和替换参数进行转换。

将正则表达式参数与当前的基本身份验证用户名进行比较。替换参数可以包含反向引用,但没有其他变量插值。

仅当 LDAP 服务器不接受匿名搜索并且您不能使用专用的AuthLDAPBindDN时,才应使用此伪指令。

AuthLDAPInitialBindPattern (.+) [email protected]
AuthLDAPInitialBindPattern (.+) cn=$1,dc=example,dc=com

Not available with authorization-only

仅当此模块对用户进行身份验证时,才可以使用此伪指令;而当该模块专门用于授权时,则无效。

debugging

替换的 DN 记录在环境变量* LDAP_BINDASUSER *中。如果正则表达式与 Importing 不匹配,则使用逐字用户名。

See also

AuthLDAPMaxSubGroupDepth Directive

Description:指定在中断用户搜索之前将评估的最大子组嵌套深度。
Syntax:AuthLDAPMaxSubGroupDepth Number
Default:AuthLDAPMaxSubGroupDepth 10
Context:directory, .htaccess
Override:AuthConfig
Status:Extension
Module:mod_authnz_ldap
Compatibility:在 2.3.0 版和更高版本中可用

当此指令设置为非零值X并结合使用Require ldap-group someGroupDN指令时,将搜索提供的用户凭据作为someGroupDN目录对象的成员或当前组的任何组成员,直到最大嵌套此指令指定的级别X

有关更详细的示例,请参见Require ldap-group部分。

Nested groups performance

AuthLDAPSubGroupAttributeAuthLDAPGroupAttribute重叠时(默认情况下以及常见 LDAP 模式的要求),未缓存的大组子组搜索会非常慢。如果使用大的非嵌套组,请将AuthLDAPMaxSubGroupDepth设置为零。

AuthLDAPRemoteUserAttribute Directive

Description:使用在用户查询期间返回的属性的值来设置 REMOTE_USER 环境变量
Syntax:AuthLDAPRemoteUserAttribute uid
Default:none
Context:directory, .htaccess
Override:AuthConfig
Status:Extension
Module:mod_authnz_ldap

如果设置了此指令,则REMOTE_USER环境变量的值将设置为指定的属性的值。确保此属性包含在AuthLDAPURL定义的属性列表中,否则此伪指令将无效。如果存在,此指令优先于AuthLDAPRemoteUserIsDN。如果您希望人们使用电子邮件地址登录网站,但是后端应用程序将用户名用作用户标识,则此指令很有用。

AuthLDAPRemoteUserIsDN Directive

Description:使用 Client 端用户名的 DN 设置 REMOTE_USER 环境变量
Syntax:AuthLDAPRemoteUserIsDN on|off
Default:AuthLDAPRemoteUserIsDN off
Context:directory, .htaccess
Override:AuthConfig
Status:Extension
Module:mod_authnz_ldap

如果此指令设置为 on,则REMOTE_USER环境变量的值将设置为已认证用户的完整专有名称,而不仅仅是 Client 端传递的用户名。默认情况下处于关闭状态。

AuthLDAPSearchAsUser Directive

Description:使用经过身份验证的用户的凭据执行授权搜索
Syntax:AuthLDAPSearchAsUser on|off
Default:AuthLDAPSearchAsUser off
Context:directory, .htaccess
Override:AuthConfig
Status:Extension
Module:mod_authnz_ldap
Compatibility:在 2.3.6 版和更高版本中可用

设置后且mod_authnz_ldap已对用户进行身份验证,LDAP 搜索将使用身份验证用户的查询专有名称(DN)和 HTTP 基本身份验证密码,而不是服务器配置的凭据来进行授权搜索。

  • ldap-filter ldap-dn *授权检查使用搜索。

当同时启用了AuthLDAPCompareAsUser时,此伪指令仅对嵌套组处理期间执行的比较有效。

仅当 LDAP 服务器不接受匿名搜索并且您不能使用专用的AuthLDAPBindDN时,才应使用此伪指令。

See also

AuthLDAPSubGroupAttribute Directive

Description:指定属性标签(每条指令行一个值),用于区分当前组中属于组的成员。
Syntax:AuthLDAPSubGroupAttribute attribute
Default:AuthLDAPSubGroupAttribute member uniqueMember
Context:directory, .htaccess
Override:AuthConfig
Status:Extension
Module:mod_authnz_ldap
Compatibility:在 2.3.0 版和更高版本中可用

LDAP 组对象可以包含作为用户的成员和作为组的成员(称为嵌套或子组)。 AuthLDAPSubGroupAttribute指令标识组成员的标签,而AuthLDAPGroupAttribute指令标识用户成员的标签。通过多次指定此指令可以使用多个属性。如果未指定,则mod_authnz_ldap使用memberuniqueMember属性。

AuthLDAPSubGroupClass Directive

Description:指定哪些 LDAP objectClass 值标识在子组处理期间作为组的目录对象。
Syntax:AuthLDAPSubGroupClass LdapObjectClass
Default:AuthLDAPSubGroupClass groupOfNames groupOfUniqueNames
Context:directory, .htaccess
Override:AuthConfig
Status:Extension
Module:mod_authnz_ldap
Compatibility:在 2.3.0 版和更高版本中可用

LDAP 组对象可以包含作为用户的成员和作为组的成员(称为嵌套或子组)。 AuthLDAPSubGroupAttribute指令标识可能是当前组子组的成员的标签(与用户成员相对)。 AuthLDAPSubGroupClass指令指定用于验证这些潜在子组实际上是组对象的 LDAP objectClass 值。然后可以在经过验证的小组中搜索更多用户或小组成员。通过多次指定此指令可以使用多个属性。如果未指定,则mod_authnz_ldap使用groupOfNamesgroupOfUniqueNames值。

AuthLDAPURL Directive

Description:指定 LDAP 搜索参数的 URL
Syntax:AuthLDAPURL url [NONE|SSL|TLS|STARTTLS]
Context:directory, .htaccess
Override:AuthConfig
Status:Extension
Module:mod_authnz_ldap

RFC 2255 URL,用于指定要使用的 LDAP 搜索参数。 URL 的语法是

ldap://host:port/basedn?attribute?scope?filter

如果要指定 Apache 应该依次尝试的多个 LDAP URL,则语法为:

AuthLDAPURL "ldap://ldap1.example.com ldap2.example.com/dc=..."

*注意: 如果指定多个服务器,则需要将整个 URL 字符串括在引号中;否则,您将得到一个错误:“ AuthLDAPURL 接受一个参数,URL 定义 LDAP 连接。” *当然,您可以在每个参数上使用搜索参数。

  • ldap

    • 对于常规 ldap,请使用字符串ldap。对于安全的 LDAP,请改用ldaps。仅当 Apache 链接到具有 SSL 支持的 LDAP 库时,安全 LDAP 才可用。
  • host:port

    • ldap 服务器的名称/端口(对于ldap默认为localhost:389,对于ldaps默认为localhost:636)。要指定多个冗余 LDAP 服务器,只需列出所有服务器,并用空格分隔即可。 mod_authnz_ldap将尝试依次连接到每个服务器,直到连接成功为止。如果指定了多个 ldap 服务器,则必须将整个 LDAP URL 封装在双引号中。

与服务器构建连接后,该连接将在httpd进程的整个生命周期内保持活动状态,或者直到 LDAP 服务器关闭为止。

如果 LDAP 服务器出现故障并断开现有连接,则mod_authnz_ldap将尝试重新连接,从主服务器开始,然后依次尝试每个冗余服务器。请注意,这与 true 的循环搜索不同。

  • basedn

    • 所有搜索应从其开始的目录分支的 DN。至少,这必须是目录树的顶部,但也可以在目录中指定子树。
  • attribute

    • 要搜索的属性。尽管 RFC 2255 允许使用逗号分隔的属性列表,但是无论提供多少属性,都只会使用第一个属性。如果未提供任何属性,则默认值为uid。选择一个在您要使用的子树中的所有条目中唯一的属性是一个好主意。列出的所有属性都将以 AUTHENTICATE 前缀放入环境中,以供其他模块使用。
  • scope

    • 搜索范围。可以是onesub。请注意,RFC 2255 也支持base的作用域,但此模块不支持。如果未提供范围,或者指定了base scope,则默认值为sub范围。
  • filter

    • 有效的 LDAP 搜索过滤器。如果未提供,则默认为(objectClass=*),它将搜索树中的所有对象。过滤器限制为大约 8000 个字符(Apache 源代码中MAX_STRING_LEN的定义)。对于任何应用程序,这应该绰绰有余。在 2.4.10 及更高版本中,关键字none禁止使用过滤器;这是某些原始 LDAP 服务器所必需的。

进行搜索时,将 HTTP Client 端传递的属性,过滤器和用户名组合在一起,以创建类似于(&(filter)(attribute=username))的搜索过滤器。

例如,假设 URL 为ldap://ldap.example.com/o=Example?cn?sub?(posixid=*)。当 Client 端尝试使用用户名Babs Jenson进行连接时,结果搜索过滤器将为(&(posixid=*)(cn=Babs Jenson))

可以添加可选参数,以允许 LDAP Url 覆盖连接类型。此参数可以是以下之一:

  • NONE

    • 在默认 LDAP 端口上构建不安全的连接。这与端口 389 上的ldap://相同。
  • SSL

    • 在默认的安全 LDAP 端口上构建安全连接。这与ldaps://相同
  • TLS | STARTTLS

    • 在默认 LDAP 端口上构建升级的安全连接。默认情况下,此连接将在端口 389 上启动,然后升级到同一端口上的安全连接。

有关AuthLDAPURL URL 的示例,请参见上文。