strutture:lnf:dr:calcolo:windows:domain:integrazione_con_kerberos
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
strutture:lnf:dr:calcolo:windows:domain:integrazione_con_kerberos [2012/02/22 11:57] – [Step 6: Creazione delle Cartelle e definizione quote] mzobov@infn.it | strutture:lnf:dr:calcolo:windows:domain:integrazione_con_kerberos [2012/02/24 10:41] (current) – [Step 2: Creazione degli account utente] mzobov@infn.it | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Integrazione con Kerberos5 dei LNF ====== | ||
+ | |||
+ | Questo documento descrive il metodo usato per l' | ||
+ | |||
+ | Lo scopo e' di permettere agli utenti del Servizio di Calcolo di effettuare login sul dominio utilizzando le proprie credenziali Kerberos (uniche per l' | ||
+ | |||
+ | ====== 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), | ||
+ | Selezionare "REALM trust" e click su Next> | ||
+ | Selezionare " | ||
+ | Selezionare " | ||
+ | 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: | ||
+ | ank -e arcfour-hmac-md5: | ||
+ | |||
+ | |||
+ | **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(" | ||
+ | Dim fso, MyFile | ||
+ | set fso = CreateObject(" | ||
+ | FileName = " | ||
+ | Set MyFile = fso.CreateTextFile( FileName, True) | ||
+ | Set oAuth = oDS.OpenDSObject(" | ||
+ | Dim oConn: Set oConn = CreateObject(" | ||
+ | oConn.Provider = " | ||
+ | oConn.Open "Ads Provider", | ||
+ | Dim rsLdap | ||
+ | Set rsLdap = oConn.Execute("< | ||
+ | If((rsLdap.BOF)And(rsLdap.EOF)) Then | ||
+ | MyFile.WriteLine(" | ||
+ | Else | ||
+ | ' | ||
+ | Set HashLdap = CreateObject(" | ||
+ | While Not rsLdap.EOF | ||
+ | arr = rsLdap.Fields(" | ||
+ | HashLdap.Add arr(0), | ||
+ | rsLdap.MoveNext | ||
+ | Wend | ||
+ | MyFile.WriteLine(" | ||
+ | MyFile.WriteLine | ||
+ | End If | ||
+ | Set objConnection = CreateObject(" | ||
+ | objConnection.Open " | ||
+ | Set objCommand= CreateObject(" | ||
+ | objCommand.ActiveConnection = objConnection | ||
+ | objCommand.Properties(" | ||
+ | objCommand.CommandText = "< | ||
+ | Set objRecordSet = objCommand.Execute | ||
+ | objCommand.CommandText = "< | ||
+ | Set recdis = objCommand.Execute | ||
+ | Set wshShell = WScript.CreateObject (" | ||
+ | contatore=0 ' Conta le modifiche avvenute | ||
+ | If ((objRecordSet.BOF)And(objRecordSet.EOF)) Then | ||
+ | MyFile.WriteLine(" | ||
+ | Else | ||
+ | MyFile.WriteLine(" | ||
+ | MyFile.WriteLine | ||
+ | MyFile.WriteLine(" | ||
+ | MyFile.WriteLine | ||
+ | While Not objRecordSet.EOF | ||
+ | arrAD = objRecordSet.Fields(" | ||
+ | If (HashLdap.Exists(arrAD)) Then | ||
+ | HashLdap.Remove(arrAD) | ||
+ | Else | ||
+ | contatore=contatore+1 | ||
+ | ' | ||
+ | ' | ||
+ | MyFile.WriteLine(arrAD) | ||
+ | ' | ||
+ | wscript.sleep 1000 | ||
+ | End If | ||
+ | objRecordSet.MoveNext | ||
+ | Wend | ||
+ | End If | ||
+ | MyFile.WriteLine | ||
+ | MyFile.WriteLine(" | ||
+ | MyFile.WriteLine | ||
+ | if (recdis.RecordCount > 0) then | ||
+ | MyFile.WriteLine(" | ||
+ | MyFile.WriteLine | ||
+ | end if | ||
+ | If ((HashLdap.Count> | ||
+ | while Not recdis.EOF | ||
+ | rec=recdis.Fields(" | ||
+ | if (HashLdap.Exists(rec)) Then | ||
+ | contatore=contatore+1 | ||
+ | HashLdap.Remove(rec) | ||
+ | ' | ||
+ | MyFile.WriteLine(rec) | ||
+ | ' | ||
+ | End If | ||
+ | recdis.MoveNext | ||
+ | Wend | ||
+ | End If | ||
+ | ' | ||
+ | MyFile.WriteLine(" | ||
+ | MyFile.WriteLine | ||
+ | If (HashLdap.Count> | ||
+ | For Each Elem in HashLdap.Keys | ||
+ | contatore=contatore+1 | ||
+ | ' | ||
+ | Set recutente = oConn.Execute("< | ||
+ | arrnome= recutente.Fields(" | ||
+ | arrsn= recutente.Fields(" | ||
+ | a=array(" | ||
+ | password="" | ||
+ | for j=0 to 2 | ||
+ | for i=0 to Ubound(a) | ||
+ | Randomize | ||
+ | ran=Int((26)*Rnd+1) | ||
+ | password=password& | ||
+ | Next | ||
+ | Next | ||
+ | Set wshSh = WScript.CreateObject (" | ||
+ | dsna =" | ||
+ | MyFile.WriteLine(Elem) | ||
+ | return =wshSh.Run (dsna,0) | ||
+ | Set wshSh= nothing | ||
+ | ' | ||
+ | WScript.Sleep 2000 | ||
+ | Next | ||
+ | ' Le seguenti righe creano i nuovi utenti | ||
+ | For Each Elem in HashLdap.Keys | ||
+ | Set objUser = GetObject(" | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | Next | ||
+ | End If | ||
+ | oConn.close | ||
+ | set wshshell = nothing | ||
+ | objConnection.Close | ||
+ | MyFile.Close | ||
+ | if (contatore> | ||
+ | text="" | ||
+ | Set fil=fso.OpenTextFile(FileName, | ||
+ | If fil.AtEndOfStream Then | ||
+ | text = "" | ||
+ | Else | ||
+ | text = fil.ReadAll | ||
+ | End If | ||
+ | fil.Close | ||
+ | Set objEmail = CreateObject(" | ||
+ | objEmail.From = indirizzo_mittente | ||
+ | objEmail.To = indirizzo_destinatario | ||
+ | objEmail.Subject = " | ||
+ | objEmail.Textbody = text | ||
+ | objEmail.Configuration.Fields.Item _ | ||
+ | (" | ||
+ | objEmail.Configuration.Fields.Item _ | ||
+ | (" | ||
+ | nome_server | ||
+ | objEmail.Configuration.Fields.Item _ | ||
+ | (" | ||
+ | objEmail.Configuration.Fields.Update | ||
+ | objEmail.Send | ||
+ | End If | ||
+ | wscript.Quit | ||
+ | |||
+ | |||
+ | **IMPORTANTE: | ||
+ | |||
+ | **IMPORTANTE: | ||
+ | |||
+ | 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 --> | ||
+ | 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, | ||
+ | * 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: | ||
+ | * Verificare l' | ||
+ | * Verificare l' | ||
+ | * Creazione di nuovi account su Active Directory. Gli elementi dell' | ||
+ | **IMPORTANTE: | ||
+ | |||
+ | **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, | ||
+ | * 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 ' | ||
+ | |||
+ | 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' | ||
+ | |||
+ | **Vantaggi: | ||
+ | * Sincronizzazione continua tra dati locali e quelli remoti; | ||
+ | * Gestione centralizzata delle informazioni, | ||
+ | * Possibilita' | ||
+ | * Facolta' | ||
+ | |||
+ | 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" | ||
+ | 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' | ||
+ | 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> | ||
+ | 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' | ||
+ | |||
+ | ===== 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 | ||
+ | " | ||
+ | | ||
+ | | ||
+ | |||
+ | * 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 | ||
+ | " | ||
+ | Lo share condiviso a cui applicare la quota | ||
+ | | ||
+ | | ||
+ | |||
+ | |||
+ | 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' | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== 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' | ||
+ | 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' | ||
+ | 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' | ||
+ | * 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 " | ||
+ | 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 " | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||