| Both sides previous revisionPrevious revisionNext revision | Previous revision |
| выдача_прав_с_помощью_jea [2023/06/23 12:39] – jp | выдача_прав_с_помощью_jea [2025/02/11 09:16] (current) – jp |
|---|
| ===== Выдача прав с помощью JEA ===== | ===== Выдача прав с помощью JEA ===== |
| |
| В ОС Windows возможно выдавать права на запуск отдельных командлетов с помощью концепции, которая называется //Just Enough Administration (JEA)//. В данном примере мы рассмотрим - как делегировать права пользователю на управлениями машинами HYPER-V, не делая его ни локальным администратором, ни администратором HYPER-V. | В ОС Windows возможно выдавать права на запуск отдельных командлетов с помощью концепции, которая называется **//Just Enough Administration (JEA)//**. |
| |
| Пользователь сможет подключаться к локальной сессии и выполнить ограниченный администратором набор команд, даже если для этих команд требуются привилегии админа. | В данном примере мы рассмотрим - как делегировать права пользователю на управлениями машинами HYPER-V, не делая его ни локальным администратором, ни администратором HYPER-V. Все действия и редактируемые файлы находятся на одном локальном компьютере. Пользователь, которого ограничиваем - сможет подключаться к локальной сессии и выполнить заданный администратором набор команд, даже если для этих команд требуются привилегии админа. |
| | |
| | //Можно ограничивать не только команды, но и их **параметры**.// |
| | |
| | Приступим к настройке. |
| |
| Сначала нам необходимо создать файл сессии. Сделаем это следующей командой: | Сначала нам необходимо создать файл сессии. Сделаем это следующей командой: |
| Теперь нужно отредактировать файл сессии //hpv_manage.pssc//. | Теперь нужно отредактировать файл сессии //hpv_manage.pssc//. |
| |
| В типе сессии выбираем **//RestrictedRemoteServer//**. Эта опция создаст минимальное окружение доступных комманд. Если этого не сделать - комманды PS, без которых трудно работать в окружении - придется вручную перечислять в конфигурационном файле, который мы будем редактировать дальше. | В типе сессии выбираем: **//RestrictedRemoteServer//**. Эта опция создаст минимальное окружение доступных комманд. Если этого не сделать - комманды PS, без которых трудно работать в окружении, придется вручную перечислять в конфигурационном файле (*.psrc), который мы будем редактировать дальше. |
| |
| Также, устанавливаем параметр //**TranscriptDirectory**//. В директории, заданной в параметре - будет храниться информация о конкретных действиях пользователей в рамках их сессий. | Также, устанавливаем параметр //**TranscriptDirectory**//. В директории, заданной в параметре - будет храниться информация о конкретных действиях пользователей в рамках их сессий. |
| |
| Устанавливаем опцию //**RunAsVirtualAccount**//. В этом случае команды будут выполняться под виртуализированныйм аккаунтом с привилегиями администратора, что нам и требуется. | Устанавливаем опцию //**RunAsVirtualAccount**//. В этом случае команды будут выполняться под виртуализированным аккаунтом с привилегиями администратора, что нам и требуется. |
| |
| В опции //**RoleDefinitions**// мы задаем имя группы (локального компьютера или Active Directory) и название роли JEA, которую мы сконфигурируем далее. | В опции //**RoleDefinitions**// мы задаем имя группы (локального компьютера или Active Directory) и название роли JEA, которую мы сконфигурируем далее. |
| |
| :!: //Название роли здесь должно точно соответствовать имени файла ролей JEA (не hpv_manage.pssc)// | :!: //Название роли здесь должно точно соответствовать имени файла ролей JEA (не hpv_manage.pssc, а hyperv-power.psrc)// |
| |
| Файл //hpv_manage.pssc// в нашем случае будет выглядеть следующим образом: | Файл //hpv_manage.pssc// в нашем случае будет выглядеть следующим образом: |
| Отсутствие ошибок в файле сессии можно проверить таким командлетом: | Отсутствие ошибок в файле сессии можно проверить таким командлетом: |
| |
| Test-PSSessionConfigurationFile -Path 'C:\Program Files\WindowsPowerShell\dc_manage.pssc' | Test-PSSessionConfigurationFile -Path 'C:\Program Files\WindowsPowerShell\hpv_manage.pssc' |
| Теперь нам нужно создать каталог, который будет содержать конфигурационные файлы JEA: | Теперь нам нужно создать каталог, который будет содержать конфигурационные файлы JEA: |
| |
| New-Item -Path 'C:\Program Files\WindowsPowerShell\Modules\JEA\RoleCapabilities ' -ItemType Directory | New-Item -Path 'C:\Program Files\WindowsPowerShell\Modules\JEA\RoleCapabilities ' -ItemType Directory |
| :!: Папка, содержащая конфигурации всегда должна называться ''RoleCapabilities'' | :!: Папка, содержащая конфигурации, всегда должна называться ''RoleCapabilities'' |
| {{tag>Microsoft PowerShell HYPER-V}} | |
| |
| | После того, как папка создана - самое время создать файл конфигурации ролей JEA, который и будет задавать - какие именно командлеты и модули можно использовать. |
| | <WRAP prewrap> |
| | <code> |
| | New-PSRoleCapabilityFile -Path 'C:\Program files\WindowsPowerShell\Modules\JEA\RoleCapabilities\hyperv-power.psrc' |
| | </code> |
| | </WRAP> |
| |
| | Отредактируем этот файл, поправив следующие директивы. |
| | |
| | //**VisibleCmdlets**// - задает какие, собственно, командлеты и с какими параметрами можно использовать. В данном примере мы разрешаем командлеты, связанные с управлением HYPER-V. |
| | |
| | //**ModulesToImport**// - в данном случае нам требуется подключить в сессию модуль HYPER-V, т.к. без него перечисленные командлеты вообще не будут запущены. |
| | |
| | Пример файла //hyperv-power.psrc//, в котором разрешается управление HYPER-V: |
| | <WRAP prewrap> |
| | <code> |
| | @{ |
| | |
| | # 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' |
| | } |
| | </code> |
| | </WRAP> |
| | |
| | После правки файла, нам нужно зарегистрировать конфигурацию: |
| | |
| | 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//, то получит вот такой список: |
| | |
| | <code> |
| | 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 |
| | </code> |
| | |
| | Как видим, пользователю доступны командлеты, позволяющие управлять виртуальными машинами хоста, но создавать или удалять он их не может. |
| | |
| | Если нам требуется запстить определенное действие одной командой (без интерактивной сесии), то можно использовать //Invoke-Command//. Например, такой командой можно посмотреть статус виртуальных машин: |
| | |
| | Invoke-Command -ComputerName localhost -ConfigurationName hyperv-power -ScriptBlock {get-vm} |
| | === Материалы по теме === |
| | |
| | https://winitpro.ru/index.php/2020/09/29/powershell-just-enough-administration-jea-delegirovaniye-admin-prav-polzovatelyam/ \\ |
| | https://4sysops.com/archives/just-enough-administration-jea-part-2-an-example/ \\ |
| | https://secops.one/2019/11/05/hyper-v-just-enough-administration-jea/ |
| | {{tag>Microsoft PowerShell HYPER-V}} |