В данной статье я разберу каким образом можно реализовать тихую доменную авторизацию (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_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
В моем случаи имя машины было 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