Поиск по сайту:

Делегирование сценариев PowerShell с помощью Just Enough Administration (JEA)


Вы когда-нибудь хотели делегировать задачу, но обнаруживали, что раздавать необходимые разрешения может быть слишком рискованно? Или вы хотели заблокировать такие вещи, как создание групп в AD, чтобы обеспечить соблюдение соглашений об именах групп?

JEA может помочь вам и в этом, и во многом другом. В этой статье мы рассмотрим, как делегировать уже созданные сценарии с помощью PowerShell 5.1.

Что такое ЯЭА?

JEA — это решение PowerShell от Microsoft, которое может ограничить пользователей (и администраторов) выполнением определенных задач только в определенном сеансе PowerShell, даже если им требуется локальный администратор для указанного ресурса. Кроме того, вы можете быть предельно конкретными. Могут быть выполнены только указанные вами команды, вы можете включить только определенные значения параметров и значения параметров, соответствующие определенному шаблону.

Например, вы можете разрешить Servicedesk перезапускать только определенную службу с помощью Restart-Service или добавлять группы в AD только в соответствии с определенным соглашением об именах. Вы можете делать все это, не давая им явных разрешений на сервере или в AD. Это инструмент, который может сэкономить вам огромное количество времени и защитить вашу среду. Давайте начнем с превращения нашего скрипта в функцию.

Шаг 1: Создание функции из вашего скрипта

Первым шагом, если вы еще этого не сделали, является создание функции из вашего скрипта. Это довольно просто, если вы уже настроили параметры. Ниже я обернул свой простой скрипт New-FolderAndShare в функцию:

Function New-FolderAndShare {
    [cmdletbinding()]
    param(
        # Name of the share
        [parameter(Mandatory)]
        [ValidatePattern("^(Project d{5}|Team (Finance|HR|IT|Multi) [a-z ]+)$")]
        [string]$ShareName,

        # Directory of the new share folder locally
        [parameter(Mandatory)]
        [ValidatePattern("^(D|E|F):\Shares\$")]
        [string]$Path,

        # Who to have full access
        [parameter(Mandatory)]
        [ValidateSet("^CONTOSO\")]
        [string]$FullAccess

    )

        $FullPath = Join-Path $Path $ShareName
    New-Item -ItemType Directory -Path $FullPath
    New-SmbShare -Path $FullPath -Name $ShareName -FullAccess $FullAccess

}

Вы проверяете параметры с помощью ValidatePattern в функции, но если бы это было частью модуля, вы могли бы проверить это в файле RoleCapabilities вместо VisibleFunctions.

Превращение скрипта в функцию дает нам больший контроль над тем, какие параметры разрешены в JEA, и упрощает экспорт.

Шаг 2. Создание ролевых возможностей

Файл RoleCapabilities решает, что разрешено делать указанной роли (определяемой на следующем шаге). Это включает в себя, какие команды им разрешено запускать, какие параметры они могут использовать и какие модули импортировать.

Хотя RoleCapabilities можно создать вручную, рекомендуется использовать команду New-PSRoleCapabilityFile, встроенную в PowerShell 5.1. Также в этот файл вы загрузите функцию, которую мы создали на предыдущем шаге.

Следующий сценарий создает файл с именем FileShareCreator.psrc и добавляет функцию New-FolderAndShare (которую необходимо загрузить в текущий сеанс):

# RUN THIS IN THE SERVER THAT WILL BE THE JEA ENDPOINT

$RoleCapabilitiesParam = @{
    # Define a function that will be available in the cmdlet
    FunctionDefinitions = @{ 
        Name = 'New-FolderAndShare'
                # Import the code of the function
        ScriptBlock =  [ScriptBlock]::Create(
            (Get-Command New-FolderAndShare).Definition
        )
    }

    # Modules used in the function needs to be explicity imported
    ModulesToImport = @(
        "SmbShare",
        "Microsoft.PowerShell.Management"
    )
    Path = ".FileShareCreator.psrc"
}

New-PSRoleCapabilityFile @RoleCapabilitiesParam

Используйте Get-Command, чтобы получить функцию в параметре FunctionDefinitions. Вы также можете добавить необработанный скрипт с параметрами.

Вы также указываете, как вам разрешено использовать функцию, в параметре VisibleCmdlet. Вы делаете это, указывая имя функции и ее параметры вместе с регулярным выражением.

Благодаря этому вы можете создать чрезвычайно детальный контроль того, что пользователь может и не может делать. Но есть одно предостережение, чтобы это работало — вам нужно добавить psrc-файл в модуль.

Шаг 3: Создание модуля для файла RoleCapability

Пришло время создать модуль, в который вы сможете вложить свои ролевые возможности. JEA находит RoleCapabilities по имени файла psrc без его расширения, поэтому избегайте дубликатов, если вы собираетесь создать дополнительные возможности роли позже.

Следующий сценарий представляет собой модифицированную версию того, что вы найдете в официальной документации JEA. Он создает новый модуль в каталоге модулей, создает необходимые файлы и папки и копирует в него файл psrc, созданный на шаге 2:

# RUN THIS IN THE SERVER THAT WILL BE THE JEA ENDPOINT

# Create a folder for the module
$modulePath = Join-Path $env:ProgramFiles "WindowsPowerShellModulesFileShareJEA"
New-Item -ItemType Directory -Path $modulePath

# Create an empty script module and module manifest.
# At least one file in the module folder must have the same name as the folder itself.
New-Item -ItemType File -Path (Join-Path $modulePath "FileShareJEA.psm1")
New-ModuleManifest -Path (Join-Path $modulePath "FileShareJEA.psd1") -RootModule "FileShareJEA.psm1"

# Create the RoleCapabilities folder and copy in the PSRC file
$rcFolder = Join-Path $modulePath "RoleCapabilities"
New-Item -ItemType Directory $rcFolder
Copy-Item -Path .FileShareCreator.psrc -Destination $rcFolder

Теперь вы создали возможность роли и функцию, чтобы использовать их в JEA. Теперь осталось создать конфигурацию сеанса PowerShell для сопоставления групп AD с ролями, которые вы только что создали.

Шаг 4: Определение ролей

На этом шаге вы создадите файл конфигурации сеанса PowerShell, который определяет, какие роли будут назначены, какие возможности (из файла .psrc, который мы создали на шаге 2).

Здесь вы также создадите группу AD и каталог расшифровки.

# Create directory to store logs
New-Item -ItemType Directory -Path 'C:ProgramDataJEAConfigurationTranscripts' -Force

# Create AD group (you might need to do it on another server)
New-ADGroup -Path "OU=Groups,DC=contoso,DC=com" -Name 'JEA_FILESHARE_CREATOR' -GroupScope DomainLocal

# RUN THIS IN THE SERVER THAT WILL BE THE JEA ENDPOINT

# Define parameters for New-PSSessionConfigurationFile
$PSSessionConfigurationParams = @{
    # Run as a temporary account
    RunAsVirtualAccount = $True

    # That is a local administrator
    RunAsVirtualAccountGroups = @(
        "administrators"
    )

    # Path where to save log files of what connected users are doing
    TranscriptDirectory = 'C:ProgramDataJEAConfigurationTranscripts'

    # Map an active directory group to the capability we created
    RoleDefinitions = @{
        'CONTOSOJEA_FILESHARE_CREATOR' = @{
            RoleCapabilities = 'FileShareCreator'
        }
    }
        
        # Path of the PSSC file
    Path = ".SessionConfiguration.pssc"

}
# Create the PSSC file
New-PSSessionConfigurationFile @PSSessionConfigurationParams

Шаг 5: Создание сеанса PowerShell

На этом шаге вы прочтете файл SessionConfiguration.pssc, созданный на предыдущем шаге. Это позволяет участникам JEA_FILESHARE_CREATOR подключаться к серверу через PowerShell:

PS51> Register-PSSessionConfiguration -Path .SessionConfiguration.pssc -Name 'JEAFileShare' -Force

PSPath            : Microsoft.WSMan.ManagementWSMan::localhostPluginJEAFileShare
PSParentPath      : Microsoft.WSMan.ManagementWSMan::localhostPlugin
PSChildName       : JEAFileShare
PSDrive           : WSMan
PSProvider        : Microsoft.WSMan.ManagementWSMan
PSIsContainer     : True
Keys              : {Name=JEAFileShare}
Name              : JEAFileShare
TypeNameOfElement : Container
Type              : Container

Готово! Добавьте пользователя в JEA_FILESHARE_CREATOR, у которого нет доступа к серверу обычными средствами, и попробуйте его от имени этого пользователя, набрав:

PS51> Enter-PSSession -ComputerName fs02.contoso.com -ConfigurationName JEAFileShare
PS51> New-FolderAndShare -ShareName "Project 12345" -Path D:Share

Теперь вы можете запустить команду как временный локальный администратор, который заблокирован и может выполнять только несколько команд по умолчанию (видимых с помощью Get-Command во время сеанса) и New-FolderAndShare, которая добавлена в файл возможностей ролей.

Если вы хотите увидеть временно созданную учетную запись, добавьте VisibleExternalCommands @(c:windowssystem32whoami.exe) в параметры RoleCapabilities на шаге 2. Вы можете запустить whoami и увидеть имя локального администратора:

PS51 >whoami
winrm virtual userswinrm va_1_contoso_joe_helpdesk

Краткое содержание

Использование JEA может быть отличным и простым способом делегирования задач и защиты вашей среды. Сюда входят не только ваши собственные скрипты, но и встроенные модули, а также установленные модули. Несмотря на то, что JEA может принести большую пользу, будьте осторожны! Вы можете создать большой риск для своей среды, если делегируете неправильные команды или указываете неправильные параметры неожиданным лицам.

Хотите узнать больше?

  • Документация Microsoft по JEA
  • Начало работы с Just Enough Administration (JEA), Джейсон Хелмик [YouTube]