基于 URL 的 Apache 身份验证/LDAP 组

基于 URL 的 Apache 身份验证/LDAP 组

我正在为 Apache2 HTTPD 进行 LDAP 身份验证,想知道是否可以让 Apache 根据组对 LDAP 进行身份验证,但也取决于提供的 URL。例如,如果用户请求以下内容:

http://www.example.com/<a组名>/

Apache 将请求凭证并根据 LDAP 目录服务 (OpenLDAP) 进行检查,以确保用户属于“<组名>”组。实际上,用户应该能够请求任意资源,Apache 应该能够获取 URL、提取所请求的特定资源,并确保用户属于同名组。

我找不到任何有关从 URL 请求中提取信息并在 Apache 配置文件中处理该信息的信息。有人做过类似的事情吗?

答案1

虽然我还没有完全按照您的要求去做,但我相对确信这是可能的。在我的工作中,我们针对 ActiveDirectory 服务器使用 LDAP authn/authz。

通过使用各种 AuthLDAP 指令配置 Location 标签,您可以设置 Apache 以针对 LDAP 进行身份验证。sAMAccountName针对 AD 的一个简单示例:

<Location /secured>
   AuthType Basic
   AuthzLDAPAuthoritative on
   AuthUserFile /dev/null
   AuthName "Authorization required"
   AuthBasicProvider ldap
   AuthLDAPURL "ldap://ldap.example.com/ou=MyOrg,dc=myDC,dc=myDC?sAMAccountName?sub?(objectClass=*)"
   AuthLDAPBindDN "ldapQueryUser"
   AuthLDAPBindPassword "ldapQueryPassword"
   require valid-user
</Location>

似乎您应该能够为每个<a group name>组设置位置,每个组使用不同的 LDAP 查询:

<Location /group_A>
    AuthSetups blah blahblah
    AuthLDAPURL "ldap://ldap.example.com/ou=MyOrg,dc=group_A?..."
</Location>

<Location /group_B>
    AuthSetups blah blahblah
    AuthLDAPURL "ldap://ldap.example.com/ou=MyOrg,dc=group_A?..."
</Location>

在使用 Apache 和 LDAP 时,我发现最好先找出能够正确返回用户的查询,然后再尝试将其集成到 Apache。我的错误几乎每次都是 LDAP 错误,因此,正确查询使 apache authn/z 部分变得简单。

答案2

您可以使用虚拟主机来匹配位置,无论是通过位置还是位置匹配。

下面是针对 Apache 2.4 进行更新的示例,它在查询 ActiveDirectory 的 Windows 2012 Server 上运行(重点关注 LocationMatch 部分):

<VirtualHost *:80>
 WSGIScriptAlias /bloodhound C:/apache/bloodhound/installer/bloodhound/site/cgi-bin/trac.wsgi
<Directory C:/apache/bloodhound/installer/bloodhound/site/cgi-bin>
      WSGIApplicationGroup %{GLOBAL}
      Require all granted
      <Files trac.wsgi>
        Require all granted
    </Files>
 </Directory>
 LogLevel debug
 <LocationMatch "/bloodhound/([^/]+/)?login">
      AuthLDAPURL "ldap://<HOST_NAME>:3268/<SEARCH_BASE>?sAMAccountName?sub?(objectClass=user)"
      AuthLDAPBindDN "<BIND_DN>"
      AuthLDAPBindPassword "<PASSWORD>"
      LDAPReferrals Off

      AuthType Basic
      AuthName "Bloodhound - Please Provide Your Credentials"
      AuthBasicProvider ldap
      #If you want to use an LDAP Filter, 
      #uncomment the following and use instead of the ldap-group and subsequent config
      #Require ldap-filter memberof:1.2.840.113556.1.4.1941:=<GROUP_DN>
      Require ldap-group <GROUP_DN>
      AuthLDAPMaxSubGroupDepth 1
      AuthLDAPSubgroupAttribute member
      AuthLDAPSubGroupClass group
      AuthLDAPGroupAttribute member
      AuthLDAPGroupAttributeIsDN on
 </LocationMatch>

另一种方法是按照@khoxsey 的建议去做。但是,如果 LocationMatch 更适合您的需求,您可以使用它来代替 Location。

相关内容