Delegação de script do PowerShell com Administração Just Enough (JEA)

Conteúdo

Logotipo de Powershell

Você já quis delegar uma tarefa, mas descobriu que as licenças necessárias podem ser muito arriscadas para distribuir? Ou você gostaria de bloquear coisas como a criação de grupos no AD para impor convenções de nomenclatura para grupos?

A JEA pode ajudá-lo com isso e muito mais. Neste post, veremos como você pode delegar seus scripts já criados com o PowerShell 5.1.

O que é JEA?

JEA é uma solução Microsoft PowerShell que pode restringir usuários (e administradores) então eles só podem executar tarefas específicas em uma sessão específica do PowerShell, mesmo que exijam um administrador local no referido recurso. Ao mesmo tempo, pode ser extremamente específico. Apenas os comandos que você especificar podem ser executados, você pode habilitar apenas valores de parâmetro específicos e valores de parâmetro que correspondem a um padrão específico.

Como um exemplo, você pode habilitar o Servicedesk para reiniciar apenas um serviço específico com Restart-Service, ou apenas adicione grupos ao AD de acordo com uma convenção de nomenclatura específica. Você pode fazer tudo isso sem dar a eles permissões explícitas em um servidor ou no AD. É uma ferramenta que pode economizar muito tempo e proteger seu meio ambiente. Vamos começar envolvendo nosso script em uma função.

Paso 1: criando uma função a partir do seu script

O primeiro passo, se você ainda não fez, é criar uma função a partir do seu script. Isso é muito simples, presumindo que você já tenha o seu parameters configurar. A seguir, Eu embrulhei meu script simples “New-FolderAndShare” em uma função:

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

}

Valide os parâmetros com ValidatePattern em função, mas se isso fosse parte de um módulo, você poderia fazer isso no arquivo RoleCapabilities em vez de Funções visíveis.

Tornar o script uma função nos dá maior controle dos parâmetros permitidos no JEA e facilita a exportação.

Paso 2: construção de capacidade de desenvolvimento de papéis

O arquivo RoleCapabilities decide o que uma função específica pode fazer (definido na próxima etapa). Isso inclui quais comandos eles podem executar, quais parâmetros eles podem usar e quais módulos importar.

Embora RoleCapabilities possam ser criados manualmente, é recomendado usar o New-PSRoleCapabilityFile Comando integrado do PowerShell 5.1. É também neste arquivo que ele irá carregar a função que criamos na etapa anterior.

O seguinte script cria um arquivo chamado FileShareCreator.psrc e adicione o New-FolderAndShare Função (que deve ser carregado na sessão atual):

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

$RoleCapabilitiesParam = @{
    # Establece 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

Usar Get-Command para encontrar a função no FunctionDefinitions-parâmetro. Além disso, você pode adicionar o script bruto com parâmetros.

Ele também especifica como você está habilitado para usar a função no VisibleCmdlet parâmetro. Para isto, especifique o nome da função e seus parâmetros junto com uma expressão regular.

Com isto, você pode criar um controle extremamente granular do que um usuário pode e não pode fazer. Mas há uma ressalva para fazer este trabalho: você precisa adicionar o arquivo psrc em um módulo.

Paso 3: criar um módulo para o arquivo RoleCapability

É hora de criar um módulo no qual você possa colocar os recursos de sua função. JEA encontra os recursos de função pelo nome dos arquivos psrc sem sua extensão, portanto, evite duplicatas se você estiver criando mais recursos de função posteriormente.

O script a seguir é uma versão modificada do que você encontra no Documentação oficial da JEA. Crie um novo módulo no diretório do módulo, crie os arquivos e pastas necessários e copie o psrc arquivo que você criou na etapa 2 no:

# 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

Agora você criou uma capacidade de função e uma função a ser usada no JEA. O que resta a ser feito agora é criar uma configuração de sessão do PowerShell para alocar grupos AD para as funções que você acabou de criar.

Paso 4: Definição de funções

Nesta etapa, criará um arquivo de configuração de sessão do PowerShell que estabelece quais funções serão atribuídas a quais recursos (desde o.psrc arquivo que criamos na etapa 2).

Aqui você também criará o grupo AD e o diretório de transcrições.

# 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

# Establece 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

Paso 5: criar uma sessão PowerShell

Nesta etapa, vai ler no SessionConfiguration.pssc arquivo que você criou na etapa anterior. Isso permite que membros de JEA_FILESHARE_CREATOR para se conectar via PowerShell ao servidor:

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

Preparar! Adicionar um usuário a JEA_FILESHARE_CREATOR que você não tem acesso ao servidor por meios normais e teste-o como aquele usuário digitando:

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

Agora você pode executar o comando como um administrador local temporário que está bloqueado e apenas habilitado para executar alguns comandos padrão (visível com Get-Command durante a sessão) e ele New-FolderAndShare função adicionada no arquivo de funções de funções.

Se você quiser ver a conta que foi criada temporariamente, adicionar VisibleExternalCommands @('c:windowssystem32whoami.exe') aos seus parâmetros RoleCapabilities na Etapa 2. Você pode executar whoami e ver o nome do administrador local:

PS51 >whoami
winrm virtual userswinrm va_1_contoso_joe_helpdesk

Resumo

Usar JEA pode ser uma maneira incrível e fácil de delegar tarefas e proteger seu ambiente. Isso não inclui apenas seus próprios scripts, mas também os módulos integrados e os módulos instalados. Mesmo que JEA possa ser um grande valor agregado, tenha cuidado! Você pode criar um grande risco para o seu ambiente se delegar os comandos errados ou especificar os parâmetros errados para pessoas inesperadas.

Quer saber mais?

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.