Sempre più spesso sono coinvolto nella risoluzione di problemi di configurazione di Kerberos in infrastrutture con più server dove le credenziali devono essere “delegate” dai front-end server ai back-end server.

image

Ho pensato di scrivere questo post dove riportare tutti i punti per configurare i parametri usati da kerberos per funzionare correttamente.

Come funziona

La configurazione su mi trovo a lavorare sempre più spesso prevede uno o più server IIS e un back-end server con un SQL server o un File server. Per comprendere meglio i passi di configurazione è utile spiegare come funziona il meccanismo che permette di arrivare al server di back-end con le credenziali del client.

  1. Il client passa le credenziali al Domain Controller/KDC che ritorna il TGT al client
  2. Il client usa il TGT per richiedere il Service Ticket per connettersi al server IIS
  3. Il client si connette al server IIS passandogli il TGT e il service Ticket
  4. Il Server IIS usa il TGT passato dal client per richiedere il service ticket per accedere al Server SQL
  5. Il Server IIS si connette a Server SQL usando le credenziali dell’utente loggato al client

image

Configurazione

Per permettere ad una sistema come quello rappresentato nell’immagine sopra di lavorare correttamente è necessario configurare diversi parametri nei diversi software utilizzati (IIS, IE, AD..)

Internet Explorer

  • Configurare FQDN del sito che verrà utilizzato nel “Local Intranet Zone” di Internet Explorer. Nel nostro esempio useremo l’FQDN blogs.technet.com

image

  • Abilitare l’opzione “Enable Windows Integrated Authentication” sotto “Internet Options->Advanced->Security-> Advanced”

image

  • Abilitare l’opzione “Automatic logon with current username and password" o "Automatic Logon only in Intranet Zone"  sotto “Internet Options->Advanced->Security-> Custom level”

image

IIS

  • Eseguire il seguente comando per verificare la configurazione di IIS e assicurarsi che l’output mostri “Negotiate, NTLM”.

<system drive>\inetpub\adminscripts\cscript adsutil.vbs get w3svc/ WebSite /root/NTAuthenticationProviders

Bisogna sostituire WebSite  con il numero del sito in IIS che sarà usato.

image

  • Configurare IIS con la sola “Windows Integrated Authentication

image

  • Se si usano più IIS server è necessario configurare l’AppPool di entrambi i server IIS con un utente di dominio creato appositamente ( esempio: AppPoolUser). Nel caso di un solo server IIS si può lasciare l’utente Local System.

image

Active Directory

  • L’account AppPoolUser deve essere configurato con l’opzione per permettere la “delega”.

image 

Bisogna precisare la differenza tra “Kerberos Delegation” (immagine sopra a sx) e “Contrained Delegation” (immagine sopra a dx). La“Kerberos Delegation” permette al primo server (front-end) di richiedere a nome del client il ticker kerberos per accedere al secondo server (back-end). La “Constrained Delegation” a differenza della “Kerberos Delegation” non è supportata su tutti i sistemi e per funzionare richiede che il “domain functional level” sia impostato a 2003. Con la “Constrained Delegation” l’amministratore può configurare un utente per richiedere il ticker kerberos solo per specifici servizi. Nell’esempio sopra abbiamo specificato solo il server SQLServer con la porta 1433 e il service principal name MSSQLSvc.

  • L’account AppPoolUser deve essere aggiunto al gruppo  IIS_WPG group su ogni IIS server.
  • Registrare l’SPN per l’FQDN blogs.techenet.com all’account AppPoolUser

Setspn –A http/<FQDN>  <Domain user account>

Setspn –A http/<Netbios Name>  <Domain user account>

  • Verificare che SQL abbia registrato durante l’installazione l’SPN nell’oggetto computer del server SQLServer

Setspn –L <Domain user account>

  • Configurare i seguenti diritti per l’account AppPoolUser su tutti i server IIS tramite le Local Policy o tramite una GPO

 

 

 

clip_image002

Troubleshooting

Se avete seguito i passi sopra il sistema dovrebbe usare Kerberos senza problemi. Nel caso ci fossero problemi vi suggerisco di scaricare questa applicazione ASP.NET dal sito:

http://blogs.iis.net/brian-murphy-booth/archive/2007/03/09/delegconfig-delegation-configuration-reporting-tool.aspx

Dopo aver scaricato l’applicazione create un nuovo sito usando i file scaricati. A questo punto puntando sul nuovo sito avrete un report completo con indicato gli errori e la procedura per risolverli. Vi riporto un esempio di report nel caso tutto sia configurato correttamente:

image

Se l’uso dell’applicazione Delegconfig non è sufficiente vi riporto una lista di azioni da fare per identificare la causa del problema:

  1. Pulire la cache kerberos con il tool Klist.exe o Kerbtray.exe sul client e su tutti i server. In questo modo tutti i ticket kerberos verranno richiesti al KDC utilizzando la nuova configurazione
  2. Aumentare il livello del log di Kerberos (KB262177). Con l’attivazione di questo log verranno generati degli eventi in caso di errori nel registro degli eventi di sistema.
  3. Collezionare una trace di rete sul client, il front-end e il back-end e analizzare il traffico kerberos sulla porta 88. Con l’analisi della trace di rete siete in grado di capire se ci sono problemi nella configurazione degli SPN. Gli errori kerberos tipici sono:
  • KDC_ERR_S_PRINCIPAL_UNKNOWN= Non è stato registrato l’spn
  • KDC_ERR_PRINCIPAL_NOT_UNIQUE= Ci sono più oggetti che hanno registrato lo stesso SPN. Per identificare gli oggetti si possono usare diversi tool. Avendo un server Windows 2008 si può sfruttare una nuova funzionalità del tool SetSpn:

http://blogs.msdn.com/saurabh_singh/archive/2009/01/09/new-features-in-setspn-exe-on-windows-server-2008.aspx

Altrimenti bisogna utilizzare il tool LDIFDE con la seguente sintassi:Syntax:

ldifde -f <filename> -d "<dc=domain-netbiosname,dc=primary-domain>" -l serviceprincipalname -r "(serviceprincipalname=<serviceprincipalname-to-check-for-duplicates>)" -p subtree

For example, if the domain name is test.abcd.com and the site URL is http//test.abcd.com command should be as shown below:

ldifde –f C:\log.txt -d "dc=test, dc=abcd, dc=com"-l serviceprincipalname –r "(serviceprinicpalname=http/test.abcd.com)" -p subtree

Se non volete usare il tool LDIFDE potete usare lo script contenuto nell’articolo 929650   

Articoli utili

Documenti utili