Angelo Pellegrinon - Divulgazione Open Source e Diario personale

Integrated Windows Authentication (SPNEGO) per applicazioni web con Jboss 7 - Parte 3

Jboss application server 7 Jboss application server 7

Dopo aver creato e salvato sul nostro server il file keyab creato passiamo alla configurazione del nostro JBoss così da poterlo abilitare all'utilizzo di SPNEGO per fare funzionare il Single Sign On.

Come per gli altri sistemi di autenticazione in JBoss dovremmo utilizzare i security domains per facilitare il processo di autenticazione e autorizzazione. Nelle prime versioni di di JBoss queste configurazioni si svolgevano nel file login-config.xml, dalla versione 7 invece le configurazioni sono state consolidate in un file singolo; per fare quello che ci serve quindi dovremmo decidere se editare il file standalone.xml o il file domain.xml in base alla modalità con cui JBoss viene eseguito. Dovremmo utilizzare due security domains, uno rappresenterà l'identità del server Jboss per autenticarsi con Kerberos e il secondo sarà utilizzato per mettere in sicurezza le nostre applicazioni web.

Security domain per l'autenticazione integrata di Jboss

Per autenticare il server JBoss attraverso il KDC si usa il modulo Krb5LoginModule. Il service principal e la keytab generata precedentemente sono utilizzati come parametri per configurare l'autenticazione. JBoss 7 permette l'utilizzo di codici invece dei nomi per esteso delle classi nei moduli di login, usiamo quindi il codice Kerberos configurando il modulo in questo modo (sequendo le configurazioni precedenti e salvando il file dentro C:\jboss):

<security-domain name="host" cache-type="default">
  <authentication>
    <login-module code="Kerberos" flag="required">
      <module-option name="keyTab" value="C:\jboss\nomefile.keytab"/>
      <module-option name="storeKey" value="true"/>
      <module-option name="useKeyTab" value="true"/>
      <module-option name="debug" value="false"/>
      <module-option name="doNotPrompt" value="true"/>
      <module-option name="principal" value="HTTP/Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo."/>
    </login-module>
  </authentication>
</security-domain>

Il parametro debug può essere utilizzato per verificare la configurazione e testare il processo di autenticazione quindi è consigliato impostare il suo valore a true fino a che tutto il processo di autenticazione sarà configurato correttamente. In aggiunta, il login module richiede la presenza di due proprietà del sistema Java:

  • java.security.krb5.kdc: host name del server KDC;
  • java.security.krb5.realm: il nome del dominio.

Queste proprietà possono essere definite durante l'inizializzazione di JBoss oppure dentro al file standalone.xml/domain.xml:

<system-properties>
  <property name="java.security.krb5.kdc" value="jbossas.windomain.local"/>
  <property name="java.security.krb5.realm" value="WINDOMAIN.LOCAL"/>
</system-properties>

Security domain per l'applicazione web

Per autenticare l'applicazione web avremmo bisogno di più login modules. Il primo sarà utilizzato per autenticare l'utente mentre il secondo servirà per associare un ruolo all'utente autenticato. Ecco come si presenterà la nostra configurazione:

<security-domain name="SPNEGO" cache-type="default">
<authentication>
<!-- Login Module 1 - Autenticazione utente -->
<!-- Login Module 2 - Ricerca ruoli utente -->

</authentication>
</
security-domain>

Il modulo SPNEGO si occuperà quindi di autenticare gli utenti dell'applicazione con Active Directory. Nella prima parte invierà lui l'username del principal autenticato e viene configurato così:

<login-module code="SPNEGO" flag="requisite">
<module-option name="password-stacking" value="useFirstPass"/>
<module-option name="serverSecurityDomain" value="host"/>
<module-option name="removeRealmFromPrincipal" value="true"/>
</login-module>

Il modulo password-stacking viene spesso utilizzato quando sono presenti più moduli di login e l'utente è già stato autenticato così da utilizzare il suo principal e non proseguire con un'autenticazione ulteriore. L'opzione serverSecurityDomain è configurata con il nome del security domain configurato precedentemente e che si occuperà dell'autenticazione Kerberos. In modo predefinito, il nome del principal ritornato da questo modulo login è nel formato utente@DOMINIO; se non abbiamo bisogno del nome del dominio (come in questo caso) allora inseriamo anche con l'opzione removeRealmFromPrincipal.

Una volta che il nostro utente si è autenticato abbiamo la necessità di conoscere quali siano i suoi ruoli. Ci sono molti modi per mappare i ruoli, inclusa la possibilità di leggere questi dati su un database oppure di utilizzare direttamente il server Active Directory (ce ne occuperemo nei prossimi capitoli). Il modo più veloce e semplice per definire questi ruoli è utilizzare un file di proprietà. Il modulo UsersRolesLoginModule con codice UsersRoles può mappare i valori che vogliamo dal file di proprietà agli utenti autenticati. Per riuscire nell'impresa dobbiamo creare due files dentro la cartella di configurazione (standalone o domain): spnego-users.properties e spnego-roles.properties. Il file spnego-users rimarrà vuoto ma dobbiamo comunque crearlo perchè così richiede il modulo, mentre il file spnego-roles conterrà riga per riga gli username con una serie di ruoli suddivisi da una virgola:

angelo=ruolo1,ruolo2...

Ricordiamoci che abbiamo inserito l'opzione removeRealFromPrincipal; se non lo avessimo fatto nel file dei ruoli dovremmo ricordarci di inserire assieme all'username anche il dominio dell'utente ad esempio:

Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.=ruolo1,ruolo2...

Il login module per il ruolo degli utenti quindi sarà configurato in questo modo:

<login-module code="UsersRoles" flag="required">
<module-option name="password-stacking" value="useFirstPass" />
<module-option name="usersProperties" value="spnego-users.properties" />
<module-option name="rolesProperties" value="spnego-roles.properties" />
</
login-module>

Con entrambi i moduli login configurati, la configurazione del security domain completa si aggiungerà come la precedente ai file standalone.xml/domain.xml:

<security-domain name="SPNEGO" cache-type="default">
<authentication>
<login-module code="SPNEGO" flag="requisite">
<module-option name="password-stacking" value="useFirstPass"/>
<module-option name="serverSecurityDomain" value="host"/>
<module-option name="removeRealmFromPrincipal" value="true"/>
</login-module>
<login-module code="UserRoles" flag="required">
<module-option name="password-stacking" value="useFirstPass" />
<module-option name="usersProperties" value="spnego-users.properties" />
<module-option name="rolesProperties" value="spnego-roles.properties" />
</login-module>
</authentication>
</
security-domain>

A questo punto il nostro utente potrà essere autenticato da JBoss attraverso Active Directory con i suoi ruoli assegnati.

Lascia un commento

Assicurati di inserire (*) le informazioni necessarie ove indicato.
Codice HTML non è permesso.