Існує 3 протоколи автентифікації, які можна використовувати для автентифікації між Java та Active Directory на Linux або будь-якій іншій платформі (і це не тільки для служб HTTP):
Kerberos - Kerberos забезпечує єдиний вхід (SSO) та делегування, але веб-сервери також потребують підтримки SPNEGO, щоб прийняти SSO через IE.
NTLM - NTLM підтримує SSO через IE (та інші браузери, якщо вони правильно налаштовані).
LDAP - прив’язка LDAP може бути використана для простої перевірки імені та пароля облікового запису.
Існує також щось під назвою "ADFS", яке забезпечує єдину систему входу для веб-сайтів, що використовують SAML, що викликає Windows SSP, тому на практиці це в основному обхідний спосіб використання одного з інших вищезазначених протоколів.
Кожен протокол має свої переваги, але, як правило, для максимальної сумісності ви, як правило, повинні намагатися робити "як Windows". То що робить Windows?
По-перше, автентифікація між двома машинами Windows надає перевагу Kerberos, оскільки серверам не потрібно взаємодіяти з DC, а клієнти можуть кешувати квитки Kerberos, що зменшує навантаження на DC (і тому, що Kerberos підтримує делегування).
Але якщо сторони, що автентифікують, не мають облікових записів домену або якщо клієнт не може зв’язатися з DC, потрібен NTLM. Отже, Kerberos і NTLM не є взаємовиключними, і NTLM не застаріває Kerberos. Насправді в чомусь NTLM кращий за Kerberos. Зауважте, що згадуючи Kerberos та NTLM на одному диханні, я повинен згадати SPENGO та інтегровану автентифікацію Windows (IWA). IWA - це простий термін, який в основному означає Kerberos або NTLM або SPNEGO для ведення переговорів про Kerberos або NTLM.
Використання прив’язки LDAP як способу перевірки облікових даних є неефективним і вимагає SSL. Але донедавна реалізація Kerberos і NTLM була важкою, тому використання LDAP як служби аутентифікації за допомогою зсуву зберігалося. Але в цей момент цього, як правило, слід уникати. LDAP - це каталог інформації, а не служба автентифікації. Використовуйте його за призначенням.
Отже, як застосувати Kerberos або NTLM на Java і зокрема в контексті веб-додатків?
Існує ряд великих компаній, таких як Quest Software та Centrify, які мають рішення, в яких конкретно згадується Java. Я не можу насправді коментувати їх, оскільки вони є "рішеннями для управління ідентичністю" на рівні всієї компанії, тому, дивлячись на маркетинговий кругообіг на їх веб-сайті, важко точно сказати, які протоколи використовуються і як. Вам потрібно буде зв’язатися з ними для отримання детальної інформації.
Реалізація Kerberos в Java не є надзвичайно складною, оскільки стандартні бібліотеки Java підтримують Kerberos через класи org.ietf.gssapi. Однак донедавна існувала велика перешкода - IE не надсилає необроблені токени Kerberos, а відправляє токени SPNEGO. Але з Java 6 було впроваджено SPNEGO. Теоретично ви повинні вміти писати код GSSAPI, який може автентифікувати клієнтів IE. Але я не пробував. Впровадження Sun Kerberos протягом багатьох років було комедією помилок, тому, базуючись на досвіді Sun у цій галузі, я не давав би жодних обіцянок щодо їх реалізації SPENGO, поки у вас не буде цієї птиці.
Для NTLM існує безкоштовний проект OSS під назвою JCIFS, який має фільтр сервлетів автентифікації HTTP NTLM. Однак він використовує метод "людина посередині" для перевірки облікових даних із сервером SMB, який не працює з NTLMv2 (що повільно стає необхідною політикою безпеки домену). З цієї причини та інших, частину фільтру HTTP JCIFS планується видалити. Зверніть увагу, що існує кілька виділень, які використовують JCIFS для реалізації тієї самої техніки. Тож якщо ви бачите інші проекти, які заявляють, що підтримують NTLM SSO, перевірте дрібний шрифт.
Єдиним правильним способом перевірки облікових даних NTLM за допомогою Active Directory є використання виклику NetrLogonSamLogon DCERPC через NETLOGON із захищеним каналом. Чи існує таке в Java? Так. Ось:
http://www.ioplex.com/jespa.html
Jespa - це 100% реалізація Java NTLM, яка підтримує NTLMv2, NTLMv1, повноцінні параметри цілісності та конфіденційності та вищезгадану перевірку облікових даних NETLOGON. І він включає в себе HTTP SSO-фільтр, JAAS LoginModule, HTTP-клієнт, SASL-клієнт і сервер (із прив'язкою JNDI), загальний "постачальник безпеки" для створення власних служб NTLM тощо.
Майк