- PVSM.RU - https://www.pvsm.ru -

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

В данной статье я разберу каким образом можно реализовать тихую доменную авторизацию (Kerberos) на сервере приложений GlassFish.
Тест проводился на ПК с Windows 7 Pro SP1 (64bit), JDK 1.7.0_25(64bit) и GlassFish 4 (ver 89).
Пользоваться мы будем библиотекой SPNEGO [1]. Данная статья собственно является переводом и адаптацией, того что вы можете найти на странице библиотеки на английском языке.

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

1) Убедиться что ваш сервер находится в домене.
2) Убедиться что сервер приложений (GlassFish) запускается от доменного пользователя
3) Убедиться что на руках есть логин и пароль от специально заведенного доменного пользователя (я использовал того же пользователя что и в пункте 2)
4) Убедиться что корректно отработает HelloKDC.java
HelloKDC.java [2] — небольшое приложение которое позволит нам понять всё ли готово чтобы начинать полет и возможен ли полет.
В данном коде нужно дополнить несколько строк, а именно:

// 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 [3] и login.conf [4].
В моем случаи 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 [5].

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

Поехали!

1) Добавляем библиотеку spnego.jar непосредственно в директорию с библиотеками glassfish, а именно GLASSFISH_HOMElib
2) Модифицируем файл default-web.xml соответствующего glassfish домена, он располагается в папке GLASSFISH_HOMEdomains<имя домена>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_HOMEdomains<имя домена>config)
4) Модифицировать файл login.conf в GLASSFISH_HOMEdomains<имя домена>config добавив в конец файла данные из предыдущего login.conf (что сделал для HelloKDC)
5) Зарегистрировать SPN [6]
В моем случаи имя машины было 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

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

Автор: wisd

Источник [7]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/java/51457

Ссылки в тексте:

[1] SPNEGO: http://spnego.sourceforge.net/

[2] HelloKDC.java: http://spnego.sourceforge.net/HelloKDC.java

[3] krb5.conf: http://spnego.sourceforge.net/krb5.conf

[4] login.conf: http://spnego.sourceforge.net/login.conf

[5] KDC: http://en.wikipedia.org/wiki/Key_distribution_center

[6] SPN: http://msdn.microsoft.com/en-us/library/windows/desktop/ms677949%28v=vs.85%29.aspx

[7] Источник: http://habrahabr.ru/post/207144/