Авторизация через LDAP
Настройка в Docker-образе
Мы подготовили пример файла конфигурации для подключения к LDAP (необходимо отредактировать файл и указать актуальные параметры подключения к вашему LDAP). Для подключения этой конфигурации необходимо выполнить команды:
> docker exec -it alm bash
# a2dissite devprom
# a2ensite ldap
> 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-каталогу.
-
При использовании 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, как описано в этой инструкции.