Puppeteers Blog

Windowsin paikallisten ryhmäkäytäntöjen muokkaus Puppetilla

April 10, 2016 

Monia Windowsien asetuksia on perinteisesti muokattu ryhmäkäytänteillä ("Group Policy"). Vaikka ryhmäkäytänteiden teho onkin melko rajallinen, pystyy niillä tekemään yhtä ja toista. Microsoft on kuitenkin Powershell DSC:n kuitenkin siirtymässä tilan hallintaan perustuviin modernimpiin ratkaisuja, joten Group Policyt jäänevät lähivuosina historiaan.

Tästä huolimatta ryhmäkäytänteitä hyödynnetään yhä erityisesti Active Directory -toimialueiden ("domain") kanssa silloin, kun halutaan standardisoida työasemien asetuksia. Myös Samba 4 tukee ryhmäkäytänteiden jakelua työasemille. Ryhmäkäytänteet eivät kuitenkaan vaadi Active Directoryn tai Samba 4:n käyttöä, sillä käytänteitä voidaan määrittää paitsi verkkoalueelle, myös paikallisesti ("Local Group Policy"). Käytänteet voidaan lisäksi jakaa käyttäjäkohtaisiin ("User policy") ja tietokonekohtaisiin ("Machine policy").

Windows 7:ssa paikalliset ryhmäkäytänteet säilötään kahdessa tiedostossa:

  1. C:WindowsSystem32GroupPolicyUserRegistry.pol ("User Policy")
  2. C:WindowsSystem32GroupPolicyMachineRegistry.pol ("Machine Policy")

Nämä tiedostot ovat - yllättävää kyllä - yksinkertaisia yhden rivin tekstitiedostoja. Alla esimerkki UserRegistry.pol -tiedostosta, joka jaettu selvyyden vuoksi usealle riville:

PReg
 
 [SoftwareMicrosoftWindowsCurrentVersionPoliciesActiveDesktop;NoChangingWallPaper;;;]
 
 [SoftwareMicrosoftWindowsCurrentVersionPoliciesSystem;Wallpaper;;F;c:background.jpg]
 
 [SoftwareMicrosoftWindowsCurrentVersionPoliciesSystem;WallpaperStyle;;;4]
 
 [SoftwarePoliciesMicrosoftWindowsControl PanelDesktop;ScreenSaveActive;;;1]

Kukin käytänne määrittää jonkin rekisteriavaimen sisällön, joten periaatteessa lienee mahdollista muokata rekisteriavaimien arvoja myös suoraan esim. puppetlabs/registry-moduulilla. Registry.pol -tiedoston hakemiston nimi (Machine tai User) määrää sen, sijoitetaanko rekisteriavain HKEY_LOCAL_MACHINE vai HKEY_CURRENT_USER -haaraan.

Registry.pol -tiedoston syntaksi on hyvin määritelty, joten sen muokkaaminen käsin tai Puppetilla on helpohkoa. Jokainen käytänne on eroteltu hakasulkein ja sillä on 1-5 parametria:

[key;value;type;size;data]

Kuten yltä näkyy, usein riittää, että key, value ja data on määritelty. Päällä/pois -tyyppisissä käytänteissä vaikuttaa riittävän se, että key ja value on määritetty.

Paikallisia ryhmäkäytänteitä muokataan normaalisti gpedit.msc -ohjelmalla (ohjeita), jolla voidaan varmistua siitä, että Registry.pol -tiedoston sisältö ja syntaksi on kunnossa. Tiedoston sisältö muuttuu sitä mukaa, kun gpedit.msc:llä lisätään, muutetaan tai poistetaan käytänteitä. Mikäli muutoksia tehdään muulla kuin gpedit.msc:llä, pitää ne ottaa käyttöön gpupdate.exe -ohjelmalla:

> gpupdate.exe /force

Valmiin Registry.pol -tiedoston jakelu onnistuu yksinkertaisimmillaan File-resurssilla:

file { 'local-group-policy':
 ensure => 'present',
 name => 'C:WindowsSystem32GroupPolicyUserRegistry.pol',
 source => 'puppet:///modules/windesktop/Registry.pol',
 }

Tässä lähestymistavassa policy-tiedostojen ylläpito muuttuu helposti työlääksi, sillä pienikin muutos vaatii täysin uuden tiedoston luomisen. Jos käytänteet ovat identtisiä tai lähes identtisiä joka koneella, ei tästä ole juuri haittaa.

Skaalautuvampi lähestymistapa olisi muokata Registry.pol-tiedoston yksittäisiä käytänteitä. Käytänteiden määrittämiseen on olemassa oma Puppet-moduulikin, cannonps/local_group_policy, josta PuppetLabs paikutti aikoinaan kovastikin henkseleitä. Moduulin sisältämässä providerissa on kuitenkin lukuisia ongelmia:

  • Se ei toimi lokalisoidussa, esim. suomenkielisessä Windowsissa, koska se tekee naiiveja oletuksia C:WindowsPolicyDefinitions -hakemiston rakenteesta.
  • Registry.pol-tiedoston polku on virheellinen
  • Se vaikuttaa halvaantuvan, jos Registry.pol-tiedosto on tyhjä
  • Toteutustapa on todella monimutkainen: se lukee XML-tiedostopareista GPO-objektien määritteet (.admx) sekä käännökset (.adml) ja linkittää niiden sisältämän datan yhteen. Tavoitteena lienee ollut se, että resurssien määrittelyistä tulisi helpommin luettavan näköisiä, sillä mitään muuta selitystä tälle monimutkaisuudelle on vaikea löytää.
  • Moduulilla ei ole ollut ylläpitäjää kahteen vuoteen

Aloitin jo moduulin korjaamisen, mutta onneksi tajusin jättää homman (melko) ajoissa kesken huomattuani miten yksinkertainen Registry.pol -tiedoston syntaksi on.

Toistaiseksi päätin jaella staattisen Registry.pol -tiedoston käsin tarvittaville koneille. Myöhemmin tarkoituksena on kirjoittaa huomattavasti local_group_policy -moduulia yksinkertaisempi provider, joka muokkaa Registry.pol -tiedoston sisältöä suoraan.

Samuli Seppänen
Samuli Seppänen
Author archive
menucross-circle