Главная

Sunday, 25 July 2021

PowerShell Just Enough Administration (JEA).

Всем привет.

Популярность PowerShell подстегнула Microsoft к поиску решения как же позволить пользователю выполнять определенные задачи администрирования, но без наличия лишних прав. Так появилась технология PowerShell JEA (Just Enough Admin).

Принцип работы: администратор создает специальный скрипт, в котором указывает набор задач, т.е. доступных пользователю командлетов и их параметров, а затем распространяет с помощью Windows PowerShell DSC. Пользователь, подключаясь к удаленной системе в сеансе PowerShell Remoting под своей обычной учетной записью, может вызвать любой из указанных командлетов или разрешенных приложений. При попытке выполнить любую другую команду получит ошибку. Если потребуется, прозрачно будут даны права локального администратора для выполнения конкретного командлета из разрешенного списка. Все действия регистрируются в журнале Microsoft-Windows-PowerShell/Operational. Информация о пользователе и специфичном RunSpaceID, производимом через JEA, регистрируется в файле C:\ProgramFiles\Jea\Activity\Activity.csv. Учетная запись администратора создается автоматически при развертывании конечной конфигурации (endpoint) JEA, генерируются случайный пароль и имя в формате JSA-*, и она может использоваться только с JEA. Судя по номеру текущей версии, 0.2.16.6 технология еще находится в процессе активной разработки, и в будущем могут появиться новые возможности. C другой стороны уже пять лет как версия пакета не менялась, значит в Microsoft пересматривают концепцию. Поэтому рассмотрим то что имеем на сегодня.

Для установки JEA войдите в соответствующий DSC-сервер в качестве локального(или доменного) администратора, откройте PowerShell и инсталируйте модуль JEA:

Install-Module xJEA

После его установки можете убедиться в наличии JEA так:

Find-Module –Name xJEA | fl

Теперь, когда мы обладаем установленным модулем JEA, наш следующий шаг состоит в  подготовке необходимой среды для применения JEA. Это можно осуществить при помощи сценария, который поступает с самим модулем JEA. Он располагается в C:\Program Files\WindowsPowerShell\Modules\xJea\0.2.16.6\Examples\SetupJEA.ps1.

Сценарий SetupJEA выполнит следующее:

-удалит все имеющиеся конечные точки с данного компьютера

-настроит имеющегося DSC LCM (Local Configuration Manager, Диспетчера локальных настроек) принять изменения и далее выполнять проверку каждые 30 минут чтобы убеждаться в том, что нет изменений данной настройки

-включить необходимый режим отладки

C:\Program Files\WindowsPowerShell\Modules\xJea\0.2.16.6\Examples\SetupJEA.ps1.

Configuration SetupJea

    {

      Import-DscResource -module xjea Node localhost

      {

        xJeaEndPoint CleanAll

        {

          Name     = 'CleanALL'

          CleanAll = $true

        }

        LocalConfigurationManager

        {

          RefreshFrequencyMins = 30

          ConfigurationMode    = "ApplyAndAutoCorrect"

          DebugMode            = "ForceModuleImport"  

          #This disables provider caching

        }

      }

    }

    SetupJea -OutputPath C:\JeaDemo

    Set-DscLocalConfigurationManager -Path C:\JeaDemo -Verbose

    Start-DscConfiguration -Path c:\JeaDemo -Wait -Verbose

Период RefreshFrequencyMins в полчаса уменьшить невозможно поэтому для применения настроек используем вызов Update-DscConfiguration.

JEA также поставляется с тремя демонстрационными настройками конечных точек, которыми можно пользоваться в качестве руководства для создания своей конечной точки. 

Эти демонстрационные файлы расположены в  C:\ProgramFiles\WindowsPowerShell\Modules\xJea\0.2.16.6\Examples, а также Demo1.ps1, который содержит следующее:

cls 

configuration Demo1

{

  Import-DscResource -module xjea

  xJeaToolKit Process

  {

    Name         = 'Process'

    CommandSpecs = @"Name,Parameter,ValidateSet,ValidatePattern Get-Process Get-Service Stop-Process,Name,calc;notepad Restart-Service,Name,,^A"@

  }

  xJeaEndPoint Demo1EP

  {

    Name                   = 'Demo1EP'

    Toolkit                = 'Process'

    SecurityDescriptorSddl = 'O:NSG:BAD:P(A;;GX;;;WD)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;;;WD)'                     

    DependsOn              = '[xJeaToolKit]Process'

  }

}

Demo1 -OutputPath C:\JeaDemo

Start-DscConfiguration -Path C:\JeaDemo -ComputerName localhost -Verbose -wait -debug -ErrorAction SilentlyContinue -ErrorVariable errors

if($errors | ? FullyQualifiedErrorId -ne 'HRESULT 0x803381fa')

{

    $errors | Write-Error    

}

start-sleep -Seconds 30 #Wait for WINRM to restart

$s = New-PSSession -cn . -ConfigurationName Demo1EP

Invoke-command $s {get-command} |out-string

Invoke-Command $s {get-command stop-process -Syntax}

# Enter-pssession $s

Remove-PSSession $s

Что касается настроек такой конечной точки, то пользователям разрешается применять лишь такие cmdlet:

Get-Process

Get-Service

Stop-Process,Name,calc;notepad

Restart-Service,Name,^A

Наш предыдущий cmdlet Stop-Process может применяться только для закрытия калькулятора или блокнота. Однако он также позволяет вам применять без ограничений Restart-Service, Get-Process и Get-Service.

Для развёртывания этой конечной точки мы можем применить .\Demo1.ps1.

После успешного выполнения мы можем проверить настройку полученного нового сеанса PowerShell:

Get-PSSessionConfiguration | Where {($_.Name -like "Demo*")}

Имеем:

Name          : Demo1EP

PSVersion     : 5.1

startupscript : C:\Program Files\Jea\StartupScript\Initialize-Demo1.ps1

RunAsUser     : JSA-Demo1

Permission    : Все AccessAllowed

 

Следующий этап состоит в полключении к новой конечной точке. Это можно сделать при помощи такой команды:

Enter-PSSession –ComputerName localhost –ConfigurationName Demo1EP

Get-LocalUser 

Get-LocalGroupMember -Group "Administrators"


Другой пример Demo3.ps1 предоставляет свою конечную точку для управления файловой системой и навигации по ней:

configuration Demo3

{

  Import-DscResource -module xjea


  xJeaToolKit FileSystem

  {

    Name = 'FileSystem'

    CommandSpecs = @"Module,name,Parameter,ValidateSet,ValidatePattern Get-ChildItem,Get-Item,Copy-Item,Move-Item,Rename-Item,Remove-Item,Copy-ItemProperty,Clear-ItemProperty,Move-ItemProperty,New-ItemProperty,Remove-ItemProperty,Rename-ItemProperty,Set-ItemProperty,Get-Location,Pop-Location,Push-Location,Set-Location,Convert-Path,Join-Path,Resolve-Path,Split-Path,Test-Path,Get-PSDrive,New-PSDrive, out-file "@

    Ensure = 'Present' 

  }

  xJeaEndPoint Demo3EP

  {

     Name = 'Demo3EP'

     ToolKit = 'FileSystem'

     Ensure = 'Present'

     DependsOn = '[xJeaToolKit]FileSystem'

  }

}

Demo3 -OutputPath C:\JeaDemo

Start-DscConfiguration -Path C:\JeaDemo -ComputerName localhost -Verbose ` -wait -debug -ErrorAction SilentlyContinue -ErrorVariable errors

if($errors | ? FullyQualifiedErrorId -ne 'HRESULT 0x803381fa')

{

 $errors | Write-Error 

}


start-sleep -Seconds 30 #Wait for WINRM to restart


# This endpoint allows you to navigate the filesystem but not see 

# the CONTENTS of any of the files

$s = New-PSSession -cn . -ConfigurationName Demo3EP

Invoke-command $s {dir 'C:\Program Files\Jea\Activity\ActivityLog.csv'} 

Invoke-Command $s {get-content 'C:\Program Files\Jea\Activity\ActivityLog.csv'}

# Enter-pssession $s


Remove-PSSession $s


Что можно добавить из личного опыта? При первом подключении 

Enter-PSSession -ComputerName srv01.forza.com -ConfigurationName Demo4x

JEA поразила меня сообщением:

Get-Service: Не удается найти службу с именем службы "WinRM".

C:\Program Files\Jea\Util\Initialize-Toolkit.ps1:9 знак:10

Решить эту проблему оказалось просто - в файле Initialize-Toolkit.ps1 комментируем строку $winrm = Get-Service WinRM. Переменная $winrm нигде далее не используется.

Также следует проверить доступ к файлу C:\Program Files\Jea\Activity\ActivityLog.csv 

или перевести его размещение в другое место правкой в Initialize-Toolkit.ps1, например:

$Logfile = "C:\JeaDemo\Logs\ActivityLog.csv"

Для вашего удобства набор CommandSpecs можно вычитывать из внешнего файла:

xJeaToolKit Process

{

CommandSpecs = Get-Content "C:\JeaDemo\commands.csv" -Raw

applications = "ping"

}


Где файл commands.csv содержит блок:

Name,Parameter,ValidateSet,ValidatePattern

Get-Process

Get-Service

Stop-Process,Name,calc;notepad

Restart-Service,Name,,^A


Увы, но в переменную applications вы не сможете вставить более одной команды, и она не выносится во внешний файл.  Если я не прав, то мне это не удалось сделать.

А теперь внимание - оказывается JEA можно использовать и по другому, без DSC.

Администратор создает на сервере конфигурационный PSSC-файл сессии PowerShell и конфигурационный PSRC-файл с описанием роли пользователя.  На основе этих файлов создается точка подключения JEA (endpoint), к которой может подключиться пользователь и выполнить в этой сессию любую из доступных ему команд или программ. Также в сети можно найти специальное приложение JEA Toolkit Helper, генерирующее уже готовые настройки JEA именно для второго варианта. Более подробно описано здесь. Единственное неудобство как для меня, то конфиги нужно будет создавать (или размещать) ручками на каждом сервере, которыми планируется управлять с помощью JEA.

Что интересно что оба способа сейчас работают. Может быть это переходной период?

Успехов.


No comments:

Post a Comment

А что вы думаете по этому поводу?