Возникло желание сделать SSO (Single Sign On)-аутентификацию в веб-приложении pil в домене AD, но встроенные средства этого не позволяют. Остаются варианты прикрутить фронтэндом Apache/Nginx/Lighttpd, которые умеют SSO. Я остановился на Lighttpd, так как хотел использовать самый легковесный вариант.
(upd: вот подробная статья по настройке керберос-аутентификации)
Как оказалось, релиза Lighttpd с поддержкой Kerberos до сих пор нет, но есть страничка Kerberos/GSSAPI Delegation Support, где написано, как скачать свежие исходники и пропатчить.
Однако при запуске lighttpd выдал ошибку:$ svn co svn://svn.lighttpd.net/lighttpd/trunk U trunk Checked out revision 2769. $ cd trunk $ wget http://redmine.lighttpd.net/attachments/download/963/lighty-gssapi-r2505.patch $ patch -p1 < lighty-gssapi-r2505.patch patching file src/http_auth.c Hunk #2 succeeded at 1248 (offset 8 lines). patching file src/http_auth.h patching file src/keyvalue.h patching file src/mod_auth.c $ ./autogen.sh $ ./configure $ make # make install
После долгих ковыряний причина была найдена - не хватало библиотек в параметрах линковки:# lighttpd -D -f /usr/local/etc/lighttpd.conf 2012-04-26 09:41:45 (plugin.c:264) dlopen() failed for: /usr/local/lib/mod_auth.so /usr/local/lib/mod_auth.so: undefined symbol: GSS_KRB5_NT_PRINCIPAL_NAME 2012-04-26 09:41:45 (server.c:1157) loading plugins finally failed
Патчим src/Makefile.am, затем повторяем--- src/Makefile.am.prev 2012-04-26 09:34:41.000000000 +0600 +++ src/Makefile.am 2012-04-26 13:05:48.058734880 +0600 @@ -274,7 +274,7 @@ lib_LTLIBRARIES += mod_auth.la mod_auth_la_SOURCES = mod_auth.c http_auth_digest.c http_auth.c mod_auth_la_LDFLAGS = -module -export-dynamic -avoid-version -no-undefined -mod_auth_la_LIBADD = $(CRYPT_LIB) $(LDAP_LIB) $(LBER_LIB) $(common_libadd) +mod_auth_la_LIBADD = $(CRYPT_LIB) $(LDAP_LIB) $(LBER_LIB) -lgssapi_krb5 -lkrb5 $(common_libadd) lib_LTLIBRARIES += mod_rewrite.la mod_rewrite_la_SOURCES = mod_rewrite.c
Конфиг /usr/local/etc/lighttpd.conf$ ./autogen.sh $ ./configure $ make # make install
HTTP.keytab создаем средствами Windows 2008:server.document-root = "/var/www/html/". server.modules = ( "mod_auth", "mod_proxy_core", "mod_proxy_backend_http") server.port = 80 auth.debug = 2 auth.backend = "gssapi" auth.backend.gssapi.principal = "HTTP" auth.backend.gssapi.keytab = "/usr/local/etc/HTTP.keytab" mimetype.assign = ( ".html" => "text/html",. ".txt" => "text/plain", ".jpg" => "image/jpeg", ".js" => "application/x-javascript", ".gif" => "image/gif", ".css" => "text/css", ".png" => "image/png" ) $HTTP["host"] == "wwwhost.itks.ru" { auth.require = ( "" => ( "method" => "gssapi", "realm" => "ITKS.RU", "require" => "valid-user" ) ) proxy-core.protocol = "http" proxy-core.backends = ( "127.0.0.1:5000" ) }
- создаем пользователя в AD, например wwwservice. В свойствах учетки (вкладка "Делегирование") выбираем: "Доверять этому пользователю делегирование служб (только Kerberos) (долго не мог понять, почему не работает аутентификация, пока не нагуглил инфу про делегирование)
- На контроллере домена выполняем следующий код с админскими привилегиями:
ktpass -princ HTTP/wwwhost.example.com@EXAMPLE.COM -mapuser wwwservice -crypto rc4-hmac-nt -pass "mypassword" -ptype KRB5_NT_PRINCIPAL -out D:\HTTP.keytab
Примечание: нужно использовать каноническое имя хоста, т.е. wwwhost - "А" запись в DNS - Переносим полученный файл HTTP.keytab на линукс-сервер в папку /usr/local/etc/
lighttpd -D -f /usr/local/etc/lighttpd.conf
Браузеры могут потребовать дополнительной настройки, например так
После этого pil-приложение получит дополнительный http-заголовок X-Forwarded-Keytab, в котором указан полный путь к временному файлу с сохраненными Kerberos credentials пользователя. Что с этим делать дальше, я пока не решил, посему продолжение следует...
Комментариев нет:
Отправить комментарий