2006/11/17

modXLdapAuth

Для того, чтобы аутентифицировать пользователя по сертификату в Apache достаточно добавить соответствующую директиву (SSLVerifyClient). Но в таком случае очень неудобно строить политику доступа - нет ни базы сертификатов, с которой бы можно было оперировать, ни возможностей по разграничению доступа (авторизации). На помощь приходит модуль modXLdapAuth (homepage), который использует LDAP как хранилище пользовательских данных, взятых из сертификатов и предоставляющий дополнительные средства для реализации политики доступа к закрытым ресурсам. Единственное ограничение с которым я столкнулся - модуль работает только с Apache 2.0.x (ветки 1.3 и 2.2 не поддерживаются).

Прежде чем начинать сборку модуля необходимо подготовить LDAP сервер - необходимо включить в конфигурацию сервиса дополнительную схему (schema) modXLDAPAuth [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)
Модуль успешно работает с пользовательскими данными на русском и литовском языках.
Достаточно подробное описание работы и конфигурации модуля есть на его домашней странице. Единственное, что пока не понятно - почему до сих пор не существует серьезных разработок в области аутентификационных модулей на основе сертификатов, потому как в описанном модуле остаются недоработки и ошибки.

No comments: