Авторизация через LDAP

  • Создана: 04.04.2017
  • Обновлена: 07.12.2023

Перед настройкой аутентификации через LDAP необходимо импортировать одного или нескольких пользователей из LDAP-каталога.
-

Настройка в Docker-образе

Мы подготовили пример файла конфигурации для подключения к LDAP (необходимо отредактировать файл и указать актуальные параметры подключения к вашему LDAP). Для подключения этой конфигурации необходимо выполнить команды:

> docker exec -it alm bash
# a2dissite devprom
# a2ensite ldap
После переключения используемой конфигурации Apache необходимо перезагрузить контейнер
> docker restart alm

Для аутентификации с использованием данного примера, можно использовать следующие пары:

  • nobel/password
  • einstein/password

Настройка под Debian, Ubuntu

Используйте этот конфигурационный файл как шаблон для настройки LDAP в Apache. Например, сохраните его в файл /etc/apache2/sites-available/ldap.conf

<VirtualHost *:80>
    DocumentRoot /var/www/devprom/htdocs
    Timeout 600
    KeepAlive On
    MaxKeepAliveRequests 0
    KeepAliveTimeout 150

    HostnameLookups Off
    UseCanonicalName Off

    ErrorDocument 404 app/front.php
    ErrorDocument 500 app/front.php

    Session On
    SessionEnv On
    SessionCookieName session path=/
    SessionCryptoPassphrase secret
    ErrorDocument 401 /login
    SetEnv no-auth 1

    <Directory /var/www/devprom/htdocs>
        Options +ExecCGI -Indexes
        AllowOverride All
            
        AuthType form
        AuthName realm
        AuthFormProvider ldap anon
        AuthFormAuthoritative off
        AuthFormLoginRequiredLocation /login?redirect=%{REQUEST_URI}%{escape:?%{QUERY_STRING}}
        AuthFormPassword pass
        AuthFormUsername login

        AuthLDAPURL "ldap://IP-DOMAIN-CONTROLLER:389/ou=Germany,dc=example,dc=com?sAMAccountName?sub?(objectClass=*)"
        AuthLDAPBindDN "CN=John Doe,OU=IT Department,OU=Germany,DC=example,DC=com"
        AuthLDAPBindPassword "secret"
        AuthLDAPBindAuthoritative off
        AuthLDAPRemoteUserIsDN on
        LDAPReferrals Off
                
        Anonymous_NoUserID off
        Anonymous_MustGiveEmail off
        Anonymous_VerifyEmail off
        Anonymous_LogEmail off
        Anonymous *

        Require valid-user
    </Directory>
    
    <Location /auth>
        SetHandler form-login-handler
        AuthFormLoginSuccessLocation /logged
    </Location>
    <Location /logoff>
        Session on
        SessionMaxAge 1
        SessionCookieName session path=/
    </Location>
    <LocationMatch "/(join-project|plugins|login|recovery|reset|404|50[\d]{1}|cache|scripts|images|img|favicon|app/non-auth|tasks)">
        Options -Indexes
        AuthType None
        Require all granted
    </LocationMatch>
    <If "%{HTTP:Devprom-Auth-Key} != ''">
        AllowOverride All
        AuthType None
        Require all granted
    </If>
    <Location /api>
        Options -Indexes
        AllowOverride All
        AuthType None
        Require all granted
    </Location>
    <Location /servicedesk>
        Options -Indexes
        AllowOverride All
        AuthType None
        Require all granted
    </Location>
    <Location /co/bundles/Devprom/ServiceDeskBundle/public>
        Options -Indexes
        AllowOverride All
        AuthType None
        Require all granted
    </Location>
</VirtualHost>

Теперь нужно выполнить следующие команды, чтобы активировать нужные модули и сделать этот конфигурационный файл основным:

a2enmod ldap authnz_ldap authn_anon session session_cookie request auth_form session_crypto
a2dissite 000-default
a2ensite ldap.conf
service apache2 restart

Настройка под CentOS

Предварительно необходимо установить дополнительные модули и перезапустить сервис httpd

CentOS 6

yum -y install mod_ldap mod_authnz_ldap mod_session mod_session_cookie mod_auth_form mod_session_crypto
service httpd restart

CentOS 7

yum -y install mod_ldap mod_session apr-util-openssl
service httpd restart

Настройте конфигурационный файл /etc/httpd/conf.d/devprom.conf следующим образом:

LoadModule env_module modules/mod_env.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule ldap_module modules/mod_ldap.so
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
LoadModule authn_anon_module modules/mod_authn_anon.so
LoadModule session_module modules/mod_session.so
LoadModule session_cookie_module modules/mod_session_cookie.so
LoadModule request_module modules/mod_request.so
LoadModule auth_form_module modules/mod_auth_form.so
LoadModule session_crypto_module modules/mod_session_crypto.so 

<VirtualHost *:80>
    DocumentRoot /var/www/devprom/htdocs
    Timeout 600
    KeepAlive On
    MaxKeepAliveRequests 0
    KeepAliveTimeout 150

    HostnameLookups Off
    UseCanonicalName Off

    ErrorDocument 404 app/front.php
    ErrorDocument 500 app/front.php

    Session On
    SessionEnv On
    SessionCookieName session path=/
    SessionCryptoPassphrase secret
    ErrorDocument 401 /login
    SetEnv no-auth 1

    <Directory /var/www/html/devprom>
        Options +ExecCGI
        AllowOverride All
            
        AuthType form
        AuthName realm
        AuthFormProvider ldap anon
        AuthFormAuthoritative off
        AuthFormLoginRequiredLocation /login?redirect=%{REQUEST_URI}%{escape:?%{QUERY_STRING}}
        AuthFormPassword pass
        AuthFormUsername login

        AuthLDAPURL "ldap://localhost:10389/ou=system?uid??(objectClass=*)"
        AuthLDAPBindDN "uid=admin,ou=system"
        AuthLDAPBindPassword "secret"
        AuthLDAPBindAuthoritative off
        AuthLDAPRemoteUserIsDN on
        LDAPReferrals Off
                
        Anonymous_NoUserID off
        Anonymous_MustGiveEmail off
        Anonymous_VerifyEmail off
        Anonymous_LogEmail off
        Anonymous *

        Require valid-user
    </Directory>
    
    <Location /auth>
        SetHandler form-login-handler
        AuthFormLoginSuccessLocation /logged
    </Location>
    <Location /logoff>
        Session on
        SessionMaxAge 1
        SessionCookieName session path=/
    </Location>
    <LocationMatch "/(join-project|plugins|login|recovery|reset|404|50[\d]{1}|cache|scripts|images|img|favicon|app/non-auth|tasks)">
        AuthType None
        Require all granted
    </LocationMatch>
    <If "%{HTTP:Devprom-Auth-Key} != ''">
        AllowOverride All
        AuthType None
        Require all granted
    </If>
    <Location /api>
        AllowOverride All
        AuthType None
        Require all granted
    </Location>
    <Location /servicedesk>
        AllowOverride All
        AuthType None
        Require all granted
    </Location>
    <Location /co/bundles/Devprom/ServiceDeskBundle/public>
        AllowOverride All
        AuthType None
        Require all granted
    </Location>
</VirtualHost>

При использовании этой ОС по умолчанию может быть установлен запрет на подключение httpd к сети и к LDAP в частности. Неоходимо этот запрет снять командами:

setsebool -P httpd_can_connect_ldap on
setsebool -P httpd_can_network_connect on

Устранение возможных проблем

В случае возникновения проблем с авторизацией необходимо открыть на редактирование файл devprom/apache/conf/httpd.conf и изменить значение параметра: LogLevel debug

Затем, необходимо перезапустить сервис devprom.apache, авторизоваться повторно и изучить проблему в логе devprom/apache/logs/error.log, возможно некорректно заданы параметры подключения к LDAP-каталогу.

  1. При использовании Active Directory может потребоваться изменить порт подключения с 389 на 3268 (Global Catalog)

Поддержка нескольких LDAP-каталогов

При использовании нескольких LDAP-каталогов, в которых хранится аутентификационная информация, необходимо немного изменить настройку:

LoadModule ldap_module modules/mod_ldap.so
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
LoadModule authn_anon_module modules/mod_authn_anon.so
LoadModule session_module modules/mod_session.so
LoadModule session_cookie_module modules/mod_session_cookie.so
LoadModule request_module modules/mod_request.so
LoadModule auth_form_module modules/mod_auth_form.so
LoadModule session_crypto_module modules/mod_session_crypto.so 

<AuthnProviderAlias ldap alpha>
    AuthLDAPURL "ldap://localhost:10389/ou=system?uid??(objectClass=*)"
    AuthLDAPBindDN "uid=admin,ou=system"
    AuthLDAPBindPassword "secret"
    AuthLDAPBindAuthoritative on
    AuthLDAPRemoteUserIsDN on
    LDAPReferrals Off
</AuthnProviderAlias>
    
<AuthnProviderAlias ldap beta>
    AuthLDAPBindDN "cn=read-only-admin,dc=example,dc=com"
    AuthLDAPBindPassword "password"
    AuthLDAPURL "ldap://ldap.forumsys.com:389/dc=example,dc=com?uid??(objectClass=*)"
    AuthLDAPBindAuthoritative on
    AuthLDAPRemoteUserIsDN on
    LDAPReferrals Off
</AuthnProviderAlias>

<VirtualHost *:80>
    DocumentRoot /var/www/devprom/htdocs
	Timeout 600
	KeepAlive On
	MaxKeepAliveRequests 0
	KeepAliveTimeout 150

    ErrorDocument 404 app/front.php
    ErrorDocument 500 app/front.php

    Session On
    SessionEnv On
    SessionCookieName session path=/
    SessionCryptoPassphrase secret
    ErrorDocument 401 /login
    SetEnv no-auth 1

    <Directory />
        Options ExecCGI
        AllowOverride All
            
        AuthType form
        AuthName realm
        AuthFormProvider alpha beta anon
        AuthFormAuthoritative off
        AuthFormLoginRequiredLocation /login?redirect=%{REQUEST_URI}%{escape:?%{QUERY_STRING}}
        AuthFormPassword pass
        AuthFormUsername login
              
        Anonymous_NoUserID off
        Anonymous_MustGiveEmail off
        Anonymous_VerifyEmail off
        Anonymous_LogEmail off
        Anonymous *

        Require valid-user
    </Directory>
    
    <Location /auth>
        SetHandler form-login-handler
        AuthFormLoginSuccessLocation /logged
    </Location>
    <Location /logoff>
        Session on
        SessionMaxAge 1
        SessionCookieName session path=/
    </Location>
    <LocationMatch "/(join-project|plugins|login|recovery|reset|404|50[\d]{1}|cache|scripts|images|img|favicon|app/non-auth|tasks)">
        AuthType None
        Require all granted
    </LocationMatch>
    <If "%{HTTP:Devprom-Auth-Key} != ''">
        AllowOverride All
        AuthType None
        Require all granted
    </If>
    <Location /api>
        AllowOverride All
        AuthType None
        Require all granted
    </Location>
    <Location /servicedesk>
        AllowOverride All
        AuthType None
        Require all granted
    </Location>
    <Location /co/bundles/Devprom/ServiceDeskBundle/public>
        AllowOverride All
        AuthType None
        Require all granted
    </Location>

    LogLevel error
</VirtualHost>

Использование NTLM, Kerberos

Для реализации встроенной аутентификации посредством протоколов NTLM или Kerberos выполните настройку Apache, как описано в этой инструкции.

Решения для поддержки процессов разработки Devprom Software