Ключевые слова:auth, ldap, linux, apache, (найти похожие документы)
From: Roman Sozinov <http://sozinov.blogspot.com>
Date: Mon, 3 Jan 2008 14:31:37 +0000 (UTC)
Subject: Аутентификация в apache через modXLdapAuth
Оригинал: http://sozinov.blogspot.com/2007/05/modxldapauth.html
Для того, чтобы аутентифицировать пользователя по сертификату в Apache
достаточно добавить соответствующую директиву (SSLVerifyClient). Но в
таком случае очень неудобно строить политику доступа - нет ни базы
сертификатов, с которой бы можно было оперировать, ни возможностей по
разграничению доступа (авторизации). На помощь приходит модуль
modXLdapAuth (homepage), который использует LDAP как хранилище
пользовательских данных, взятых из сертификатов и предоставляющий
дополнительные средства для реализации политики доступа к закрытым
ресурсам. Единственное ограничение с которым я столкнулся - модуль
работает только с Apache 2.0.x (ветки 1.3 и 2.2 не поддерживаются).
Прежде чем начинать сборку модуля необходимо подготовить LDAP сервер -
необходимо включить в конфигурацию сервиса дополнительную схему
(schema) modXLDAPAuth [[[http://blogs.ssc.lt/roller-ui/resources/rs/modXLDAPAuth.schema 1Kb].]] В OpenLDAP это делается добавлением
строки
include /etc/ldap/schema/modXLDAPAuth.schema
в основной файл конфигурации slapd.conf.
После того как дополнительная схема загружена, можно создать запись о
будущем пользователе, дополнительно указав атрибуты, взятые из
сертификата пользователя:
CertificateClientCN - обычно имя, на которое выдан сертификат
CertificateIssuer - CA, выдавший сертификат
CertificateSerialNumber - серийный номер сертификата
По данным атрибутам будет осуществляться аутентификация с
использованием сертификата.
Получившаяся запись о пользователе будет иметь вид:
dn: uid=ivpetr,ou=People,o=company,c=ru
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
objectClass: Certmap
uid: ivpetr
structuralObjectClass: inetOrgPerson
CertificateClientCN:: Petrov Ivan
CertificateIssuer: Office CA
CertificateSerialNumber: 0D
cn: Ivan
mail: petrov@company.com
telephoneNumber: +790234567
userPassword:: e3NoYX0vbitrQTZZTzc3NnJTQ29Wczc4TGFQdCs1eTQ9
После этого можно начинать сборку модуля:
./configure --with-apxs=/usr/local/apache2/bin/apxs --with-ldap-dir=/usr --with-openssl=/usr
make && make installl
Пример конфигурации успешно собранного модуля
SSLRequireSSL
SSLVerifyClient require
SSLVerifyDepth 5
SSLOptions +FakeBasicAuth +StrictRequire +StdEnvVars +ExportCertData
Order allow,deny
Allow from all
AllowOverride AuthConfig
XLDAPAuthoritative on
XLDAPAuthServer localhost
XLDAPAuthBindDN "cn=manager,o=company,c=ru"
XLDAPAuthBindPw "mamamia"
XLDAPAuthSuffix "ou=People,o=company,c=ru"
XLDAPAuthFilter "(&(CertificateIssuer=%{SSL_CLIENT_I_DN_CN})(CertificateSerialNumber=%{SSL_CLIENT_M_SERIAL})(CertificateClientCN=%{SSL_CLIENT_S_DN_CN}))"
XLDAPAuthLogLevel info
XLDAPAuthRemoteUserAttr uid
На основании приведенной выше конфигурации Apache будет вести себя
следующим образом:
* для аутентификации будет требоваться сертификат пользователя
(глубина проверки 5)
* для поиска по LDAP серверу будет использоваться
пользователь"cn=manager,o=company,c=ru" с паролем mamamia
* поиск по LDAP директории будет осуществляться по фильтру - на
основании атрибутов CertificateClientCN, CertificateIssuer,
CertificateSerialNumber
* переменная REMOTE_USER будет выставлена в данные, взятые из
атрибута uid (в нашем случае, если пользователь Ivan Petrov
пройдет аутентификацию, эта переменная будет выставлена в значение
ivpetr)
Модуль успешно работает с пользовательскими данными на русском и
литовском языках.
Достаточно подробное описание работы и конфигурации модуля есть на его
домашней странице. Единственное, что пока не понятно - почему до
сих пор не существует серьезных разработок в области
аутентификационных модулей на основе сертификатов, потому как в
описанном модуле остаются недоработки и ошибки.