Délégation de script PowerShell avec Just Enough Administration (JEA)

Contenu

Logo Powershell

Avez-vous déjà eu envie de déléguer une tâche, mais a constaté que les permis nécessaires peuvent être trop risqués à distribuer? Ou avez-vous voulu bloquer des choses comme la création de groupes dans AD pour appliquer les conventions de dénomination des groupes?

JEA peut vous aider avec cela et bien plus encore. Dans ce billet, nous verrons comment vous pouvez déléguer vos scripts déjà créés avec PowerShell 5.1.

Qu'est-ce que la JEA?

JEA est une solution Microsoft PowerShell qui peut restreindre les utilisateurs (et administrateurs) ils ne peuvent donc effectuer que des tâches spécifiques dans une session PowerShell spécifique, même s'ils nécessitent un administrateur local sur ladite ressource. En même temps, peut être extrêmement précis. Seules les commandes que vous spécifiez peuvent être exécutées, vous ne pouvez activer que des valeurs de paramètres spécifiques et des valeurs de paramètres qui correspondent à un modèle spécifique.

Par exemple, vous pouvez autoriser Servicedesk à redémarrer uniquement un service spécifique avec Restart-Service, ou simplement ajouter des groupes à AD selon une convention de nommage spécifique. Vous pouvez faire tout cela sans leur donner d'autorisations explicites sur un serveur ou dans AD. C'est un outil qui peut vous faire gagner énormément de temps et protéger votre environnement. Commençons par envelopper notre script dans une fonction.

Paso 1: créer une fonction à partir de votre script

Le premier pas, si tu ne l'as pas encore fait, est de créer une fonction à partir de votre script. C'est assez simple, en supposant que vous avez déjà votre parameters d'installation. Ensuite, J'ai encapsulé mon script simple “New-FolderAndShare” dans une fonction:

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

}

Validez les paramètres avec ValidatePattern en fonction, mais si cela faisait partie d'un module, vous pouvez le faire dans le fichier RoleCapabilities à la place avec Fonctions visibles.

Faire du script une fonction nous donne un meilleur contrôle des paramètres autorisés dans JEA et facilite l'export.

Paso 2: renforcement des capacités renforcement des rôles

Le fichier RoleCapabilities décide ce qu'un rôle spécifique est autorisé à faire (défini à l'étape suivante). Cela inclut les commandes qu'ils peuvent exécuter, quels paramètres peuvent-ils utiliser et quels modules importer.

Bien que RoleCapabilities puisse être créé manuellement, il est recommandé d'utiliser le New-PSRoleCapabilityFile Commande intégrée PowerShell 5.1. C'est aussi dans ce fichier qu'il se chargera dans la fonction que nous avons créée à l'étape précédente.

Le script suivant crée un fichier appelé FileShareCreator.psrc et ajoutez le New-FolderAndShare fonction (qui doit être chargé dans la session en cours):

# 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

Utiliser Get-Command pour trouver la fonction dans le FunctionDefinitions-paramètre. De plus, vous pouvez ajouter le script brut avec des paramètres.

Il spécifie également comment vous êtes autorisé à utiliser la fonction dans le VisibleCmdlet paramètre. Pour ca, spécifier le nom de la fonction et ses paramètres ainsi qu'une expression régulière.

Avec ça, vous pouvez créer un contrôle extrêmement granulaire de ce qu'un utilisateur peut et ne peut pas faire. Mais il y a une mise en garde pour que cela fonctionne: vous devez ajouter un fichier psrc dans un module.

Paso 3: création d'un module pour le fichier RoleCapability

Il est temps de créer un module dans lequel vous pouvez mettre vos capacités de rôle. JEA trouve les capacités de rôle par le nom des fichiers psrc sans leur extension, évitez donc les doublons si vous créez plus de capacités de rôle plus tard.

Le script suivant est une version modifiée de ce que vous trouvez dans le Documentation officielle JEA. Créer un nouveau module dans le répertoire du module, créer les fichiers et dossiers nécessaires et copier le psrc fichier que vous avez créé à l'étape 2 dans le:

# 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

Vous avez maintenant créé une capacité de rôle et un rôle à utiliser dans JEA. Il ne reste plus qu'à créer une configuration de session PowerShell pour allouer des groupes AD aux rôles que vous venez de créer.

Paso 4: Définition des rôles

Dans cette étape, créera un fichier de configuration de session PowerShell qui établit quels rôles seront attribués quelles capacités (depuis le.psrc fichier que nous avons créé à l'étape 2).

Ici, vous allez également créer le groupe AD et le répertoire des transcriptions.

# 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: créer une session PowerShell

Dans cette étape, lira dans le SessionConfiguration.pssc fichier que vous avez créé à l'étape précédente. Cela permet aux membres de JEA_FILESHARE_CREATOR se connecter via PowerShell au serveur:

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

Prêt! Ajouter un utilisateur à JEA_FILESHARE_CREATOR que vous n'avez pas accès au serveur par des moyens normaux et testez-le en tant qu'utilisateur en tapant:

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

Vous pouvez maintenant exécuter la commande en tant qu'administrateur local temporaire qui est verrouillé et uniquement autorisé à exécuter certaines commandes par défaut (visible avec Get-Command pendant la séance) et le New-FolderAndShare fonction ajoutée dans le fichier de fonctions de fonctions.

Si vous voulez voir le compte qui a été créé temporairement, ajouter VisibleExternalCommands @('c:windowssystem32whoami.exe') à vos paramètres RoleCapabilities dans Step 2. Vous pouvez exécuter whoami et voir le nom de l'administrateur local:

PS51 >whoami
winrm virtual userswinrm va_1_contoso_joe_helpdesk

résumé

L'utilisation de JEA peut être un moyen étonnant et facile de déléguer des tâches et de protéger votre environnement. Cela n'inclut pas seulement vos propres scripts, mais aussi les modules intégrés et les modules installés. Même si JEA peut être une grande valeur ajoutée, faites attention! Vous pouvez créer un grand risque pour votre environnement si vous déléguez les mauvaises commandes ou spécifiez les mauvais paramètres à des personnes inattendues.

Vous voulez en savoir plus?

Abonnez-vous à notre newsletter

Nous ne vous enverrons pas de courrier SPAM. Nous le détestons autant que vous.