Delega dello script PowerShell con Just Enough Administration (JEA)

Contenuti

Logo Powershell

Hai mai desiderato delegare un compito, ma ha scoperto che i permessi necessari potrebbero essere troppo rischiosi da distribuire? O hai voluto bloccare cose come la creazione di gruppi in AD per imporre convenzioni di denominazione per i gruppi??

JEA può aiutarti con questo e molto altro. In questo post, vedremo come puoi delegare i tuoi script già creati con PowerShell 5.1.

Cos'è JEA?

JEA è una soluzione Microsoft PowerShell che può limitare gli utenti (e amministratori) in modo che possano eseguire solo attività specifiche in una specifica sessione di PowerShell, anche se richiedono un amministratore locale su detta risorsa. Allo stesso tempo, può essere estremamente specifico. Solo i comandi specificati possono essere eseguiti, puoi abilitare solo valori di parametro specifici e valori di parametro che corrispondono a un modello specifico.

Come esempio, puoi abilitare Servicedesk per riavviare solo un servizio specifico con Restart-Service, o semplicemente aggiungi gruppi ad AD in base a una convenzione di denominazione specifica. Puoi fare tutto questo senza dare loro autorizzazioni esplicite su un server o in AD. È uno strumento che può farti risparmiare un'enorme quantità di tempo e proteggere il tuo ambiente. Iniziamo avvolgendo il nostro script in una funzione.

passo 1: creare una funzione dal tuo script

Il primo passo, se non l'hai ancora fatto, è creare una funzione dal tuo script. Questo è piuttosto semplice, supponendo che tu abbia già il tuo parameters impostare. Prossimo, Ho avvolto il mio semplice script “Nuova cartella e condividi” in una funzione:

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

}

Convalidare i parametri con Convalida modello in funzione, ma se questo fosse parte di un modulo, potresti farlo nel file RoleCapabilities invece con Funzioni visibili.

Rendere lo script una funzione ci dà un maggiore controllo dei parametri consentiti in JEA e facilita l'esportazione.

passo 2: costruzione di capacità di ruolo

Il file RoleCapabilities decide cosa può fare un ruolo specifico (definito nel passaggio successivo). Questo include quali comandi possono eseguire, quali parametri possono usare e quali moduli importare.

Sebbene RoleCapabilities possa essere creato manualmente, si consiglia di utilizzare il New-PSRoleCapabilityFile Comando integrato di PowerShell 5.1. È anche in questo file che verrà caricato nella funzione che abbiamo creato nel passaggio precedente.

Il seguente script crea un file chiamato FileShareCreator.psrc e aggiungi il New-FolderAndShare funzione (che dovrebbe essere caricato nella sessione corrente):

# 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

Usare Get-Command per trovare la funzione in FunctionDefinitions-parametro. Inoltre puoi aggiungere lo script non elaborato con i parametri.

Specifica anche come sei abilitato a utilizzare la funzione nel VisibleCmdlet parametro. Per questo, specificare il nome della funzione e i suoi parametri insieme a un'espressione regolare.

Con questo, puoi creare un controllo estremamente granulare di ciò che un utente può e non può fare. Ma c'è un avvertimento per farlo funzionare: devi aggiungere il file psrc in un modulo.

passo 3: creazione di un modulo per il file RoleCapability

È ora di creare un modulo in cui puoi mettere le tue capacità di ruolo. JEA trova le capacità del ruolo in base al nome dei file psrc senza la loro estensione, quindi evita i duplicati se crei più funzionalità di ruolo in un secondo momento.

Il seguente script è una versione modificata di ciò che trovi nel Documentazione ufficiale JEA. Crea un nuovo modulo nella directory del modulo, creare i file e le cartelle necessari e copiare il file psrc file che hai creato nel passaggio 2 a:

# 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

Ora hai creato una funzionalità di ruolo e un ruolo da utilizzare in JEA. Ciò che resta da fare ora è creare una configurazione di sessione PowerShell per allocare i gruppi AD ai ruoli appena creati.

passo 4: Definizione di ruoli

In questo passaggio, creerà un file di configurazione della sessione PowerShell che stabilisce quali ruoli verranno assegnati a quali funzionalità (dal.psrc file che abbiamo creato nel passaggio 2).

Qui creerai anche il gruppo AD e la directory delle trascrizioni.

# 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

passo 5: creare una sessione PowerShell

In questo passaggio, leggerà nel SessionConfiguration.pssc file che hai creato nel passaggio precedente. Ciò consente ai membri di JEA_FILESHARE_CREATOR per connettersi tramite PowerShell al server:

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

Pronto! Aggiungi un utente a JEA_FILESHARE_CREATOR che non hai accesso al server con mezzi normali e provalo come quell'utente digitando:

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

Ora puoi eseguire il comando come amministratore locale temporaneo che è bloccato e abilitato solo per eseguire alcuni comandi predefiniti (visibile con Get-Command durante la sessione) e il New-FolderAndShare funzione aggiunta nel file delle funzioni delle funzioni.

Se vuoi vedere l'account che è stato creato temporaneamente, Inserisci VisibleExternalCommands @('c:windowssystem32whoami.exe') ai parametri RoleCapabilities nel passaggio 2. Puoi eseguire whoami e vedere il nome dell'amministratore locale:

PS51 >whoami
winrm virtual userswinrm va_1_contoso_joe_helpdesk

Riepilogo

L'utilizzo di JEA può essere un modo straordinario e semplice per delegare compiti e proteggere il tuo ambiente. Questo non include solo i tuoi script, ma anche i moduli integrati e i moduli installati. Anche se JEA può essere un grande valore aggiunto, stai attento! Puoi creare un grande rischio per il tuo ambiente se deleghi i comandi sbagliati o specifichi i parametri sbagliati a persone impreviste.

Vuoi saperne di più?

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.