Тихая доменная авторизация в 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 мы задали в настройках фильтра для перехвата запроса).
    Hello SPNEGO Example

    Hello <%= request.getRemoteUser() %> !


    Которую мы помещаем например в docroot нашего glassfish домена.
    При обращении к странице мы должны получить текст следующего содержания:
    Hello <имя вашей учетной записи>!

    PS

    Не получилось совладать с отображением исходного кода.
    С радостью отвечу на вопросы в комментариях к статье.
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 1

      0
      Делал как-то подобное, пробовал SPNEGO. Уже точно не помню, почему не стал использовать, видимо из-за того, что сервер приложений не в домене. В конце концов остановился на JCIFS, настраивается проще, правда не сильно навороченная технология. На случай, если будут с ней проблемы, сохранил в закладки также WAFFLE

      Only users with full accounts can post comments. Log in, please.