Sécuriser une session de communication à distance PowerShell restreinte

Il existe des scénarios où vous souhaitez héberger une session PowerShell qui, pour des raisons de sécurité, a été limité à un sous-ensemble de commandes PowerShell.

Par définition, une session restreinte est celle où l’utilisation de Import-Module n’est pas autorisée. Il peut y avoir d’autres limitations, mais il s’agit de l’exigence principale. Si l’utilisateur peut importer un module, il peut exécuter tout ce qu’il souhaite.

Voici quelques exemples de sessions restreintes :

  • Just-Enough-Administration (JEA)
  • Implémentations de communication à distance restreinte personnalisées telles que les modules Exchange et Teams

Pour la plupart des administrateurs système, JEA offre la meilleure expérience pour créer des sessions restreintes et doit être votre premier choix. Pour plus d’informations sur JEA, consultez la vue d’ensemble de JEA.

Recommandations pour les implémentations de session personnalisées

Si votre scénario nécessite une implémentation personnalisée, vous devez suivre ces recommandations.

Limiter l’utilisation et les fonctionnalités des fournisseurs PowerShell

Passez en revue la façon dont les fournisseurs autorisés sont utilisés pour vous assurer que vous ne créez pas de vulnérabilités dans votre implémentation de session restreinte.

Avertissement

N’autorisez pas le fournisseur FileSystem . Si les utilisateurs peuvent écrire dans une partie du système de fichiers, il est possible de contourner complètement la sécurité.

N’autorisez pas le fournisseur de certificats . Une fois le fournisseur activé, un utilisateur peut accéder aux clés privées stockées.

N’autorisez pas les commandes qui peuvent créer de nouveaux espaces d’exécution

Avertissement

La fonctionnalité de compatibilité Windows dans PowerShell 7 crée un espace d’exécution pour héberger Windows PowerShell. N’autorisez aucune commande qui s’exécuterait via la fonctionnalité de compatibilité Windows. Les *-Job applets de commande peuvent créer de nouveaux espaces d’exécution sans les restrictions.

N’autorisez pas l’applet Trace-Command de commande.

Avertissement

L'utilisation de Trace-Command regroupe toutes les commandes tracées dans la session.

Ne créez pas vos propres implémentations de proxy pour les commandes restreintes

PowerShell a un ensemble de commandes proxy pour les scénarios de commande restreint. Ces commandes proxy garantissent que les paramètres d’entrée ne peuvent pas compromettre la sécurité de la session. Les commandes suivantes ont des proxys restreints :

  • Exit-PSSession
  • Get-Command
  • Get-FormatData
  • Get-Help
  • Measure-Object
  • Out-Default
  • Select-Object

Si vous créez votre propre implémentation de ces commandes, vous pouvez autoriser par inadvertance les utilisateurs à exécuter du code interdit par les commandes proxy JEA.

Vous pouvez exécuter la commande suivante pour obtenir la liste des commandes restreintes :

$commands = [System.Management.Automation.CommandMetadata]::GetRestrictedCommands(
    [System.Management.Automation.SessionCapabilities]::RemoteServer
)

Vous pouvez examiner les commandes de proxy restreintes à l’aide de la commande suivante :

$commands = [System.Management.Automation.CommandMetadata]::GetRestrictedCommands(
    [System.Management.Automation.SessionCapabilities]::RemoteServer
)
$getHelpProxyBlock = [System.Management.Automation.ProxyCommand]::Create($commands['Get-Help'])

Configurer la session pour utiliser le mode NoLanguage

Le mode PowerShell désactive complètement le langage de script PowerShell NoLanguage . Vous ne pouvez pas exécuter des scripts ou utiliser des variables. Vous pouvez uniquement exécuter des commandes natives et des cmdlets.

Pour plus d’informations sur les modes linguistiques, consultez about_Language_Modes.

Ne pas autoriser l’utilisation du débogueur dans la session

Par défaut, le débogueur PowerShell exécute du code en FullLanguage mode. Définissez la propriété UseFullLanguageModeInDebugger dans SessionState sur false.

Pour plus d’informations, consultez UseFullLanguageModeInDebugger.