Teh Hermit
Trace: • выдача_прав_с_помощью_jea

Выдача прав с помощью 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}

Материалы по теме

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/

Microsoft, PowerShell, HYPER-V
Previous Next

Teh Hermit

Table of Contents

  

Microsoft

  Active Directory
  Active Directory Certificate Services
  Active Directory Federation Services
  BitLocker
  Terminal Services
  HYPER-V
  Exchange
  Internet Information Services (IIS)
  Storage Spaces Direct
  WSUS
  Windows Server
  Windows Server Core
  Windows
  Windows Admin Center
  Windows Backup
  Windows Firewall
  Windows 11
  Microsoft Office
  IPAM
  NPS и RADIUS
  Office Online
  Microsoft SQL Server
  Microsoft Endpoint Configuration Manager
  PowerShell
  KMS-активация

Unix-like

  Astra Linux
  Asterisk и FreePBX
  SQUID
  Debian
  CentOS
  Ubuntu Server + Desktop
  pfSense
  PostgreSQL
  SSH
  OpenSSL
  Zabbix

  

Hardware

  Keychron
  WakeOnLan
  Серверы HP
  Серверы SNR
  Настройка планшетов Handheld

  

Networking

  Cisco
  D-Link
  Mikrotik
  Keenetic
  Samsung

  

Other

  1С
  Docker
  DokuWiki
  Ghost Blog
  GoodbyeDPI
  Graylog
  VMWare
  ProxMox
  PrivateBin
  Outline VPN
  Wireguard
  Российская криптография
  Р-Виртуализация
  Kaspersky
  FileZilla ftp-сервер
  SecureCRT
  Soti MobiControl
  SysInternals
  VeraCrypt
  Non-Sucking Service Manager
  NMAP

     

DevOps

  Git
  Gitlab