вторник, 24 декабря 2013 г.

Тихая доменная авторизация в GlassFish

В данной статье я разберу каким образом можно реализовать тихую доменную авторизацию (Kerberos) на сервере приложений GlassFish.

Тест проводился на ПК с Windows 7 Pro SP1 (64bit), JDK 1.7.0_25(64bit) и GlassFish 4 (ver 89).

Пользоваться мы будем библиотекой SPNEGO. Данная статья собственно является переводом и адаптацией, того что вы можете найти на странице библиотеки на английском языке.


Предполетная подготовка



1) Убедиться что ваш сервер находится в домене.

2) Убедиться что сервер приложений (GlassFish) запускается от доменного пользователя

3) Убедиться что на руках есть логин и пароль от специально заведенного доменного пользователя (я использовал того же пользователя что и в пункте 2)

4) Убедиться что корректно отработает HelloKDC.java

HelloKDC.java — небольшое приложение которое позволит нам понять всё ли готово чтобы начинать полет и возможен ли полет.

В данном коде нужно дополнить несколько строк, а именно:

// Domain (pre-authentication) account

final String username = "<Имя пользователя из третьего пункта>";


// Password for the pre-auth acct.

final String password = "<Пароль от пользователя из третьего пункта>";


// Name of our krb5 config file

final String krbfile = «krb5.conf»;


// Name of our login config file

final String loginfile = «login.conf»;


// Name of our login module

final String module = «spnego-client»;



Далее нужно добавить файлы krb5.conf и login.conf.

В моем случаи krb5.conf выглядит следующим образом:



[libdefaults]

default_tkt_enctypes = aes256-cts-hmac-sha1-96 aes128-cts rc4-hmac des3-cbc-sha1 des-cbc-md5 des-cbc-crc

default_tgs_enctypes = aes256-cts-hmac-sha1-96 aes128-cts rc4-hmac des3-cbc-sha1 des-cbc-md5 des-cbc-crc

permitted_enctypes = aes256-cts-hmac-sha1-96 aes128-cts rc4-hmac des3-cbc-sha1 des-cbc-md5 des-cbc-crc


[realms]

<коренной домен> = {

kdc = <доменное имя сервера KDC>

default_domain = <коренной домен>

}


[domain_realm]

.<коренной домен> = <коренной домен>



Где в алгоритмах я добавил aes256-cts-hmac-sha1-96 для корректной работы с Windows 7 клиентами.

Моё полное доменное имя отличается от коренного однако я решил добавить корень и коренной KDC.


После запуска HelloKDC мы должны получить небольшой отчет в конце которого должно быть написано "Connection test successful.".


Поехали!



1) Добавляем библиотеку spnego.jar непосредственно в директорию с библиотеками glassfish, а именно GLASSFISH_HOME\lib

2) Модифицируем файл default-web.xml соответствующего glassfish домена, он располагается в папке GLASSFISH_HOME\domains\\config

Модификация заключается в том чтобы добавить сервлет-фильтр:

<filter-name>SpnegoHttpFilter</filter-name>

<filter-class>net.sourceforge.spnego.SpnegoHttpFilter</filter-class>


<init-param>

<param-name>spnego.allow.basic</param-name>

<param-value>true</param-value>

</init-param>


<init-param>

<param-name>spnego.allow.localhost</param-name>

<param-value>true</param-value>

</init-param>


<init-param>

<param-name>spnego.allow.unsecure.basic</param-name>

<param-value>true</param-value>

</init-param>


<init-param>

<param-name>spnego.login.client.module</param-name>

<param-value>spnego-client</param-value>

</init-param>


<init-param>

<param-name>spnego.krb5.conf</param-name>

<param-value>krb5.conf</param-value>

</init-param>


<init-param>

<param-name>spnego.login.conf</param-name>

<param-value>login.conf</param-value>

</init-param>


<init-param>

<param-name>spnego.preauth.username</param-name>

<param-value>Имя пользователя из HelloKDC</param-value>

</init-param>


<init-param>

<param-name>spnego.preauth.password</param-name>

<param-value>Пароль пользователя из HelloKDC</param-value>

</init-param>


<init-param>

<param-name>spnego.login.server.module</param-name>

<param-value>spnego-server</param-value>

</init-param>


<init-param>

<param-name>spnego.prompt.ntlm</param-name>

<param-value>true</param-value>

</init-param>


<init-param>

<param-name>spnego.logger.level</param-name>

<param-value>1</param-value>

</init-param>


<filter-mapping>

<filter-name>SpnegoHttpFilter</filter-name>

<url-pattern>*.jsp</url-pattern>

</filter-mapping>



3) Скопировать файл krb5.conf (тоже в GLASSFISH_HOME\domains\<имя домена>\config)

4) Модифицировать файл login.conf в GLASSFISH_HOME\domains\<имя домена>\config добавив в конец файла данные из предыдущего login.conf (что сделал для HelloKDC)

5) Зарегистрировать SPN

В моем случаи имя машины было smirnoff, полное имя машины smirnoff.<полное доменное имя> и поэтому я зарегистрировал(точнее зарегистрировали админы ЛВС) 2 SPNа на имя учетной записи (которую мы вводили в исходник HelloKDN и в настройках сервлет-фильтра), а именно

setspn -A HTTP/smirnoff <имя учетной записи>

setspn -A HTTP/smirnoff.<полное доменное имя> <имя учетной записи>

Т.е. добавляем запись с полным именем и кратким.


Проверка работы



Проверить работу можно с помощью простой jsp страницы (jsp потому что именно маску *.jsp мы задали в настройках фильтра для перехвата запроса).

<html> <head> <title>Hello SPNEGO Example</title> </head> <body> Hello <%= request.getRemoteUser() %> ! </body> </html>

Которую мы помещаем например в docroot нашего glassfish домена.

При обращении к странице мы должны получить текст следующего содержания:

Hello !
PS



Не получилось совладать с отображением исходного кода.

С радостью отвечу на вопросы в комментариях к статье.

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers.


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

Отправить комментарий