Zarządzanie uprawnieniami w Hyper-V Menedżerze

Wykorzystywanie przystawki Hyper-V Manager jest dość przydatne gdy nieposiadany specjalistycznego oprogramowania do zarządzania maszynami wirtualnymi. Niemniej jednak największą wadą tego rozwiązania jest konieczność uruchamiania przystawki z uprawnieniami administratora serwera Hyper-V. Niestety problemy rodzą się w sytuacji gdy na jednym serwerze posiadamy maszyny, którymi zarządzają osoby z poza grona głównych administratorów, np. deweloperzy mający dostęp tylko do maszyn na, których testują oprogramowanie. Domyślnie Hyper-V Manager nie posiada funkcjonalności przypisywania uprawnień do maszyn dla konkretnych użytkowników, co więc możemy w tej sytuacji zrobić ?? Możemy np. posłużyć się Menedżerem Autoryzacji (azman.msc) w celu przypisania odpowiednich uprawnień. Najlepiej gdy posiadamy środowisko oparte o usługę Active Directory niemniej jednak nie jest to wymagane dla tego rozwiązania i można sobie poradzić również w oparciu o użytkowników lokalnych. Ja skupię się jednak na rozwiązaniu wykorzystującym AD.

Tworzymy więc grupę użytkowników HyperVManagers na kontrolerze domeny oraz dodatkowo podgrupy:
• VMMDevAdm – Grupa deweloperów dla wybranych maszyn.
• Ewentualne inne grupy z innymi uprawnieniami lub dla innych grup maszyn…

dsadd group CN=HyperVManagers,CN=Users,DC=cds,DC=pol
dsadd group CN=VMMDevAdm,CN=Users,DC=ad,DC=cds,DC=pol
dsmod group CN=HyperVManagers,CN=Users,DC=cds,DC=pol /addmbr CN=VMMDevAdm,CN=Users,DC=cds,DC=pol

Zanim jednak przejdziemy do konfigurowania uprawnień konieczne jest odpowiednie skonfigurowanie serwera z rolą Hyper-V. Mianowicie musimy udostępnić zdalną administrację poprzez WMI:

netsh advfirewall firewall set rule group="Windows Management Instrumentation (WMI)" new enable=yes

Dodajemy główną grupę HyperVManagers do lokalnej grupy „Distributed COM Users” serwera Hyper-V:

net localgroup “Distributed COM Users” /add <konto użytkownika lub grupa> 
net localgroup "Distributed COM Users" /add cds\HyperVManagers

Następnie nadajemy uprawnienia zarządzania usługami Hyper-V poprzez WMI dla naszej grupy HyperVManagers. Do tego celu musimy dodać uprawnienia dla gałęzi root/CIMV2 oraz root/virtualization.

function get-sid
{
  PARAM ($USER)
  $NTAccount = new-object System.Security.Principal.NTAccount($USER)
  return $NTAccount.Translate( [System.Security.Principal.SecurityIdentifier] ).toString()
}

function setWMIPermissions
{
  PARAM ($SID, $COMPUTER, $NAMESPACE)
  $WMISDDLPartialMatch = "A;\w*;\w+;;;$SID"
  $WMISDDL = "A;CINP;CCWP;;;$SID"
  
  #odczyt obecnych ustawien zabezpieczen  
  $security = Get-WmiObject -ComputerName $COMPUTER -Namespace $NAMESPACE -Class __SystemSecurity
  $binarySD = @($null)
  $result = $security.PsBase.InvokeMethod("GetSD",$binarySD)
  $converter = new-object system.management.ManagementClass Win32_SecurityDescriptorHelper
  $CurrentWMISDDL = $converter.BinarySDToSDDL($binarySD[0])
  
  #sprawdzenie czy uzytkownik juz jest na liscie 
  if (($CurrentWMISDDL.SDDL -match $WMISDDLPartialMatch) -and ($CurrentWMISDDL.SDDL -notmatch $WMISDDL))
  {
   $NewWMISDDL = $CurrentWMISDDL.SDDL -replace $WMISDDLPartialMatch, $WMISDDL
  }
  else
  {
   $NewWMISDDL = $CurrentWMISDDL.SDDL += "(" + $WMISDDL + ")"
  }
  
  #dopisz ustawienia zabezpieczen
  $WMIbinarySD = $converter.SDDLToBinarySD($NewWMISDDL)
  $WMIconvertedPermissions = ,$WMIbinarySD.BinarySD
  $security.PsBase.InvokeMethod("SetSD",$WMIconvertedPermissions)
} 

$group = "cds\HyperVManagers"
$coputer = "HyperTest"
$namespace1 = "root/CIMV2"
$namespace2 = "root/virtualization"

$sid = get-sid $group
setWMIPermissions $sid $coputer $namespace1   
setWMIPermissions $sid $coputer $namespace2

Kolejnym krokiem jest zmodyfikowanie pliku C:\ProgramData\Microsoft\Windows\Hyper-V\InitialStore.xml serwera Hyper-V. Normalnie dokonuje się to poprzez konsolę azman.msc, niemniej można tego również dokonać przy wykorzystaniu PowerShell’a oraz COMObject.

Ładujemy plik z konfiguracją uprawnień i otwieramy gałąź usługi Hyper-V :

$AZStore = new-object -COMObject AzRoles.AzAuthorizationStore
$AZStore.Initialize(2, "msxml://C:\ProgramData\Microsoft\Windows\Hyper-V\InitialStore.xml")
$HyperVApp = $AZStore.OpenApplication("Hyper-V Services")

W głównym zakresie tworzymy nową Definicję zadań i nadajemy jej uprawnienia tylko do odczytu konfiguracji usługi „Read Service Configuration”.

$HyperVApp.CreateTask("Hyper-V Manager Task")
$HyperVTask = $HyperVApp.OpenTask("Hyper-V Manager Task")
$HyperVTask.AddOperation("Read Service Configuration")
$HyperVTask.Submit()

Następnie przypisujemy tą definicję do nowo stworzonej Roli i wiążemy ją z grupą domenową HyperVManagers.

$sid_HyperVManagers = get-sid "cds\HyperVManagers"
$HyperVApp.CreateRole("Hyper-V Manager Role")
$HyperVRole = $HyperVApp.OpenRole("Hyper-V Manager Role")
$HyperVRole.AddTask("Hyper-V Manager Task")
$HyperVRole.AddMember($sid_HyperVManagers)
$HyperVRole.Submit()

Jest to konieczne, aby użytkownicy inni niż administratorzy mogli odczytać informacje odnośnie konfiguracji usługi.
W przypadku gdy chcemy nadać uprawnienia do wszystkich maszyn wystarczy operować uprawnieniami w głównym zakresie. Niemniej jednak gdy będziemy zawężać prawa do konkretnych maszyn musimy stworzyć nowy zakres np. Hyper-V Manager Scope1.

$HyperVApp.CreateScope("Hyper-V Manager Scope1")
$HyperVScope1 = $HyperVApp.OpenScope("Hyper-V Manager Scope1")
$HyperVScope1.Submit()

Następnie w nowo stworzonym zakresie tworzymy nową definicję zadań i przypisujemy jej interesujące nas operacje. Kombinacje przypisywanych uprawnień zależą tylko od potrzeb naszej wyobraźni. Listę dostępnych zadań możemy wygenerować przy użyciu:

$HyperVApp.Operations | Format-Table Name, Description

$HyperVScope1.CreateTask("Hyper-V Manager Scope1 Task")
$HyperVScope1Task = $HyperVScope1.OpenTask("Hyper-V Manager Scope1 Task")
$HyperVScope1Task.AddOperation("Read Service Configuration")
$HyperVScope1Task.AddOperation("View Virtual Machine Configuration")
$HyperVScope1Task.AddOperation("Pause and Restart Virtual Machine")
$HyperVScope1Task.AddOperation("Stop Virtual Machine")
$HyperVScope1Task.AddOperation("Allow Input to Virtual Machine")
$HyperVScope1Task.AddOperation("Allow Output from Virtual Machine")
$HyperVScope1Task.Submit()

Jak w przypadku zakresu głównego tak i tutaj tworzymy nową Rolę i wiążemy ją z grupą domenową VMMDevAdm.

$sid_VMMDevAdm = get-sid "cds\VMMDevAdm"
$HyperVScope1.CreateRole("Hyper-V Manager Scope1 Role")
$HyperVScope1Role = $HyperVScope1.OpenRole("Hyper-V Manager Scope1 Role")
$HyperVScope1Role.AddTask("Hyper-V Manager Scope1 Task")
$HyperVScope1Role.AddMember($sid_VMMDevAdm)
$HyperVScope1Role.Submit()

Ostatecznie przypisujemy maszyny wirtualne do konkretnego zakresu.

Function assignVM
{
PARAM ($VM_SCOPE,$VM_NAME) 
$VM_Service = get-wmiobject -namespace root\virtualization Msvm_VirtualSystemManagementService 
$ListofVMs =get-wmiobject -namespace root\virtualization Msvm_ComputerSystem -filter  "ElementName <> Name "  |   where { $_.ElementName -like $VM_NAME} 
 
foreach ($VM in $ListofVMs) { 
   if ($VM -ne $Null){ 
       $VMGlobalSetting = get-wmiobject -namespace root\virtualization Msvm_VirtualSystemGlobalSettingData | where  { $_.ElementName -like "*$($VM.ElementName)*" } 
       $VMGlobalSetting.ScopeOfResidence = $VM_SCOPE
       $VM_Service.ModifyVirtualSystem($VM.__PATH, $VMGlobalSetting.psbase.Gettext(1)) 
   } 
}
}

assignVM “Hyper-V Manager Scope1” "VM-Test1”

Tak spreparowana konfiguracja jest dość elastyczna w dalszej modyfikacji. Dzięki zastosowaniu grupy użytkowników HyperVManagers oraz kolejnych podgrup VMMDevAdm… pozwala nam na pominięcie każdorazowo przypisywania uprawnień do Sterowania usługą WMI oraz Read Service Configuration. Zezwolenie nowemu pracownikowi na dostęp do odpowiednich maszyn polega tylko na przypisywaniu do odpowiednich grup. Natomiast dodanie kolejnych grup maszyn będzie się wiązało z utworzeniem nowej podgrupy dla HyperVManagers, utworzeniem nowego zakresu i powiązaniem go z odpowiednimi maszynami.

Źródła:
http://msdn.microsoft.com/en-us/library/aa376327(v=VS.85).aspx
http://social.technet.microsoft.com/Forums/en-US/ilm2/thread/b85ccedc-68d8-4a8e-a4b3-f6ed952383a9
http://dungkhoang.spaces.live.com/blog/cns!31A50D02D661C816!269.entry
http://technet.microsoft.com/en-us/library/dd282980(WS.10).aspx

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s