Единая аутентификация для веб-приложений с LemonLDAP::NG

Отправлено 26 нояб. 2011 г., 11:05 пользователем Работа КА   [ обновлено 26 нояб. 2011 г., 11:08 ]

Количество веб-приложений самого разного назначения, даже в небольшой организации может достигать десятка, LemonLDAP::NG поможет упростить доступ и управление.

Сегодня многие приложения разрабатываются по клиент-серверной схеме, когда все данные хранятся и обрабатываются на мощном сервере. Пользователь, подключившись при помощи клиентского приложения, производит все необходимые действия. В качестве клиента все чаще используется обычный веб-браузер, который доступен в любой ОС и позволяет работать с любого места, где есть Интернет. Все плюсы и минусы таких решений уже не раз описывались в журнале, поэтому заострять внимание на них не будем. При развертывании подобных сервисов остается открытым вопрос удобного управления для администратора и доступа для пользователей. Наличие нескольких веб-приложений означает, что администратору необходимо для каждого отслеживать все учетные записи и права доступа к ресурсам. И чем больше приложений и пользователей будут работать, тем сложнее становиться управление. Также пользователям необходимо помнить свои учетные данные для каждого ресурса и вводить их отдельно в окне регистрации. Это отбирает время, драгоценное время, да и удобной такую работу назвать нельзя.

Причем политики паролей компании наверняка требуют использования разных данных для входа на каждый сервис, что усложняет работу всем. Решением этой проблемы является использование технологии единого входа (SSO, Single Sign On) с единой точкой управления. Примером SSO является ActiveDirectory когда пользователь, имеющий учетную запись и соответствующие права автоматически получает доступ ко всем ресурсам, в том числе и порталам размещенным на IIS, администратор же производит все настройки с единой консоли. Для веб-приложений базирующихся на Apache реализовать подобную схему стандартными средствами не так просто. В журнале уже рассказывалось о системе контроля доступа DACS, одной из сопутствующих возможностей которого было обеспечение единого входа. Но DACS можно назвать относительно сложным в управлении, не многие хотят с ним связываться. Плюс, некоторые ERP и CRM продукты поддерживают такую возможность, но что делать, если приложение написано самостоятельно или в организации целый “зоопарк”. Вот для таких случаев идеально подходит LemonLDAP::NG (http://lemonldap-ng.org/).

Возможности LemonLDAP::NG

Проект Lemonldap::NG обеспечивает SSO для веб-приложений, пользователи получают единое окно входа для всех приложений, администраторы – одну точку управления с возможностью тонкой установки прав на доступ к приложениям. По сути это новая (переписанная) версия решения Lemonldap с аналогичной функциональностью, который был создан в 2003 для французского министерства финансов, но уже не развивается и не поддерживается. Версия Lemonldap::NG переписана Ксавье Гимаром (Xavier Guimard) в 2005 году с учетом модульности и соответствия стандартам Liberty Alliance. Кроме Ксавье в проекте участвуют еще два основных разработчика. И кстати уже через год после рождения (в 2006 году) Lemonldap::NG был отмечен премией Парижской организации l’ASS2L (Association des Societes de Services en Logiciels Libres) как лучший проект с открытым кодом, созданный для администрирования. Судя по многочисленным сообщениям Lemonldap::NG активно используется у себя на Родине, но на постсоветском пространстве практически не известен. Например, в French Gendarmeries networks LemonLDAP::NG обеспечивает работу 105 тысяч пользователей, использующих 100 приложений и более 40000 активных сессий. То есть назвать приложение незрелым уже ни как нельзя.
Основным языком разработки является Perl. Распространяется LemonLDAP::NG по лицензии GNU GPL, некоторые модули написанные на Perl, выпускаются на условиях принятой в этом языке Artistic License.
Сегодня можно найти несколько вариантов реализации SSO для веб-приложений использующих разный подход – установка агентов на клиентские системы (Enterprise SSO), использование отдельного портала для аутентификации (Delegation SSO) или обратного прокси-сервера (Reverse Proxy SSO). Проект Lemonldap::NG по сути является Delegation SSO защищая VirtualHosts веб-сервера Apache, с аутентификацией и авторизацией на отдельном портале и LDAP. Но может быть настроен в качестве обратного прокси для защищаемого приложения. Одним из его преимуществ является возможность работы в Интернет на любых ресурсах без каких-либо ограничений, требование к клиенту одно – браузер должен принимать Cookies. Причем Lemonldap::NG не просто аутентифицирует пользователя, но и делегирует доступ к ресурсам в зависимости от прав. Управление правами может быть полностью или частично централизовано или настраиваться индивидуально для каждого приложения. Авторизация обеспечивается путем сортировки URL приложений, обрабатываемых при помощи механизма регулярных выражений. Каждое приложение использует “свои” HTTP заголовки. Атрибуты пользователя также передаются в HTTP заголовках, приложению не нужно уточнять права пользователя в базе данных. Да и вообще администратор может самостоятельно управлять информацией передаваемой в Cookies и HTTP заголовках, добавляя свои параметры.
Вот только некоторые основные возможности, которые обеспечивает Lemonldap::NG:

  • SSO для веб-приложений написанных на любом языке (Java, PHP, .Net, Perl, Ruby, Python, …).
  • HTTP/HTTPS шлюз, что может быть использовано для организации VPN;
  • аутентификацию при помощи различных модулей, по умолчанию используется LDAP, поддерживаются – Kerberos, Active Directory, SSL, X.509, CAS, Liberty Alliance (FederID), OpenID, Twitter и другие.
  • управление группами LDAP;
  • авторизация базирующаяся на LDAP фильтрах;
  • авторизация внутри приложений (типы файлов, подкаталоги и т.п.);
  • политики паролей;
  • возможность изменения и сброса пароля пользователем;
  • поддержку SAML (Security Assertion Markup Language, язык разметки подтверждения безопасности). Совместимость с SAML 2.0 означает возможность работы с Google Apps.
  • встроенная поддержка – Zimbra, Sympa, Dokuwiki, MediaWiki, GRR (Gestion et Reservations de Ressources), Liferay, Drupal, Nagios, OBM и phpLDAPadmin.

Функционально Lemonldap::NG состоит из трех элементов – менеджера управления, портала аутентификации пользователей и модулей Apache для защиты приложений. Плюс три базы данных – база настроек, сервер LDAP (загрузка атрибутов и проверка прав) и база сессий (SQL, Memcached, SOAP). Пользователь, пытающийся получить доступ к защищаемому приложению, вначале перенаправляется на портал, где подтверждает логин и пароль и получает соответствующие атрибуты. Данные сохраняются в базе сессий, генерируется Cookie, и при наличии прав пользователь получает доступ. При последующем доступе, при наличии активного Cookie, повторная аутентификация не происходит, производится лишь проверка прав на доступ к приложению.

Установка Lemonldap::NG

Текущей стабильной является версия 1.1.2, кроме этого на сайте проекта доступен срез SVN. Начиная с версии 1.0 добавились поддержка i18n, POST, выбор механизма аутентификации на странице ввода пароля, Identity Provider (IdP) для SAML2, OpenID и OAuth IdP and SP. Также постепенно обещают полностью интегрировать MRTG, в 1.0rc2 сделаны только первые шаги. Подробнее о планах разработчиков можно узнать в Roadmap на сайте проекта. Для установки и работы Lemonldap::NG требуется веб-сервер Apache 1.3/2.х с поддержкой mod_perl (с mod_perl v1.99 по сообщению на сайте не работает) и LDAP сервер. В примерах на сайте указана операционная система Linux, но вероятно Lemonldap::NG будет работать в других системах, в которых возможна использование Apache и Perl. Установку будем рассматривать на примере Linux Ubuntu, хотя в других дистрибутивах процесс будет отличаться лишь особенностями работы с менеджерами пакетов.
В репозитарии universe в Ubuntu доступна стабильная версия Lemonldap::NG:

$ sudo apt-cache show lemonldap-ng | grep –i version

Что не удивительно. Поэтому будем устанавливать при помощи исходных текстов. Документацию проекта можно назвать достаточной, хотя ориентирована она больше на разработчика, показывая внутренности Lemonldap::NG, чем администратора, который будет его обслуживать. Но при некотором опыте установить и настроить Lemonldap::NG не сложно. Я покажу пошаговое руководство, чтобы легче было ориентироваться в случае изменений, возможных в конечном релизе. Список всех зависимостей указан в документации, но не всегда он актуален. Во время установки, конфигурационный скрипт помогает постепенно подобрать нужные компоненты, хотя это займет некоторое время.
Можно поступить проще, использовав возможности APT, автоматически вытягивать все необходимое для сборки

$ sudo apt-get build-dep lemonldap-ng

Но этого мало для версии 1.0rc2. Поэтому самостоятельно доустанавливаем, что нужно. Для сборки

$ sudo apt-get install libconfig-inifiles-perl libnet-twitter-perl libnet-openid-consumer-perl libcrypt-openssl-x509-perl

И для работы:

$ sudo apt-get install libapache2-mod-perl2 libapache2-reload-perl libbsd-resource-perl

В процессе выполнения всех этих команд будет установлено еще два десятка пакетов.
Скачиваем стабильный релиз или последний SVN архив и разархивируем:

$ wget -c http://download.forge.objectweb.org/lemonldap/lemonldap-ng.tar.gz
$ wget –c http://forge.objectweb.org/svnsnapshots/lemonldap-svn-latest.tar.gz
$ tar xzf lemonldap-ng.tar.gz
$ cd lemonldap-ng

Предусмотрена возможность сборки deb пакета командой “debuild”. Поступим стандартно:

$ make
$ sudo make configure

К слову документация описывает дополнительный параметр STORAGECONFFILE=/etc/lemonldap-ng/lemonldap-ng.ini, указывающий на имя конфигурационного файла Lemonldap::NG, но в текущей версии скрипт его не принял.

Тестируем.

$ make test
…
All tests successful.
Files=3, Tests=11, 1 wallclock secs ( 0.06 usr 0.06 sys + 0.55 cusr 0.23 csys = 0.90 CPU)
Result: PASS
make[1]: Выход из каталога `/home/grinder/lemonldap-ng/lemonldap-ng-manager'

Все тесты пройдены, можно устанавливать.

$ sudo make install
…
LemonLDAP::NG v1 is installed with these parameters:
 - System configuration: /usr/local/lemonldap-ng/etc
 - DNS domain (for cookies and virtual hosts): example.com
 - LDAP parameters:
 - Host: localhost
 - Port: 389
 - Suffix: dc=example,dc=com

Скрипт выдает данные по текущим настройкам (конфигурационный файл, домен, параметры LDAP) и дальнейшим шагам, которые необходимо произвести для окончательного запуска LemonLDAP::NG. Если название домена и расположение LDAP сервера отличаются, в последующем необходимо будет исправить эти данные.
Подключаем настройки LemonLDAP::NG в конфигурационном файле веб-сервера, добавив три строки.

$ sudo nano /etc/apache2/apache2.conf
…
include /usr/local/lemonldap-ng/etc/portal-apache2.conf
include /usr/local/lemonldap-ng/etc/handler-apache2.conf
include /usr/local/lemonldap-ng/etc/manager-apache2.conf

После чего перезапускаем веб-сервер, не забыв активировать mod_perl (в Ubuntu просто perl).

$ sudo a2enmod perl 
$ sudo service apache2 restart

Далее документация требует скопировать или создать символическую ссылку на конфигурационный файл lemonldap-ng.ini в каталог /etc/lemonldap-ng.

$ sudo ln-s /usr/local/lemonldap-ng/etc/lemonldap-ng.ini /etc/lemonldap-ng/

Но в устанавливаемой версии этого делать не понадобилось.
По умолчанию в конфигурации LemonLDAP::NG использован основной домен «example.com», в тестовой среде этого достаточно, но в рабочей все упоминания следует изменить. К сожалению, название домена жестко вшито в несколько файлов, поэтому разработчики предлагают для переименования использоватьsed.

$ sed -i 's/example.com/ваш_домен/g' /etc/lemonldap-ng/apache2.conf /etc/lemonldap-ng/apps-list.xml /var/lib/lemonldap-ng/conf/lmConf-1 /etc/lemonldap-ng/apply.conf /var/lib/lemonldap-ng/test/index.pl

Но так было в версиях до 1.0. После установки 1.х все файлы находятся в /usr/local/lemonldap-ng, найти все упоминания о «example.com» просто.

$ grep -iR example.com /usr/local/lemonldap-ng/*
 
/usr/local/lemonldap-ng/data/conf/lmConf-1
/usr/local/lemonldap-ng/examples/portal/AuthLA/ressources/lemonsp-metadata.xml
/usr/local/lemonldap-ng/examples/manager/mrtg/mrtg.cfg.example
/usr/local/lemonldap-ng/examples/portal/index_simple.pl
/usr/local/lemonldap-ng/handler/MyHandler.pm
/usr/local/lemonldap-ng/htdocs/manager/skins/default/manager.js

Соответственно и переписываем команду sed.

$ cd /usr/local/lemonldap-ng/
$ sed -i 's/example.com/ваш_домен/g' ./data/conf/lmConf-1 ./examples/portal/AuthLA/ressources/lemonsp-metadata.xml . /examples/portal/index_simple.pl ./handler/MyHandler.pm . /htdocs/manager/skins/default/manager.js

Кроме основного домена LemonLDAP::NG использует и два поддомена, в случае с example.com это auth.example.com (портал) и manager.example.com (консоль управления). Их также необходимо добавить в DNS сервер запись. Для перестройки /etc/hosts тестовой среды следует использовать команду “make postconf”, которая добавит описание из /usr/local/lemonldap-ng/etc/for_etc_hosts

$ cat /usr/local/lemonldap-ng/etc/for_etc_hosts
127.0.0.1	auth.example.com manager.example.com test1.example.com test2.example.com

Два домена test1.example.com и test2.example.com используются для проверки работы SSO в тестовой среде.
Кроме этого следует скопировать скрипт для cron, находящийся в /usr/local/lemonldap-ng/etc/cron.d:

$ sudo mv –v /usr/local/lemonldap-ng/etc/cron.d/lemonldap-ng /etc/cron.d/

Все настройки LemonLDAP::NG производятся в конфигурационном файле lemonldap-ng.ini, который состоит из 6 секций – all, configuration, portal, handler, manager, apply. Достаточно большой список параметров и значений можно найти в Wiki. Менеджер управления является графической надстройкой, позволяя изменить большинство настроек прописанных в lemonldap-ng.ini.

Менеджер управления LemonLDAP::NG

Менеджер управления настройками LemonLDAP::NG находится по адресу http://manager.example.com/, логин и пароль для доступа с локальной системы не требуется. В последующем администратор самостоятельно выбирает способ защиты, в секции manager конфигурационного файла или средствами Apache (в файле manager-apache2.conf).
Меню состоит из двух пунктов собственно настройки – Configuration management и просмотр активных сессий – Sessions explorer. В документации на сайте проекта можно найти примеры как подогнать внешний вид менеджера управления под свои требования.

Настройки разделены по нескольким основным категориям – General Parameters, Variables Virtual Hosts, SAML 2 Service, SAML Identity providers, SAML service providers. Каждый из них содержит еще несколько подпунктов. По некоторым параметрам доступна краткая подсказка.

По умолчанию установлен режим отображения меню Accordion, в нем подпункты сливаются с основным меню, мне удобнее показался режим Tree. При необходимости можно установить другой вид интерфейса. В подпунктах, как правило, устанавливается один-два параметра. Если честно, я бы предпочел, чтобы они все были на одной странице, чем искать их по всех вкладках.

В General Parameters и Variables доступны пункты описывающие основные настройки аутентификации. В General parameter – Portal –URL – указываем URL аутентификации портала (по умолчанию http://auth.example.com/). Настройка модулей аутентификации и хранения атрибутов производится в General parameter. В Authentications module выбираем из списка модуль аутентификации (по умолчанию LDAP), в User Module – модуль для получения данных об атрибутах и в Password Module - модуль изменения пароля в LDAP или DB. Параметры подключения к LDAP настраиваются здесь же в подсекции “LDAP parameters”.

Несколько подпунктов в General parameters – Cookies обеспечивают полный контроль над Cookies. Если необходима поддержка нескольких доменов, активируем ее в Multiple Domain. Чтобы Cookies передавался по защищенным HTTPS сеансам необходимо разрешить в Secured Cookies (SSL), оптимальным будет установка пункта – Double cookie (HTTP and HTTPS).
Как говорилось во введении, LemonLDAP защищает узлы прописанные в VirtualHost. Для этого следует настроить соответствующим образом Apache прописав в его конфигурационный файл данные о новом VirtualHost и затем добавить запись в новых сайтах в настройках LemonLDAP.
В поставке доступно два тестовых узла, доступные соответственно по адресу http://test1.example.com/ и http://test2.example.com/ которые позволяют посмотреть в действии работу механизма SSO. Чтобы добавить новый домен следует выбрать Virtual hosts – New virtual host, после чего в окне будет предложено ввести имя нового домена. Вот и все, теперь LemonLDAP знает о защищаемом узле. Для каждого домена доступно два подпункта – Rules в котором описываются правила и HTTP-Headers – заголовки. После создания новой записи в Rules два правила – default со значением accept и “^/logout” со значением “logout sso http://auth.example.com”. В HTTP-Headers описан параметр Auth-User со значением $uid. При необходимости можно добавлять свои параметры и заголовки, в документации можно найти несколько примеров.
Второй вариант – использование LemonLDAP как обратного прокси, здесь в настройках виртуального узла указывают при помощи ProxyPass и ProxyPassReverse, адрес или имя сервера на котором работает LemonLDAP:
<virtualhost>
  ServerName application.com
  PerlRequire MyFile
  PerlHeaderParserHandler My::Package
  ProxyPass / http://server.com/
  ProxyPassReverse / http://server.com/
</virtualhost>

***

Разобраться во всех возможностях заложенных в LemonLDAP::NG cразу в любом случае не получится. Разработчики предлагаеют скорее конструктор, который затем самостоятельно необходимо подогнать под себя, благо в этом смысле документация помогает. В любом случае некоторое время придется потратить на чтение документации и поэкспериментировать. Но конечный результат того стоит.

Сергей Яремчук grinder@ua.fm



Comments