Назад | Перейти на главную страницу

Аутентификация Apache / Группа LDAP на основе URL

Я работаю над аутентификацией LDAP для Apache2 HTTPD, и мне было интересно, можно ли заставить Apache аутентифицироваться в LDAP на основе групп, а также в зависимости от предоставленного URL-адреса. Например, если пользователь запрашивает следующее:

http://www.example.com/<a название группы> /

Apache запросит учетные данные и проверит их в службе каталогов LDAP (OpenLDAP), чтобы убедиться, что пользователь принадлежит к группе «<a имя группы>». По сути, пользователь должен иметь возможность запрашивать любой произвольный ресурс, а Apache должен иметь возможность принимать URL-адрес, извлекать конкретный запрашиваемый ресурс и гарантировать, что пользователь принадлежит к группе с тем же именем.

Я не смог найти никакой соответствующей информации относительно извлечения информации из URL-запроса и обработки его в файлах конфигурации Apache. Кто-нибудь делал что-нибудь похожее на это?

Хотя я не сделал в точности того, о чем вы просите, я относительно уверен, что это возможно. В моей работе мы используем LDAP authn / authz против сервера ActiveDirectory.

Вы настраиваете Apache для аутентификации по LDAP, настраивая тег Location с различными директивами AuthLDAP. Простой пример с использованием 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.

Вы можете использовать виртуальные хосты для сопоставления с местоположениями, будь то с помощью Location или LocationMatch.

Вот пример, обновленный для Apache 2.4 и запущенный на сервере Windows 2012, который запрашивает ActiveDirectory (сосредоточьтесь на разделе 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, если это лучше соответствует вашим потребностям.