четверг, 26 апреля 2012 г.

PicoLisp и авторизация через Kerberos

Как известно, в PicoLisp (далее pil), есть свой фронтенд - httpgate, который обеспечивает доступ к множеству приложений через единый порт (обычно 80 для http) и еще берет на себя SSL (htps).
Возникло желание сделать SSO (Single Sign On)-аутентификацию в веб-приложении pil в домене AD, но встроенные средства этого не позволяют. Остаются варианты прикрутить фронтэндом Apache/Nginx/Lighttpd, которые умеют SSO. Я остановился на Lighttpd, так как хотел использовать самый легковесный вариант.
(upd: вот подробная статья по настройке керберос-аутентификации)
Как оказалось, релиза Lighttpd с поддержкой Kerberos до сих пор нет, но есть страничка Kerberos/GSSAPI Delegation Support, где написано, как скачать свежие исходники и пропатчить.
$ 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 выдал ошибку:
# 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.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
Патчим src/Makefile.am, затем повторяем
$ ./autogen.sh
$ ./configure
$ make
# make install
Конфиг /usr/local/etc/lighttpd.conf
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"
    )
}
HTTP.keytab создаем средствами Windows 2008:
  1. создаем пользователя в AD, например wwwservice. В свойствах учетки (вкладка "Делегирование") выбираем: "Доверять этому пользователю делегирование служб (только Kerberos) (долго не мог понять, почему не работает аутентификация, пока не нагуглил инфу про делегирование)
  2. На контроллере домена выполняем следующий код с админскими привилегиями:
    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
  3. Переносим полученный файл HTTP.keytab на линукс-сервер в папку /usr/local/etc/
Запускаем lighttpd:
lighttpd -D -f /usr/local/etc/lighttpd.conf

Браузеры могут потребовать дополнительной настройки, например так
После этого pil-приложение получит дополнительный http-заголовок X-Forwarded-Keytab, в котором указан полный путь к временному файлу с сохраненными Kerberos credentials пользователя. Что с этим делать дальше, я пока не решил, посему продолжение следует...

Комментариев нет: