Spring Blog

Siamo lieti di annunciare che la prima pietra miliare dell’estensione Spring Security Kerberos è ora disponibile per il download. La versione è disponibile anche attraverso il repository Maven milestone a http://maven.springframework.org/milestone. Con l’estensione Spring Security Kerberos, gli utenti vengono autenticati rispetto all’applicazione Web semplicemente aprendo l’URL. Non è necessario inserire un nome utente / password e non è necessario installare software aggiuntivo.

Prima di approfondire Kerberos, vorrei presentare Spring Security Extensions, un nuovo progetto di estensione Spring dedicato a fornire moduli di estensione per il core Spring Security project. Attualmente abbiamo due estensioni sviluppate lì: Un’integrazione SAML2 e un’integrazione Kerberos/SPNEGO. Ogni modulo avrà il proprio ciclo di rilascio, in modo che le persone possano beneficiare di queste estensioni non appena sono pronte e non devono aspettare la prossima release di sicurezza di primavera. Se avete qualche idea o anche qualche codice per ulteriori estensioni, si prega di dirci!

Kerberos/SPNEGO

Nella prima pietra miliare di questo modulo vi forniamo una soluzione Kerberos/SPNEGO pronta all’uso per le applicazioni web. Kerberos è un protocollo di autenticazione di rete standardizzato, progettato per fornire un’autenticazione forte per applicazioni client/server, come le applicazioni Web in cui il browser è il client. È anche il modo consigliato per autenticare gli utenti in una rete Windows e sostituisce NTLM obsoleto e relativamente insicuro. Oltre a questo, è ampiamente utilizzato negli ambienti * NIX e ci sono implementazioni per ogni piattaforma principale. Quindi, è molto probabile che tu abbia già Kerberos sul posto e ora puoi usarlo anche nella tua applicazione web. Ciò significa che il tuo utente inserisce semplicemente l’URL e viene automaticamente autenticato con il suo nome utente del dominio, ad esempio [email protected]. È quindi possibile trovare questo nome utente tramite Spring Security o anche con richiesta.getRemoteUser (). Come funziona? Ecco una breve panoramica:

Il Browser invia una richiesta GET all’applicazione Web (1), che restituisce quindi che è richiesta l’autenticazione “negotiate” (2). Il Browser chiederà quindi al server Kerberos di ottenere un cosiddetto ticket di servizio (3). Il Browser invia quindi questo ticket di servizio, che dimostra l’identità del chiamante, e alcune cose aggiuntive all’applicazione web (5). Dopo aver convalidato il ticket, in base a un segreto condiviso tra l’applicazione Web e il server Kerberos, si ottiene il nome utente.

Per funzionare, ogni applicazione web deve essere registrata sul server Kerberos e ottiene un prinicipal di servizio e un segreto condiviso assegnato. Per le applicazioni Web, il principale del servizio deve essere “HTTP / < nome di dominio completo qualificato> @DOMAIN”. Ad esempio “HTTP/[email protected]”, se la tua app funziona su web.springsource.com. Devi quindi esportare le credenziali di questo principal in un file keytab (shared secret) e renderlo disponibile per la tua applicazione. Ogni sistema basato su Kerberos funzionerà in questo modo, ma la creazione di questo principale di servizio e del keytab è diversa tra i sistemi. Vi mostrerò come si fa questo con Microsoft Windows e MIT Kerberos, ma dovrebbe funzionare anche con altre implementazioni.

Creazione di servizio principale con Microsoft Windows 2008 Server

Anche se questo si riferisce a Microsoft Windows 2008 Server, dovrebbe essere molto simile nel 2003 e anche 2000 Server. In ActiveDirectory, è sufficiente creare un normale utente di dominio e quindi assegnargli un service principal (SPN) e creare keytab con un’utilità da riga di comando. E ora passo dopo passo:

Crea un utente normale che diventerà il principale del servizio. Il nome utente e la password non hanno senso per Kerberos, ma ovviamente dovresti scegliere un nome utile, come http-web.springsource.com. Basta fare in modo che si disattiva l’opzione “L’utente deve cambiare la password al prossimo accesso” e attivare “La password non scade mai”.

Dopodiché, devi usare lo strumento da riga di comando “ktpass.exe”. È già incluso in Windows 2008 Server, nelle versioni precedenti è necessario installarlo da soli. Basta fare in modo che si sta utilizzando una versione che corrisponde alla versione del server e anche il locale deve corrispondere. Questo strumento assegnerà il nome principale del servizio (SPN) all’utente creato in precedenza ed esporterà la chiave utente in un file keytab. Se il vostro principale di servizio è “HTTP/[email protected]” e il tuo utente è http-web.springsource.com, allora il tuo comando ktpass dovrebbe assomigliare a questo:


ktpass /out http-web.keytab /mapuser /princ HTTP/ /pass *

ktpass ti chiederà qualche password. Si dovrebbe scegliere alcuni sicuro uno casuale per esso. Se ora hai un file http-web.keytab nella tua directory, quindi tutto ha funzionato bene. Questo file è necessario più avanti nell’applicazione, in quanto contiene il segreto condiviso per convalidare i ticket di servizio.

Creazione del servizio principale con MIT Kerberos

Su sistemi *NIX e anche in Mac OS X, l’implementazione MIT Kerberos è ampiamente utilizzata. Con MIT Kerberos è ancora più semplice. Basta aprire la console kadmin ed eseguire i seguenti comandi:


kadmin: addprinc -randkey HTTP/web.springsource.comkadmin: ktadd -k /http-web.keytab HTTP/web.springsource.com

Si dovrebbe quindi avere un file http-web.keytab sotto radice. Questo file è necessario in seguito nell’applicazione, in quanto contiene il segreto condiviso per convalidare i ticket di servizio.

Configurazione di Spring Security

Prima di tutto, i requisiti:

  • Sicurezza della molla 3.0.0 M2
  • SUN JRE / JDK 1.6.x
  • Kerberos ambiente
  • Browser che supporta SPNEGO (Firefox, IE, Safari)

Per poter utilizzare il modulo Kerberos in Spring Security, è sufficiente dichiarare un filtro, un punto di ingresso di autenticazione e un provider di autenticazione. Abbiamo incluso un esempio web app che è possibile utilizzare come punto di partenza. Devi solo configurare il nome principale del tuo servizio e posizionare il keytab di generazione lì. L’applicazione di esempio è incluso nel download di cui sopra.

Se si apre la protezione.file xml dell’applicazione di esempio, che si trova in /src/main/webapp/WEB-INF, viene visualizzata una configurazione di base Spring Security che utilizza il nuovo modulo Kerberos.

I primi due bean (SpnegoEntryPoint e SpnegoAuthenticationProcessingFilter) sono responsabili dell’handshake e KerberosServiceAuthenticationProvider convalida infine il ticket di servizio. Attualmente supportiamo solo l’implementazione Kerberos / SPNEGO che è inclusa in JRE/JDK di SUN. Poiché recuperi solo il nome utente da Kerberos, hai anche bisogno di un UserDetailsService per recuperare i ruoli e forse altri attributi utente. In questo esempio usiamo solo un’implementazione fittizia per semplificare i test.

Come potete vedere, abbiamo già compilato il nome del servizio e la posizione keytab. Modificare questi valori in base alle proprie esigenze e assicurarsi che la keytab generata in precedenza sia disponibile in questa posizione.

Ora avvia il tuo server e prova a tentare un’autenticazione SPNEGO. Dovresti vedere il tuo nome utente completo nel browser. Nel codice è possibile recuperare il nome utente con le normali classi di sicurezza Spring o anche con la richiesta di chiamata Java servlet standard.getRemoteUser (). Se non funziona (forse vedi una pagina vuota), controlla queste cose:

  • Controllare il file di log
  • Assicurarsi di utilizzare il nome di dominio completo qualificato (non l’indirizzo IP e non il nome breve) nell’URL.
  • Se si utilizza Internet Explorer: Attivare “Windows Integrated Authentication” e assicurarsi che il dominio (nel nostro caso web.springsource.com) è elencato nella sezione del sito intranet locale di IE.
  • Se stai usando Firefox: dai un’occhiata qui.
  • Se si utilizza un client Windows: Client e Server devono essere su macchine diverse, perché altrimenti Windows utilizzerà NTLM invece di Kerberos.
  • Controllare se il tempo è sincronizzato su tutte le macchine coinvolte.
  • Se stai utilizzando Microsoft AD, troverai ulteriore aiuto qui: http://msdn.microsoft.com/en-us/library/ms995329.aspx
    • Oltre a questo, l’impostazione di un ambiente Kerberos corretto può essere complicata, ed è importante ottenere questo diritto prima di iniziare a utilizzare l’estensione Kerberos Spring Security. La maggior parte dei problemi che incontriamo durante la consultazione sono problemi con l’ambiente Kerberos e non con l’applicazione stessa.

      Se non si desidera utilizzare l’estensione Spring Security Kerberos nel proprio progetto Maven, è necessario aggiungere il repository Spring Milestone al pom.XML. Dovrebbe assomigliare a questo:

e naturalmente la dipendenza:

C’è ancora del lavoro da fare, ad esempio per fornire Kerberos anche per i client Java e non solo per il server, ma speriamo che proverai questa versione milestone e fornirai qualche feedback. Il Forum della comunità è il posto migliore per porre domande o per iniziare discussioni su nuove funzionalità. In alternativa, se trovi qualcosa che non va, puoi sollevare un problema Jira.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.