V tomto článku ukončíme rozprávanie o realmoch ako o viac menej špecifickej črte servera Tomcat, súvisiacej s autorizovaným prístupom k aplikáciám. Prebrali sme tri základné typy (MemoryRealm, JDBCRealm a DataSourceRealm), čaká nás ešte JNDIRealm a JAASRealm. Obidva sú už vyspelejšie typy realmov, lepšie využívajúce možnosti dnešných systémov.

JNDIRealm

JNDIRealm je najzložitejším typom realmu, ktorý informácie o užívateľoch a ich roliach získava z LDAP adresárového servera. Na pripojenie k serveru sa využíva LDAP URL, ktoré obvykle obsahuje doménu servera, na ktorý sa potrebujeme pripojiť. Voliteľne ešte obsahuje číslo portu a takzvaný rozlišovací názov menného priestoru. Pri zisťovaní užívateľských informácií a priradených rolí sa musí samotný realm autentifikovať. K tomu účelu slúžia dva atribúty connectionName a connectionPassword. Ak tieto atribúty neposkytnete, realm sa pokúsi o anonymné prihlásenie.

Každý užívateľ, ktorý sa potrebuje autentifikovať, musí byť reprezentovaný v adresári samostatným záznamom. Tento záznam musí mať atribúty obsahujúce prihlasovacie meno užívateľa a heslo. Čo sa týka jednotlivých rolí, tak tie môžu byť súčasťou užívateľského záznamu alebo môžu byť evidované samostatne, ako záznamy v adresári s atribútom predstavujúcim názov role a s atribútom obsahujúcim priradené užívateľské mená.

Aby ste mohli využívať JNDIRealm v spojitosti s LDAP, je nutné nakopírovať do adresára server/lib alebo do common/lib JNDI driver, napríklad ldap.jar. A zároveň vložiť do server.xml element <Realm> s nasledujúcimi atribútmi. Niektoré sú povinné (zvýraznené) a ostatné sú nepovinné.

  • className
    – plne kvalifikované meno triedy tohto realmu, konkrétne org.apache.catalina.realm.JNDIRealm.
  • connectionName
    – prihlasovacie meno potrebné na pripojenie k LDAP.
  • connectionPassword
    – prihlasovacie heslo potrebné na pripojenie k LDAP.
  • connectionURL
    – URL poskytnuté JNDI driveru na pripojenie k LDAP.
  • contextFactory
    – plne kvalifikované meno triedy JNDI sprostredkovateľa. Štandardne sa použije com.sun.jndi.ldap.LdapCtxFactory.
  • roleBase
    – názov úrovne, na ktorej sa má začať prehľadávanie jednotlivých rolí. Ak ho nezadáte, začne sa od najvyššej úrovne.
  • roleName
    – názov atribútu obsahujúceho názvy rolí.
  • userBase
    – názov úrovne, od ktorej začne prehľadávanie užívateľských záznamov.
  • userPassword
    – názov atribútu obsahujúci užívateľovo heslo.

Element <Realm> obsahuje ešte ďalšie menej podstatné atribúty, ktorých použitie závisí od konkrétneho LDAP servera. Na otestovanie svojich možností môžete využiť napríklad OpenLDAP server.

Princíp činnosti JNDIRealmu

Na záver ešte uvediem príklad nastavenia JNDIRealmu:

<Realm
   className=“org.apache.catalina.realm.JNDIRealm“
   connectionName=“cn=Manager,dc=mycompany,dc=com“
   connectionPassword=“xxxx“
   connectionURL=“ldap://localhost:389″
   roleBase=“ou=groups,dc=mycompany,dc=com“
   roleName=“cn“
   userBase=“ou=people,dc=mycompany,dc=com“ />

JAASRealm

JAASRealm je najnovšou implementáciou realmov na serveri Tomcat od verzie 5.0. Je založený na využívaní technológie JAAS (Java Authentication & Authorization Service). Tento realm dáva vývojárovi najväčšiu voľnosť v tom, že môže doň implementovať akúkoľvek bezpečnostnú politiku podľa svojich potrieb a požiadaviek kladených na aplikáciu.

Pri tejto implementácii sa často využíva JAAS login modul javax.security.auth.spi.LoginModule a hlavná trieda javax.security.Principal, vďaka ktorým môžete vyvinúť vlastný bezpečnostný mechanizmus alebo využiť existujúce mechanizmy tretích strán.

Určitou nevýhodou tohto realmu hlavne pri porovnaní s ostatnými je to, že vyžaduje oveľa viac programátorskej práce. Na druhej strane však vami vyvinuté triedy môžete využiť aj v iných vašich aplikáciách. Alebo môžete využiť už existujúce triedy vašich kolegov. Pri použití tohto realmu musíte sami vyvinúť a použiť triedy zodpovedné za udržiavanie informácií o užívateľoch a ich roliach a tiež triedu odvodenú od triedy LoginModul.

I napriek tomu, že to nie je nutné, respektíve JAAS to neprikazuje, mali by ste vytvoriť triedy, ktoré dokážu rozlišovať medzi užívateľom a rolou, založenou na javax.security.Principal. Tieto triedy treba po skompilovaní umiestniť do classpath aby ich Tomcat dokázal nájsť. Potom je nutné vytvoriť konfiguračný súbor jaas.config a povedať JVM, kde sa tento súbor nachádza, napríklad definovaním systémovej premennej:

JAVA_OPTS =
-D java.security.auth.login.config ==
$CATALINA_HOME/conf/jaas.config
// všetko do jedného riadku

Ako napísať tento konfiguračný súbor nájdete v odkazoch uvedených na konci článku. Posledným krokom je už len editácia server.xml a web.xml, podľa štandardných pravidiel. Element <Realm> má tieto atribúty:

  • className
    – klasicky plne kvalifikované meno triedy realmu, v tomto prípade org.apache.catalina.realm.JAASRealm.
  • appName
    – názov realmu, ako ste ho zadali v login konfiguračnom súbore.
  • userClassNames
    – názvy tried oddelené čiarkou zodpovedné za správu užívateľov.
  • roleClassNames
    – názvy tried oddelené čiarkou zodpovedné za správu užívateľských rolí.

Na záver ešte krátka ukážka nakonfigurovaného realmu:

<Realm className=“org.apache.catalina.realm.JAASRealm“
    appName=“MyRealm“
    userClassNames=“com.company.realm.MyUser“
    roleClassNames=“com.company.realm.MyRole“
    debug=“99″/>

Touto časťou by sme otázku zabezpečenia aplikácie ukončili, na budúce sa vrhneme na niečo iné. Pri tvorbe tohto a predchádzajúceho článku som čerpal informácie hlavne z nasledujúcich zdrojov:

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět