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}} |