====== 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 --> 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 ) 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 krbtgt/LNF.INFN.IT@WIN.LNF.INFN.IT ank -e arcfour-hmac-md5:normal -pw 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 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(";(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 = ";(&(altSecurityIdentities=Kerberos*)(!userAccountControl:1.2.840.113556.1.4.803:=2));Name,objectCategory;onelevel" Set objRecordSet = objCommand.Execute objCommand.CommandText = ";(&(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(";(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: * Creazione di un file di testo identificato da giorno ed ora in cui lo script viene eseguito, contenente tutte le modifiche apportate. * Connessione ad LDAP. Si stabilisce un collegamento passando tutti i parametri necessari. * Interrogazione LDAP. Si esegue una query richiedendo le username di tutti gli utenti del ramo dc=lnf,dc=infn,dc=it. Il risultato viene memorizzato in una struttura di tipo recordset. * Creazione di un array associativo che viene riempito con le username degli utenti di LDAP. * Connessione ad Active Directory. * Interrogazione di Active Directory. Si eseguono due query in modo da creare due oggetti recordset contenenti rispettivamente le username relative ad account attivi e le username per gli account disattivi. **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. * Verificare l'esistenza in Active Directory di account da disattivare. Si scorre il recordset relativo agli account attivi di Active Directory verificando, per ciascuna username, se esiste anche nell' array associativo (precedentemente creato per le username degli utenti di LDAP). Se esiste, si procede eliminando l' elemento corrispondente dall' array associativo, altrimenti l' account in Active Directory viene disattivato. * Verificare l'esistenza in Active Directory di account da riattivare. Si scorre il recordset relativo agli account disattivi di Active Directory verificando per ciascuno se esiste anche nell' array associativo. In questo caso si procede eliminando l' elemento corrispondente dall' array e riattivando l' account considerato. * Creazione di nuovi account su Active Directory. Gli elementi dell'array associativo che non sono stati precedentemente eliminati, contengono le username di tutti gli utenti che possiedono un account su LDAP ma non su Active Directory. Si procede, quindi, alla creazione di questi nuovi account utilizzando la funzione **dsadd user** e definendo, in seguito, i campi **userPrincipalName** e **altSecurityIdentities**. **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. * Chiusura di tutte le connessioni. * Invio e-mail per notificare gli aggiornamenti sugli account. Lo script prevede l' invio automatico di una email ogni volta che, a seguito dell' eseguzione dello script, vengono apportate modifiche in Active Directory. Si utilizza un contatore, inizialmente a zero, che viene incrementato ad ogni modifica. Alla fine se il contatore risulta maggiore di zero viene inviato il file di log precedentemente creato. ===== 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:** * Sincronizzazione continua tra dati locali e quelli remoti; * Gestione centralizzata delle informazioni,quindi possibilita' di accedere alle proprie cartelle da diversi terminali; * Possibilita' per diversi utenti di accedere alle proprie informazioni dallo stesso pc; * Facolta' di accedere alle cartelle da pc differenti contemporaneamente. 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 Move The content of 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: * Creare uno share condiviso all' interno dello storage definendo opportunemente i permessi; * Definire un template per le quote: 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" * Creare una quota ed applicarla per tutte le sottocartelle dello share condiviso(ovvero quote per utente): 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: * Definire il parametro **- profile** della funzione **dsadd user** nel caso in cui si crea un nuovo account e **dsmod user** per aggiungere l'informazione per un account gia' esistente, specificando il percorso completo verso lo spazio di memoria in cui salvare il profilo utente. * Modificare manualmente il campo **Profile Path** dell' account utente in Active Directory. 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