Archive

Archive for luglio 2015

Modificare le ACL di una folder

Uno degli argomenti che richiedono più attenzione è la gestione delle ACL delle cartelle (spesso condivise).

image

Molti sono abituati a gestire la sicurezza delle cartelle usando l’interfaccia grafica, spesso ci si limita ad assegnare permessi standard, pochi click di mouse ed il gioco è fatto!

Ma…se non avessimo la possibilità di usare l’interfaccia grafica, come potremmo fare? PowerShell è sicuramente una valida soluzione!!!

image

A differenza di altri aspetti dei sistemi operativi Microsoft Windows, PowerShell mette a disposizione solo due cmdlets per la gestione dei permessi:

  • Get-Acl : legge i descrittori di sicurezza di una risorsa, per esempio cartelle o registry.
  • Set-Acl : modifica i descrittori di sicurezza di una risorsa.
  • Entrambi i cmdlets possono lavorare sulle cartelle, ma anche sul registro di sistema od oggetti di Active Directory. Questo ci permette di sfruttare un singolo metodo per accedere, e modificare, le ACL.

Un esempio semplice di utilizzo è sicuramente la “clonazione” dei permessi tra due cartelle; per ottenere questo risultato è sufficiente concatenare i due cmdlets con una pipe. Innanzi tutto ci servono le risorse… Usando due cartelle, Dati con i permessi che abbiamo impostato secondo le nostre necessità e Dati2 con i permessi standard, possiamo indagare i descrittori di protezione impostati:

Get-Acl C:\Dati, C:\Dati2 | FL

image

Ora possiamo provare a clonare i permessi. è sufficiente, come detto pocanzi, utilizzare entrambi i cmdlets concatenandoli:

Get-Acl ‘C:\Dati’ | Set-Acl ‘C:\Dati2’

image

Rieseguendo l’indagine dei permessi osserveremo che ora sono identici. Certamente questo metodo è comodo quando dobbiamo impostare una nuova cartella di destinazione per i nostri files e vorremmo mantenere le impostazioni di sicurezza.

Per impostare ex-novo i descrittori di protezione, invece, è necessario introdurre anche degli oggetti/tipi di .NET:

  • System.Security.AccessControl.FileSystemRights
  • System.Security.AccessControl.InheritanceFlags
  • System.Security.AccessControl.FileSystemAccessRule
  • System.Security.AccessControl.PropagationFlags
  • System.Security.AccessControl.AccessControlType
  • System.Security.Principal
  • Rimandando ai link gli approfondimenti dei singoli oggetti/tipi, li riassumo brevemente. FileSystemRights ci permette di indicare il tipo di permesso che vogliamo assegnare (lettura, scrittura…); InheritanceFlags ci consente d’impostare il livello di ereditarietà della risorsa su cui stiamo lavorando; FileSysteAccessRule è la classe mediante la quale andremo ad applicare i permessi dell’account/gruppo; PropagationFlags ci permette d’indicare come si dovrà propagare il permesso in elaborazione sugli oggetti figlio; AccessControlType indica il tipo di permesso (concessione o negazione); Principal ci permette di specificare l’account/gruppo a cui vogliamo concedere i permessi.

    Facciamo qualche esempio per semplificare l’utilizzo.
    Esempio 1
    Ammettiamo di aver creato nel volume ‘C:\’ la cartella ‘PoSh’ ed al suo interno aver creato lo script ‘Test1.ps1’. Vogliamo assegnare all’utente ‘User1’ i permessi di lettura e scrittura. Sfruttando i tipi e gli oggetti di .NET andremo ad impostare, singolarmente, le caratteristiche del privilegio che vogliamo assegnare all’utente; nello specifico i privilegi sono "Read, Write", non vengono ereditati dal contenitore padre e non vengono propagati, sono privilegi di “Allow” (quindi concessione), verranno concessi all’NTAccount. Mediante l’oggetto ACE assembliamo il permesso che andremo ad assegnare col metodo AddAccessRule dell’oggetto ACL ed andremo poi ad applicare l’ACL alla risorsa file di nostro interesse.

    New-Item –Path “C:\PoShTest” -ItemType Directory –Force
    New-Item –Path “C:\PoShTest\Test.ps1” –ItemType File –Force

    $FileSystemRights = [System.Security.AccessControl.FileSystemRights]"Read, Write"

    $InheritanceFlag = [System.Security.AccessControl.InheritanceFlags]::None
    $PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None

    $AccessControl = [System.Security.AccessControl.AccessControlType]::Allow

    $SecPrincipal = New-Object System.Security.Principal.NTAccount("Domain\User1")

    $ACE = New-Object System.Security.AccessControl.FileSystemAccessRule `
        ($SecPrincipal, $FileSystemRights, $InheritanceFlag, $PropagationFlag, $AccessControl)

    $ACL = Get-ACL "C:\PoShTest\Test.ps1"
    $ACL.AddAccessRule($ACE)

    Set-ACL "C:\PoShTest\Test.ps1" $ACL

Esempio 2

Ammettiamo di voler predisporre una cartella nella quale collocare delle sottocartelle protette, accessibili a tutti gli utenti ad eccezione che uno. Creando le cartelle i permessi vengono ereditati quindi, se non sono state applicate ulteriori variazioni ai permessi, avremo le impostazioni standard per le quali tutti gli utenti possono almeno leggere. Variando le impostazioni del flag di ereditarietà ed il privilegio d’accesso riusciremo ad ottenere il risultato desiderato. Va ricordato che esplicitare una negazione d’accesso esplicita per un account utente ha precedenza rispetto ad altri potenziali permessi impostati a gruppi di cui quell’account è membro, per cui prestate attenzione!

New-Item –Path “C:\PoShTest” -ItemType Directory
New-Item –Path “C:\PoShTest\Riservata” -ItemType Directory

$FileSystemRights = [System.Security.AccessControl.FileSystemRights]"Full control"

$InheritanceFlag = [System.Security.AccessControl.InheritanceFlags]"ContainerInherit,ObjectInherit"
$PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None

$AccessControl = [System.Security.AccessControl.AccessControlType]::Deny

$SecPrincipal = New-Object System.Security.Principal.NTAccount("Domain\User1")

$ACE = New-Object System.Security.AccessControl.FileSystemAccessRule `
    ($SecPrincipal, $FileSystemRights, $InheritanceFlag, $PropagationFlag, $AccessControl)

$ACL = Get-ACL "C:\PoShTest\Riservata"
$ACL.AddAccessRule($ACE)

Set-ACL "C:\PoShTest\Riservata" $ACL

Esempio 3

Se volessimo interrompere l’ereditarietà per assegnare permessi tutti nostri? Dovremo sfruttare il metodo SetAccessRuleProtection dell’oggetto ACL su cui stiamo lavorando. Questo metodo ha sue parametri; il primo, isProtected, ci permette di stabilire se desideriamo o meno mantenere l’ereditarietà; il secondo, preserveInheritance, stabilisce se riportare o meno i permessi al blocco dell’ereditarietà. Entrambi i parametri sono booleani, impostandoli entrambi a $true l’ereditarietà verrà interrotta ed i permessi esistenti copiati; il primo a $true ed il secondo impostato a $false, l’ereditarietà verrà interrotta ed i permessi rimossi; il primo a $false ci permetterà di ripristinare l’ereditarietà.

New-Item –Path “C:\PoShTest” -ItemType Directory –Force
New-Item –Path “C:\PoShTest\Riservata” –ItemType Directory –Force

$ACL = Get-Acl “C:\PoShTest\Riservata”
$ACL.SetAccessRuleProtection($true, $true)
Set-Acl “C:\PoShTest\Riservata” $ACL

Questi sono tre esempi, a mio avviso significativi, su come si possano impostare i permessi a cartelle e files. L’interazione con .NET rende il lavoro un poco più semplice e la tipizzazione dei parametri aiuta molto a prevenire errori. Preparando gli opportuni script sarà molto più semplice gestire la creazione di cartelle risorsa per i documenti aziendali!

Buono scripting a tutti Sorriso

Windows 10 build 10240 o Windows 10 RTM? Inizia la nuova esperienza!

Ieri mi sono trovato in download un aggiornamento corposo, non la solita build di preview… Dopo l’installazione ho notato che non c’erano più i riferimenti alla versione della build, e nelle proprietà di sistema era comparso il logo…Win10-PoSh

Direi proprio che è arrivato Windows 10!!!!!! Sorriso

%d blogger hanno fatto clic su Mi Piace per questo: