Active Directory Autentikointi, LDAP, ja Glassfish

Toteutin aikanaan Active Directory LDAP pohjaisen autentikoinnin Glassfishillä pyörivään REST palveluun ja web sovellukseen, jossa on mahdollista käyttää Windows domain tunnuksia sisäänkirjautumiseen ja palveluiden käyttöön. Alunperin tehdessä homma toimi aika suorasukaisesti, AD ryhmän voi suoraan liittää Glassfish rooliin, mutta logiin jäi harmillista toistuvaa moskaa joka ei vaikuttanut toimintaan mutta silti ihmetytti. Kyseessä oli tällainen virheilmoitus:

Caught exception. javax.naming.PartialResultException: Unprocessed Continuation Reference(s); remaining name ’DC=mycompany,DC=fi’

Tästä samasta oireesta tuntui kärsivän puoli Internettiä, vailla ajatuksia ja vastauksia miten ratkoa tämä. Tuntui olevan jonkun asteinen verkko-infra oire.  Ohjeistus oli monesti käntää ympäristöasetus java.naming.referral asentoon ignore – tai follow. Kumpikaan ei auttanut oireeseen tässä tapauksessa.

Viime viikolla löysin viimein korjauksen joka toimi, eli ongelman sai poistumaan yksinkertaisesti vaihtamalla porttia jota käytetään AD:n kanssa keskusteluun, vanhsta portista 389, jota useimmat ohjeet suosivat, uuteen porttiin 3268 (Global Catalog) – josta voi tehdä hakuja seuraamatta automaattisesti kaikki linkkejä. Tässä siis toimiva esimerkki Glassfish 4 AD autentikoinnista:

<auth-realm name="TieturiActiveDirectory" classname="com.sun.enterprise.security.auth.realm.ldap.LDAPRealm">
    <property name="directory" value="ldap://ournameservername:3268"></property>
    <property name="base-dn" value="DC=mycompany,DC=fi"></property>
    <property name="jaas-context" value="ldapRealm"></property>
    <property name="assign-groups" value="mygroup"></property>
    <property name="search-filter" value="(&amp;(objectCategory=user)(sAMAccountName=%s))"></property>
    <property name="search-bind-dn" value="mylogin"></property>
    <property name="search-bind-password" value="mypassword"></property>
    <property name="group-search-filter" value="(&amp;(objectCategory=group)(member=%d))"></property>
</auth-realm>

Tärkeä avain tuossa yllä on myös assign-groups arvo, se määrittää mihin Glassfish ryhmään autentikoidut käyttäjät tuitataan. Ryhmän voi taas mäpätä haluamaansa rooliin. Parametreja säätämällä lisää voi tarkentaa lisää hakuehtoja joilla suodatetaan hyväksyttyjä tunnuksia tiukemmin.

Kannattaa käyttää tuossa filtterissä objectCategory-parametria objectGroup:in sijaan, koska objectCategory on indeksoitu ja nopeampi. Oikeasti kannattaa myös suodattaa disabled-tilassa olevat tunnukset pois, esim. näin:

<property name="search-filter" value="(&amp;(objectCategory=user)(sAMAccountName=%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"></property>

Tarina perustuu tositapahtumiin. Luonnollisesti kaikki nimet ja ip-osoitteet ovat muutettuja ja yksinkertaistettuja jotta asianomaisia suojellaan riittävästi.

Mainokset

Vastaa

Täytä tietosi alle tai klikkaa kuvaketta kirjautuaksesi sisään:

WordPress.com-logo

Olet kommentoimassa WordPress.com -tilin nimissä. Log Out / Muuta )

Twitter-kuva

Olet kommentoimassa Twitter -tilin nimissä. Log Out / Muuta )

Facebook-kuva

Olet kommentoimassa Facebook -tilin nimissä. Log Out / Muuta )

Google+ photo

Olet kommentoimassa Google+ -tilin nimissä. Log Out / Muuta )

Muodostetaan yhteyttä palveluun %s