Table of Contents

Integrazione con Kerberos5 dei LNF

Questo documento descrive il metodo usato per l'integrazione del dominio Windows nel sistema di autenticazione centrale dei LNF, basato su Kerberos 5 (MIT su sistemi Unix).

Lo scopo e' di permettere agli utenti del Servizio di Calcolo di effettuare login sul dominio utilizzando le proprie credenziali Kerberos (uniche per l'accesso a tutte le risorse informatiche dei LNF gestite dal Servizio)

Requisiti

- Computer client con sistema operativo Windows 7 installato

- Computer client con AFS e MIT Kerberos configurati

Step 1: Relazione di trust

Creazione della relazione di trust tra il dominio Windows (WIN.LNF.INFN.IT) e il REALM Kerberos (LNF.INFN.IT)

Lato Windows Server (Domain Controller):

Fare login sul server come Administrator

Start --> Programs --> Administrative Tools --> Active Directory Domains and Trusts
Click con il tasto destro su <domain name> --> Properties
Click su New Trust... (parte un Wizard)
click su Next>
Scrivere il REALM Kerberos con cui fare il Trust (nel nostro caso ad esempio: LNF.INFN.IT), quindi click su Next>
Selezionare "REALM trust" e click su Next>
Selezionare "Transitive" e click su Next>
Selezionare "Two-way" e click su Next>
Inserire una password di trust e click su Next>
  (Nota: la password deve essere sufficientemente sicura e uguale a quella impostata sul Kerberos server, lato Unix; 
  per convenzione <password_per_il_trust>) 
Click su Next>
Click su Finish

Lato Unix (Kerberos5 server):

Fare login sul server come root e digitare i seguenti comandi:

ank -e arcfour-hmac-md5:normal -pw <password_per_il_trust> krbtgt/LNF.INFN.IT@WIN.LNF.INFN.IT
ank -e arcfour-hmac-md5:normal -pw <password_per_il_trust> krbtgt/WIN.LNF.INFN.IT@LNF.INFN.IT

Nota: Il controllo della versione della password nella relazione di fiducia tra Windows Kerberos e MIT Kerberos sembra che non venga fatto.

Comandi utili

Lato unix

kvno <principal>

Lato Windows

netdom
adsiedit.msc
setspn

Step 2: Creazione degli account utente

Creazione in Active Directory Domain Server degli account per tutti gli utenti che potranno accedere al dominio.

La creazione degli account avviene tramite sincronizzazione con LDAP. Si leggono tutte le username valide da LDAP e si verifica per ciascuna l esistenza del relativo account in Active Directory. Nel caso non esista si procede con la creazione. In questo modo e' possibile avere Active Directory sempre aggiornato, creado o attivando nuovi account ed eventualmente disabilitando quelli che non sono piu' in uso. Per rendere questo procedimento automatico viene fatto eseguire il seguente script (in VBScript):

Set oDS = GetObject("LDAP:")
Dim fso, MyFile
set fso = CreateObject("Scripting.FileSystemObject")
FileName = "E:\Kits\log_AD\log" & Day(Date)&"_"&Month(Date)&"_"&Year(Date)&"_"&Hour(Now)&"-"&Minute(Now) & ".txt"
Set MyFile = fso.CreateTextFile( FileName, True)
Set oAuth = oDS.OpenDSObject("LDAP://server:port/ou=Services,dc=infn,dc=it", DN , password ,2)
Dim oConn: Set oConn = CreateObject("ADODB.Connection")
oConn.Provider = "ADSDSOObject"
oConn.Open "Ads Provider", DN , password
Dim rsLdap
Set rsLdap = oConn.Execute("<LDAP://server:port/dc=lnf,dc=infn,dc=it>;(uid=*);uid;subtree")
If((rsLdap.BOF)And(rsLdap.EOF)) Then 
    MyFile.WriteLine("Non è stato trovato nessun utente su LDAP") 
Else
'wscript.echo rsLdap.RecordCount
Set HashLdap = CreateObject("Scripting.Dictionary")
While Not rsLdap.EOF
      arr = rsLdap.Fields("uid")
      HashLdap.Add arr(0),   1
      rsLdap.MoveNext
Wend
MyFile.WriteLine("Numero di utenti trovati su LDAP: "& rsLdap.RecordCount)
MyFile.WriteLine
End If
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Open "Provider=ADsDSOObject;"
Set objCommand= CreateObject("ADODB.Command")
objCommand.ActiveConnection = objConnection
objCommand.Properties("Sort on") = "Name"
objCommand.CommandText = "<LDAP://cn=Users,dc=win,dc=lnf,dc=infn,dc=it>;(&(altSecurityIdentities=Kerberos*)(!userAccountControl:1.2.840.113556.1.4.803:=2));Name,objectCategory;onelevel"
Set objRecordSet = objCommand.Execute
objCommand.CommandText = "<LDAP://cn=Users,dc=win,dc=lnf,dc=infn,dc=it>;(&(altSecurityIdentities=Kerberos*)(userAccountControl:1.2.840.113556.1.4.803:=2));Name,objectCategory;onelevel"
Set recdis = objCommand.Execute
Set wshShell = WScript.CreateObject ("WSCript.shell")
contatore=0 ' Conta le modifiche avvenute
If ((objRecordSet.BOF)And(objRecordSet.EOF)) Then
    MyFile.WriteLine("Non è stato trovato nessun utente da disabilitare")
Else
    MyFile.WriteLine("Numero di utenti attivi su Active Directory: "& objRecordSet.RecordCount) 
MyFile.WriteLine 
MyFile.WriteLine("Elenco utenti da disabilitare")    
MyFile.WriteLine 
While Not objRecordSet.EOF 
     arrAD = objRecordSet.Fields("Name")
     If (HashLdap.Exists(arrAD)) Then
          HashLdap.Remove(arrAD)
     Else
          contatore=contatore+1
          'wscript.echo arrAD
          'wscript.Echo "dsmod user cn="& arrAD &",cn=users,dc=win,dc=lnf,dc=infn,dc=it -disabled yes"
          MyFile.WriteLine(arrAD)
          'return = wshshell.run ("dsmod user cn="& arrAD &",cn=users,dc=win,dc=lnf,dc=infn,dc=it -disabled yes",0)
          wscript.sleep 1000
    End If    
    objRecordSet.MoveNext
Wend
End If
MyFile.WriteLine 
MyFile.WriteLine("Numero di utenti disattivi su Active Directory: "& recdis.RecordCount) 
MyFile.WriteLine
if (recdis.RecordCount > 0) then
      MyFile.WriteLine("Elenco utenti da riabilitare")
      MyFile.WriteLine
end if
If ((HashLdap.Count>0)And((Not recdis.BOF)Or(Not recdis.EOF))) Then
    while Not recdis.EOF
        rec=recdis.Fields("Name")
        if (HashLdap.Exists(rec)) Then
            contatore=contatore+1
            HashLdap.Remove(rec)
            'wscript.Echo "dsmod user cn="& rec &",cn=users,dc=win,dc=lnf,dc=infn,dc=it -disabled no"
            MyFile.WriteLine(rec)
            'return1 = wshshell.run ("dsmod user cn="& rec &",cn=users,dc=win,dc=lnf,dc=infn,dc=it -disabled no",0)
        End If
        recdis.MoveNext
    Wend
End If
'wscript.echo "Utenti da creare"
MyFile.WriteLine("Nuovi utenti da creare")
MyFile.WriteLine 
If (HashLdap.Count>0) Then
    For Each Elem in HashLdap.Keys
          contatore=contatore+1
          'wscript.echo Elem 
          Set recutente = oConn.Execute("<LDAP://server:port/dc=lnf,dc=infn,dc=it>;(uid="&Elem&");givenName,sn;subtree")
          arrnome= recutente.Fields("givenName")
          arrsn= recutente.Fields("sn")
          a=array("ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz","12345678901234567890123456","!?^,.-+:;!?!;^,.-+:;!?,-+:;")
          password=""
          for j=0 to 2
                for i=0 to Ubound(a)
                    Randomize
                    ran=Int((26)*Rnd+1)
                    password=password&Mid(a(i),ran,1)
                Next
         Next
         Set wshSh = WScript.CreateObject ("WSCript.shell")
         dsna ="dsadd user cn="& Elem &",cn=users,dc=win,dc=lnf,dc=infn,dc=it -fn """& arrnome(0) &""" -ln """&arrsn(0)&""" -display """& arrnome(0) &" "& arrsn(0) &""" -pwd  "& password &" -email """& arrmail(0) &"""  -canchpwd no -pwdneverexpires yes -disabled no"
        MyFile.WriteLine(Elem)           
        return =wshSh.Run (dsna,0)
        Set wshSh= nothing
        'wscript.echo dsna 
        WScript.Sleep 2000 
    Next
' Le seguenti righe creano i nuovi utenti
For Each Elem in HashLdap.Keys
       Set objUser = GetObject("LDAP://cn="&Elem&",cn=Users,dc=win,dc=lnf,dc=infn,dc=it") 
       objUser.Put "userPrincipalName", Elem & "@win.lnf.infn.it"
       objUser.Put "altSecurityIdentities", "kerberos:" & Elem & "@LNF.INFN.IT"
       objUser.SetInfo
       MyFile.WriteLine("Kerberos settato con succeso per il profilo: " & Elem )
       WScript.Sleep 1500 
Next
End If
oConn.close
set wshshell = nothing
objConnection.Close
MyFile.Close
if (contatore>0) Then
      text=""
      Set fil=fso.OpenTextFile(FileName, 1 )
      If fil.AtEndOfStream Then
         text = ""
      Else
         text = fil.ReadAll
      End If
      fil.Close
      Set objEmail = CreateObject("CDO.Message")
      objEmail.From = indirizzo_mittente
      objEmail.To = indirizzo_destinatario
      objEmail.Subject = "Modifica account Active Directory"
      objEmail.Textbody = text
      objEmail.Configuration.Fields.Item _
      ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
      objEmail.Configuration.Fields.Item _
      ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = _
      nome_server
      objEmail.Configuration.Fields.Item _
      ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
      objEmail.Configuration.Fields.Update
      objEmail.Send
End If    
wscript.Quit

IMPORTANTE: LDAP prevede una connessione sicura che si basa sul protocollo SSL. In questo caso la comunicazione avviene sulla porta 636. Prima di eseguire lo script e' necessario assicurarsi che sulla macchina locale sia installato un certificato valido, altrimenti non sara' possibile instaurare la connessione.

IMPORTANTE: Prima di eseguire lo script e' necessario impostare alcuni parametri per Active Directory. Si considera che, per impostazione predefinita, Active Directory restituisce un numero massimo di 1000 record per ogni query. Se il numero di elementi da restituire supera il limite previsto, durante l' esecuzione della query viene generato un errore. Occorre, quindi, impostare i parametri MaxPageSize e MaxResultSetSize con il seguente procedimento:

Fare login sul server come amministratore
Start --> Run --> Ntdsutil.exe --> LDAP policies
connections --> connect to nome dominio Windows --> q
LDAP policies --> Set MaxPageSize to numero_elementi -->Commit Changes
LDAP policies --> Set MaxResultSetSize to numero di byte (aumentati in proporzione al numero di elementi) --> Commit Changes
Show Values --> q --> q

Lo script viene realizzato con i seguenti passi:

IMPORTANTE: Quando si creano le query e' necessario definire i filtri in modo opportuno, facendo attenzione a non ottenere un recordset contenente username relativi a computer, gruppi o utenti particolari che sono definiti nello stesso ramo ma non devono essere considerati. In questo caso e' possibile richiedere solo utenti per cui e' stato specificato il campo altsecurityIdentities con il nome Kerberos.

IMPORTANTE: Affinche' l' utente possa accedere al dominio Windows con le proprie credenziali Kerberos, e' necessario impostare il campo altSecurityIdentities con il nome Kerberos dell'utente.

NOTA: Quando lo script viene eseguito per la prima volta e non sono ancora stati creati account su Active Directory, i due recordset relativi agli account attivi e disattivi sono vuoti, quindi l' array associativo, dal quale in questo modo non possono essere stati eliminati degli elementi, contiene le username di tutti gli utenti dei LNF per cui si deve creare un account.

Step 3: Definizione Mapping

Lato Windows Client

3.1 Definire il computer locale come membro del dominio Windows con i seguenti passi:

Accedere al computer locale come amministrator --> Start --> Control Panel
System --> Advanced System Settings --> Computer Name --> Change
In Member of specificare il dominio Windows --> Ok --> Ok

3.2 Aggiungere sul computer di ciascun utente il nome del MIT Kerberos KDC utilizzando il seguente comando:

Ksetup /addkdc NOME_REALM NOME_KDC

3.3 Definire il mapping per tutti gli utenti che potranno accedere nel dominio dal computer locale con il seguente comando:

Ksetup /MapUser *@LNF.INFN.IT *@win.lnf.infn.it

NOTA: Si specifica '*' per indicare che il mapping deve essere fatto per tutti gli utenti.

Riavviare il computer per rendere effettive le operazioni eseguite con il comando ksetup.

Step 4: Folder Redirection

Lato Windows Server

4.1 Definire le specifiche per il folder redirection. Decidere, quindi, la locazione di memoria e le cartelle da reindirizzare.

Il folder redirection permette di memorizzare le cartelle del proprio profilo Windows in uno spazio disco in rete appositamente dedicato. Quindi ogni modifica locale viene istantaneamente riportata in rete. Inoltre l' utente ha la possibilita' di continuare a lavorare sui propri dati anche quando e' disconnesso dalla rete in quanto viene generata una copia locale delle cartelle remote. In questo caso la sincronizzazione avviene quando viene rilevata la connessione.

Vantaggi:

Si e' scelto di reindirizzare le cartelle su uno storage di Windows dedicato in cui si crea uno share condiviso per gli utenti di Active Directory. Il folder redirection viene definito per le seguenti cartelle:

Desktop
Documents
AppData
Start Menu
Contacts
Links

4.2 Creare una Group Policy di dominio. Le cartelle per cui applicare il Folder Redirection e le varie specifiche vengono definite tramite opportune group policy. Procedere come segue:

Start --> Program --> Administrative Tools --> Group Policy Management 
Espandere il dominio --> Click con il tasto destro su "Group Policy Object" --> New
Assegnare un nome alla nuova group policy --> Ok
Click con il tasto destro sul dominio --> Link an Existing GPO
Selezionare la group policy --> OK
Specificare gli account di dominio per cui applicare la GPO

4.3 Specificare le cartelle da reindirizzare tramite la GPO precedentemente creata:

Start --> Program --> Administrative Tools --> Group Policy Management
Dominio --> Group Policy Object 
Click con il tasto destro sulla Group Policy precedentemente creata per il dominio --> Edit
User Configuration --> Policies --> Windows Setting --> Folder Redirection
Click con tasto destro sulla cartella da reindirizzare --> Properties
In Target specificare:
Basic-Redirect everyone's folder to the same location
In Target folder location specificare:
Create a folder for each user under the root path
Specificare in Root Path lo spazio di memoria in cui posizionare la cartella
In Settings selezionare:
Grant the user exclusive right to <Nome Cartella>
Move The content of <Nome Cartella> to new location
In Policy Removal specificare:
Leave the folder in the new location when policy removed

Nota: Per ciascun utente viene aggiunto in modo automatico al Root Path username e nome della cartella da creare. Quindi non occorre specificare questi valori.

Nota: Si ha la possibilita' di definire alcuni tipi di file, tramite estensione, che non potranno essere memorizzati nello spazio disco in rete.

Step 6: Creazione delle Cartelle e definizione Quote

Per il Folder Redirection si e' scelto di utilizzare uno storage di Windows collegato tramite connessioni multiple. Per avere una visione unica di ciascun disco e' stato utilizzato il Multipath I/O abilitando la features MPIO.

Lo storage dedicato alle cartelle di Windows prevede l' utilizzo della tecnologia Thin Provisioning che permette di assegnare uno spazio maggiore, in questo caso 10 TB, rispetto a quello fisicamente allocato e lo rende disponibile contestualmente alle richieste degli utenti. Si e' deciso di assegnare 10 GB di spazio per ciascun utente.

Per definire lo spazio di archiviazione procedere come segue:

     Start --> Program --> Administrative Tools --> Server Manager
     Ruoli --> File Services --> Share and Storage Management
     File Server Resource Manager --> Quotas
     "Create Template" specificando: 
     Limit: 10 GB
     Selezionare "Hard Quotas"
     Start --> Program --> Administrative Tools --> Server Manager
     Ruoli --> File Services --> Share and Storage Management
     File Server Resource Manager --> Quotas
     "Create quota" specificando:
     Lo share condiviso a cui applicare la quota
     Selezionare "Auto apply template and create quotas on existing and new subfolders"
     Specificare il riferimento al template precedentemente creato
     

In questo modo, durante il primo login, verra' creata automaticamente una cartella per ciascun utente contenente le shared folders.

Nota: E' stata verificata la possibilita' di utilizzare AFS come spazio di archiviazione delle cartelle di Windows e del profilo utente. Considerando che per accedere ad AFS e' necessario ottenere un token, si e' osservato che alcune volte si verificano dei ritardi nell' acquisizione del token rispetto al momento in cui il sistema operativo prevede il download delle cartelle remote. Questo porta alla creazione di un profilo temporaneo locale che viene cancellato a logout.

Roaming Profile

Un altro metodo per memorizzare i dati degli utenti su disco remoto e' il Roaming Profile.

Il Roaming Profile permette di salvare il profilo utente con la possibilita' di escludere alcune cartelle, eventualmente utilizzate con il Folder Redirection. Il profilo viene caricato sul computer locale durante il login e le modifiche sono apportate a logout. In questo modo l' utente ha la possibilita' di lavorare sui propri dati accedendovi da diversi terminali. La differenza rispetto al Folder Redirection e' che non si ha una continua sincronizzazione tra i dati locali e quelli remoti.

Per configurare il Roaming Profile e' possibile:

Per specificare le cartelle da escludere dal Roaming Profile procedere come segue:

Start --> Administrative Tools --> Group Policy Management
Espandere il dominio --> Group Policy Object 
Click con il tasto destro sulla group policy creata precedentemente per il dominio --> Edit
User configuration --> Administrative Tools --> System --> user Profiles
Doppio click su "Exclude directory in roaming profiles"
Specificare le cartelle da escludere 

Se si intende impostare la cancellazione per le copie del Roaming Profile memorizzate procedere come segue:

Start --> Administrative Tools --> Group Policy Management
Espandere il dominio --> Group Policy Object 
Click con il tasto destro sulla group policy creata precedentemente per il dominio --> Edit
Computer configuration --> Administrative Tools --> System --> user Profiles
Doppio click su "Delete cached copies of roaming profiles" --> Enable --> Ok