Выдача прав с помощью JEA
В ОС Windows возможно выдавать права на запуск отдельных командлетов с помощью концепции, которая называется Just Enough Administration (JEA).
В данном примере мы рассмотрим - как делегировать права пользователю на управлениями машинами HYPER-V, не делая его ни локальным администратором, ни администратором HYPER-V. Все действия и редактируемые файлы находятся на одном локальном компьютере. Пользователь, которого ограничиваем - сможет подключаться к локальной сессии и выполнить заданный администратором набор команд, даже если для этих команд требуются привилегии админа.
Можно ограничивать не только команды, но и их параметры.
Приступим к настройке.
Сначала нам необходимо создать файл сессии. Сделаем это следующей командой:
New-PSSessionConfigurationFile -Path 'C:\Program Files\WindowsPowerShell\hpv_manage.pssc'
Теперь нужно отредактировать файл сессии hpv_manage.pssc.
В типе сессии выбираем: RestrictedRemoteServer. Эта опция создаст минимальное окружение доступных комманд. Если этого не сделать - комманды PS, без которых трудно работать в окружении, придется вручную перечислять в конфигурационном файле (*.psrc), который мы будем редактировать дальше.
Также, устанавливаем параметр TranscriptDirectory. В директории, заданной в параметре - будет храниться информация о конкретных действиях пользователей в рамках их сессий.
Устанавливаем опцию RunAsVirtualAccount. В этом случае команды будут выполняться под виртуализированным аккаунтом с привилегиями администратора, что нам и требуется.
В опции RoleDefinitions мы задаем имя группы (локального компьютера или Active Directory) и название роли JEA, которую мы сконфигурируем далее.
Название роли здесь должно точно соответствовать имени файла ролей JEA (не hpv_manage.pssc, а hyperv-power.psrc)
Файл hpv_manage.pssc в нашем случае будет выглядеть следующим образом:
@{ # Version number of the schema used for this document SchemaVersion = '2.0.0.0' # ID used to uniquely identify this document GUID = 'cabe6d8b-7204-672b-a135-f200b090fd44' # Author of this document Author = 'admin' # Description of the functionality provided by these settings # Description = '' # Session type defaults to apply for this session configuration. Can be 'RestrictedRemoteServer' (recommended), 'Empty', or 'Default' SessionType = 'RestrictedRemoteServer' # Directory to place session transcripts for this session configuration TranscriptDirectory = 'C:\PS\JEA_logs' # Whether to run this session configuration as the machine's (virtual) administrator account RunAsVirtualAccount = $true # Scripts to run when applied to a session # ScriptsToProcess = 'C:\ConfigData\InitScript1.ps1', 'C:\ConfigData\InitScript2.ps1' # User roles (security groups), and the role capabilities that should be applied to them when applied to a session RoleDefinitions = @{'.\Пользователи' = @{ RoleCapabilities = 'hyperv-power'}} }
Отсутствие ошибок в файле сессии можно проверить таким командлетом:
Test-PSSessionConfigurationFile -Path 'C:\Program Files\WindowsPowerShell\hpv_manage.pssc'
Теперь нам нужно создать каталог, который будет содержать конфигурационные файлы JEA:
New-Item -Path 'C:\Program Files\WindowsPowerShell\Modules\JEA\RoleCapabilities ' -ItemType Directory
Папка, содержащая конфигурации, всегда должна называться
RoleCapabilities
После того, как папка создана - самое время создать файл конфигурации ролей JEA, который и будет задавать - какие именно командлеты и модули можно использовать.
New-PSRoleCapabilityFile -Path 'C:\Program files\WindowsPowerShell\Modules\JEA\RoleCapabilities\hyperv-power.psrc'
Отредактируем этот файл, поправив следующие директивы.
VisibleCmdlets - задает какие, собственно, командлеты и с какими параметрами можно использовать. В данном примере мы разрешаем командлеты, связанные с управлением HYPER-V.
ModulesToImport - в данном случае нам требуется подключить в сессию модуль HYPER-V, т.к. без него перечисленные командлеты вообще не будут запущены.
Пример файла hyperv-power.psrc, в котором разрешается управление HYPER-V:
@{ # ID used to uniquely identify this document GUID = '4f5a61b7-ed51-4475-9abb-f520ca32f813' # Author of this document Author = 'sad22' # Description of the functionality provided by these settings # Description = '' # Company associated with this document CompanyName = 'Unknown' # Copyright statement for this document Copyright = '(c) sad22. All rights reserved.' # Modules to import when applied to a session ModulesToImport = 'Hyper-V' # Aliases to make visible when applied to a session # VisibleAliases = 'Item1', 'Item2' # Cmdlets to make visible when applied to a session VisibleCmdlets = @('Start-VM', 'Stop-VM', 'Get-VM', 'Get-Command', 'Restart-VM', 'Suspend-VM', 'Resume-VM') # Functions to make visible when applied to a session # VisibleFunctions = 'Invoke-Function1', @{ Name = 'Invoke-Function2'; Parameters = @{ Name = 'Parameter1'; ValidateSet = 'Item1', 'Item2' }, @{ Name = 'Parameter2'; ValidatePattern = 'L*' } } # External commands (scripts and applications) to make visible when applied to a session # VisibleExternalCommands = 'Item1', 'Item2' # Providers to make visible when applied to a session # VisibleProviders = 'Item1', 'Item2' # Scripts to run when applied to a session # ScriptsToProcess = 'C:\ConfigData\InitScript1.ps1', 'C:\ConfigData\InitScript2.ps1' # Aliases to be defined when applied to a session # AliasDefinitions = @{ Name = 'Alias1'; Value = 'Invoke-Alias1'}, @{ Name = 'Alias2'; Value = 'Invoke-Alias2'} # Functions to define when applied to a session # FunctionDefinitions = @{ Name = 'MyFunction'; ScriptBlock = { param($MyInput) $MyInput } } # Variables to define when applied to a session # VariableDefinitions = @{ Name = 'Variable1'; Value = { 'Dynamic' + 'InitialValue' } }, @{ Name = 'Variable2'; Value = 'StaticInitialValue' } # Environment variables to define when applied to a session # EnvironmentVariables = @{ Variable1 = 'Value1'; Variable2 = 'Value2' } # Type files (.ps1xml) to load when applied to a session # TypesToProcess = 'C:\ConfigData\MyTypes.ps1xml', 'C:\ConfigData\OtherTypes.ps1xml' # Format files (.ps1xml) to load when applied to a session # FormatsToProcess = 'C:\ConfigData\MyFormats.ps1xml', 'C:\ConfigData\OtherFormats.ps1xml' # Assemblies to load when applied to a session # AssembliesToLoad = 'System.Web', 'System.OtherAssembly, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' }
После правки файла, нам нужно зарегистрировать конфигурацию:
Register-PSSessionConfiguration –Name hyperv-power -Path 'C:\Program Files\WindowsPowerShell\hpv_manage.pssc'
На всякий случай перезапускаем службу WinRM
Restart-Service WinRM
Убрать созданную регистрацию конфигурации можно следующей командой:
UnRegister-PSSessionConfiguration –Name hyperv-power
После перезапуска службы WinRM - пользователь, с ограниченными правами, входящий в группу, которую мы указали в файле hpv_manage.pssc - может войти в созданную сессию командой с указанием конфигурации:
Enter-PSSession -ComputerName localhost -ConfigurationName hyperv-power
Если он выполнит get-command, то получит вот такой список:
CommandType Name Version Source ----------- ---- ------- ------ Function Clear-Host Function Exit-PSSession Function Get-Command Function Get-FormatData Function Get-Help Function Measure-Object Function Out-Default Function Select-Object Cmdlet Get-Command 7.2.11.500 Microsoft.PowerShell.Core Cmdlet Get-VM 2.0.0.0 Hyper-V Cmdlet Restart-VM 2.0.0.0 Hyper-V Cmdlet Resume-VM 2.0.0.0 Hyper-V Cmdlet Start-VM 2.0.0.0 Hyper-V Cmdlet Stop-VM 2.0.0.0 Hyper-V Cmdlet Suspend-VM 2.0.0.0 Hyper-V
Как видим, пользователю доступны командлеты, позволяющие управлять виртуальными машинами хоста, но создавать или удалять он их не может.
Если нам требуется запстить определенное действие одной командой (без интерактивной сесии), то можно использовать Invoke-Command. Например, такой командой можно посмотреть статус виртуальных машин:
Invoke-Command -ComputerName localhost -ConfigurationName hyperv-power -ScriptBlock {get-vm}