Comment créer des outils PowerShell pour configurer SFTP

Lorsque vous utilisez plusieurs ordinateurs fonctionnant sous Windows, vous pouvez être amené à accéder à des ressources partagées à l’aide de différents protocoles. Lorsqu’un partage de fichiers est créé sur un ordinateur Windows, c’est généralement le protocole SMB qui est utilisé. Cependant, il est possible de partager des fichiers sur des ordinateurs non Windows par l’intermédiaire des protocoles NFS, FTP, SFTP, FTPS, SCP et d’autres encore. Si vous utilisez uniquement PowerShell, par exemple sur Windows Server sans interface graphique, la connexion au partage SFTP pour la première fois peut sembler difficile. Cet article de blog explique comment utiliser SFTP sous Windows avec PowerShell.

NAKIVO pour la sauvegarde sous Windows

NAKIVO pour la sauvegarde sous Windows

Sauvegarde rapide des serveurs et postes de travail Windows sur site, hors site et dans le cloud. Récupération complète des machines et des objets en quelques minutes pour des RTO réduits et une disponibilité maximale.

Qu’est-ce que le SFTP ?

SFTP signifie « SSH File Transfer Protocol » ou « Secure File Transfer Protocol ». Le SFTP est l’alternative sécurisée au protocole FTP (File Transfer Protocol) traditionnel, tout en offrant des fonctionnalités similaires. Le SFTP fonctionne au niveau de la couche application du modèle OSI (couche 7), utilise une connexion SSH et est particulièrement répandu sur les machines Linux, qui disposent généralement d’un client SFTP en ligne de commande intégré. Si vous utilisez Windows, installez un client SSH gratuit tel que WinSCP, qui dispose d’une interface graphique et prend en charge bien plus que le SFTP, ou configurez les outils PowerShell si vous devez utiliser la ligne de commande. Windows et PowerShell ne prennent pas en charge le SFTP de manière native ; il faudra donc installer des composants supplémentaires.

Lorsque vous utilisez une connexion SSH, les transferts de données sur le réseau sont chiffrés et la connexion est sécurisée, contrairement au protocole FTP traditionnel non chiffré où les données peuvent être interceptées par des pirates. SSH est utilisé pour l’authentification, et si vous disposez d’identifiants de connexion pour l’utilisateur Linux, vous pouvez accéder aux fichiers d’une machine Linux cible après avoir passé l’authentification depuis votre client SFTP en ligne de commande ou un client graphique. Il vous permet également de copier des fichiers depuis/vers une machine Linux distante vers votre machine locale Linux ou Windows. La configuration du serveur SFTP sous Linux n’est pas difficile : il suffit d’installer le serveur SSH, de créer des utilisateurs et d’accorder les autorisations nécessaires aux utilisateurs ainsi qu’aux fichiers et répertoires.

Ne confondez pas SFTP et FTPS. Ces deux protocoles sont utilisés à des fins similaires. Cependant, SFTP utilise un seul numéro de port pour la connexion, tandis que FTPS en utilise plusieurs pour les canaux de contrôle et de données (ce qui peut s’avérer plus difficile à configurer du point de vue de la sécurité, notamment au niveau des pare-feu). FTPS est le protocole FTP avec SSL (Secure Socket Layer). Je ne m’attarderai pas sur la configuration d’un serveur SFTP dans cet article. Pour en savoir plus sur l’installation et la configuration de Linux (y compris le serveur SSH) sur Hyper-V, consultez ici.

Installation du module Posh-SSH

Pour effectuer des opérations sur des fichiers (copie, suppression) sur des machines distantes par l’intermédiaire de SFTP et SCP dans PowerShell, vous devez installer le module Posh-SSH dans PowerShell. L’installation de ce module vous permet également d’exécuter des commandes à distance sur un ordinateur distant via une session SSH. Pour installer et utiliser Posh-SSH, il faut installer PowerShell 3.0 et .NET Framework 4.0. Vous pouvez donc installer ce module sous Windows 8 ou sur des versions plus récentes de Windows. Vous pouvez également mettre à jour manuellement PowerShell et .NET Framework sous Windows 7 SP1. Exécutez cette commande pour installer le module SFTP de PowerShell (Posh-SSH) : install-module posh-ssh

Posh PowerShell – installing the PowerShell SFTP module

Vous pouvez également utiliser cette commande pour installer le module Posh-SSH pour PowerShell :

iex (New-Object Net.WebClient).DownloadString("https://gist.github.com/darkoperator/6152630/raw/c67de4f7cd780ba367cccbc2593f38d18ce6df89/instposhsshdev")

Une connexion Internet est nécessaire pour installer Posh-SSH à l’aide des commandes ci-dessus. Dans mon cas, j’ai installé le module Posh-SSH dans PowerShell et je peux passer aux étapes de configuration suivantes.

Connexion à un hôte distant dans PowerShell

Dans cet article de blog, j’utilise un environnement composé d’un ordinateur Windows local et d’un ordinateur Linux distant, tous deux connectés au même réseau :

  • 192.168.101.210 est un ordinateur Windows local sur lequel est installé Windows 10 version 20H2
  • 192.168.101.209 est un ordinateur Linux distant sur lequel s’exécute le serveur SSH (SFTP)
  • user1 est le nom de l’utilisateur Linux

Ces adresses IP sont utilisées dans mes exemples. Saisissez vos adresses IP et vos identifiants de connexion dans les commandes et fichiers de configuration appropriés.

Vérifions notre partage SFTP en nous connectant au serveur Linux via SFTP par l’intermédiaire de WinSCP, le client SFTP gratuit pour Windows. La connexion à un serveur SFTP est très simple. Saisissez l’adresse IP de l’hôte cible, le numéro de port (TCP 22 est le port par défaut, mais vous pouvez configurer un serveur SSH pour qu’il utilise un numéro de port personnalisé), le nom d’utilisateur et le mot de passe pour vous connecter. N’oubliez pas de sélectionner le protocole SFTP.

How to use SFTP – connecting to a remote machine in WinSCP

La connexion SFTP fonctionne dans mon cas. Nous avons copié deux fichiers dans le dossier partagé (l’emplacement des fichiers est /home/user1/shared/ sur la machine Linux distante). Voyons comment se connecter au dossier partagé depuis Windows et comment utiliser SFTP avec Posh-SSH dans PowerShell.

How to use SFTP in Windows

Pour travailler avec des fichiers via SFTP, vous devez d’abord établir une session. Pour ce faire, exécutez cette commande dans PowerShell :

New-SFTPSession -Computername 192.168.101.209

La fenêtre d’authentification s’affiche après l’exécution de la commande. Saisissez un Nom d’utilisateur et un mot de passe pour accéder à la machine Linux distante contenant les fichiers auxquels vous devez accéder via SFTP. Si vous avez saisi les identifiants de connexion corrects, vous devriez voir s’afficher dans PowerShell les informations relatives au numéro de session SFTP, à l’adresse IP de l’hôte distant et au statut de la connexion. Une fois la session créée, un numéro d’index lui est attribué.

How to use SFTP in PowerShell – connecting to a server and creating a new session

Vous pouvez toujours saisir la commande « help » avec les arguments appropriés pour afficher une brève aide sur la syntaxe d’utilisation des commandes PowerShell :

help New-SFTPSession

Lister toutes les commandes PowerShell « posh » disponibles : Get-Command -Module Posh-SSH

ou

Get-command -Name * -module *posh-ssh

Voici la méthode pour créer une session SSH qui vous permet d’exécuter une commande sur un hôte distant, par exemple pour lister les fichiers d’un répertoire :

Import-Module Posh-SSH

$SSHSession = New-SSHSession -ComputerName 192.168.101.209 -Credential $(Get-Credential) -Verbose

$SSH = $SSHSession | New-SSHShellStream

Invoke-SSHCommand -Index 0 -Command "ls -l /home/user1/shared"

PowerShell SFTP – listing files in a directory of an SFTP server

Création d’un script PowerShell

Créons un script de test pour explorer les opérations de base que vous pouvez effectuer dans PowerShell lorsque vous travaillez avec des ressources SFTP. Il ne s’agit pas d’un script SFTP, mais d’un script PowerShell permettant de travailler avec SFTP. Ce script de test doit copier le fichier d’installation de .NET Framework depuis une machine Linux distante vers une machine Windows locale.

Créez un fichier de script test-PS.ps1 contenant le contenu affiché ci-dessous.

#Creating a folder to store files downloaded from the SFTP share

New-item -itemtype directory -force -path c:tempps

#Setting credentials for the user account

$password = ConvertTo-SecureString "My_Password000" -AsPlainText -Force

$creds = New-Object System.Management.Automation.PSCredential ("user1", $password)

#Establishing an SFTP session

$Session = New-SFTPSession -Computername 192.168.101.209 -credential $creds

#Downloading the .NET installer file by using the established SFTP session

Get-SFTPFile -SessionId $session.SessionID -RemoteFile /home/user1/shared/NetFrameworkNDP462.exe -LocalPath c:tempps

Ouvrez PowerShell sur une machine Windows, accédez au dossier où ce script de test est stocké, puis exécutez le script

.test-PS.ps1

Le fichier NetFrameworkNDP462.exe doit être copié depuis /home/user1/shared/ (sur une machine Linux distante) vers C:tempps (sur une machine Windows locale). Comme vous pouvez le voir sur la capture d’écran ci-dessous, le fichier a bien été copié dans mon cas.

PowerShell SFTP – copying a file from an SFTP server in PowerShell

Afin de lister les fichiers d’un répertoire de la ressource SFTP, vous pouvez créer un script PowerShell avec le contenu suivant :

$passwordTest = "Your_Password000"

$securePasswordTest = ConvertTo-SecureString $passwordTest -AsPlainText -Force

$credentialsTest = New-Object System.Management.Automation.PSCredential ("user1", $securePasswordTest)

$sessionTest = New-SFTPSession -ComputerName 192.168.101.209 -Credential $credentialsTest -AcceptKey

$sourceTest = "/home/user1/shared/"

$destinationTest= "c:tempps"

Get-SFTPChildItem -Recursive $sessionTest -Path $sourceTest | ForEach-Object{

   if ($_.Fullname -like '*.csv')

   {

      Get-SFTPFile $sessionTest -RemoteFile $_.FullName -LocalPath $destinationTest -Overwrite

   }

   write-output $_.FullName

}

Remove-SFTPSession $sessionTest -Verbose

Où :

Your_Password000 est le mot de passe du compte utilisateur utilisé pour se connecter via SSH au partage SFTP ;

user1 est le nom de l’utilisateur ;

192.168.101.209 est l’adresse IP de l’hôte distant auquel nous nous connectons pour accéder aux fichiers via SFTP.

Enregistrez le script sous le nom list-files.ps1 et exécutez-le dans PowerShell sur votre machine locale à partir du dossier dans lequel ce fichier de script est stocké.

.list-files.ps1

Prêtez attention au paramètre -Recursive défini dans le script de test. Sur la capture d’écran ci-dessous, vous pouvez voir les résultats obtenus en utilisant le paramètre -Recursive et sans ce paramètre.

How to use SFTP in PowerShell – checking contents of a directory on a remote server

L’un des inconvénients liés à l’exécution de scripts tels que ceux présentés dans les exemples ci-dessus est que les identifiants de connexion sont stockés en clair dans le script, ce qui n’est pas sécurisé. Un utilisateur capable d’ouvrir un script (même avec des autorisations en lecture seule) peut voir un mot de passe et l’utiliser pour obtenir un accès non autorisé.

Il existe une méthode permettant d’améliorer le niveau de sécurité et de stocker un mot de passe sous forme chiffrée dans un fichier. L’API Windows de protection des données est utilisée pour effectuer le chiffrement d’un mot de passe, auquel seul le compte utilisateur et l’ordinateur ayant servi à créer ce fichier de mots de passe peuvent accéder. (get-credential).password | ConvertFrom-SecureString | set-content "C:temppassword.txt"

How to use SFTP in PowerShell – saving an encrypted password to a file

Le mot de passe est alors enregistré sous forme chiffrée dans le fichier texte. Si quelqu’un consulte le contenu de ce fichier, le mot de passe n’apparaîtra pas en clair.

A password for an SFTP user account is encrypted and saved in the text file

Lorsque vous devez saisir le mot de passe, indiquez le fichier contenant le mot de passe chiffré ( C:temppassword.txt dans notre cas).

$password = Get-Content "C:temppassword.txt" | ConvertTo-SecureString

$credential = New-Object System.Management.Automation.PsCredential("user1",$password)

Cette méthode de définition d’un mot de passe est plus sûre. Vous pouvez modifier le script dans lequel vous avez défini le mot de passe. Au lieu d’ouvrir un script dans un éditeur de texte, vous pouvez cliquer avec le bouton droit sur le fichier ps1 et, dans le menu contextuel, cliquer sur Edit.

PowerShell SFTP automation – editing a script file

Windows PowerShell ISE s’ouvre. Il s’agit d’un outil natif de Windows qui met en couleur la syntaxe pour plus de commodité et affiche les commandes PowerShell disponibles dans le volet de droite.

SFTP script editing for running in PowerShell

Les commandes du script de test sont désormais les suivantes :

New-item -itemtype directory -force -path c:tempps

$password = Get-Content "C:temppassword.txt" | ConvertTo-SecureString

$creds = $credential = New-Object System.Management.Automation.PsCredential("user1",$password)

$Session = New-SFTPSession -Computername 192.168.101.209 -credential $creds

Get-SFTPFile -SessionId $session.SessionID -RemoteFile /home/user1/shared/NetFrameworkNDP462.exe -LocalPath c:tempps

Vous pouvez modifier à nouveau votre script et le configurer pour qu’il exécute le fichier d’installation téléchargé sur la machine Windows. La commande permettant d’installer .NET Framework en mode silencieux (à partir du répertoire où se trouve le fichier d’installation) est la suivante :

.NetFrameworkNDP462.exe /q /norestart

Saisissez le nom de votre fichier d’installation si celui-ci est différent.

Ajoutez la ligne suivante à la fin du script :

Start-process "C:temppsNetFrameworkNDP462.exe" -argumentlist /q /norestart

Si vous souhaitez supprimer le fichier d’installation après l’installation terminée, pensez à ajouter cette ligne à la fin du script :

remove-item -path "C:temppsNetFrameworkNDP462.exe" -recurse -force

L’utilisation de PowerShell et de Posh-SSH vous permet d’automatiser des opérations dans PowerShell à l’aide du protocole SFTP pour copier des fichiers entre des hôtes du réseau. Vous pouvez créer un script pour télécharger des fichiers et les exécuter afin de gagner du temps lorsque vous devez effectuer une installation en masse de logiciels sur un grand nombre d’ordinateurs.

Conclusion

Vous pouvez désormais copier des fichiers vers et depuis des machines Linux via SFTP si un serveur SSH est configuré sur ces machines. Posh-SSH est un module PowerShell indispensable pour utiliser SFTP sur les machines Windows à partir desquelles vous souhaitez accéder à des serveurs SFTP distants et effectuer des tâches d’automatisation SFTP. PowerShell et SFTP peuvent être utilisés par les fournisseurs de services gérés et les administrateurs système au sein des entreprises.

PowerShell est souvent utilisé pour gérer les machines virtuelles Hyper-V et VMware (sur PowerCLI). N’oubliez pas de sauvergarder vos machines virtuelles Hyper-V. Tout comme PowerShell sert à automatiser l’exécution de commandes, NAKIVO Backup & Replication automatise la sauvegarde des machines virtuelles et offre de nombreuses fonctionnalités supplémentaires de protection des données. De plus, le produit prend en charge la Mode multitenant, ce qui est particulièrement utile pour les fournisseurs de services gérés. Téléchargez l’édition gratuite de NAKIVO Backup & Replication et commencez dès aujourd’hui à protéger vos machines virtuelles et physiques.

Essayez NAKIVO Backup & Replication

Essayez NAKIVO Backup & Replication

Profitez d'un essai gratuit pour découvrir toutes les fonctionnalités de protection des données de la solution. 15 jours gratuits. Aucune restriction en termes de fonctionnalités ou de capacité. Aucune carte bancaire requise.

Les gens qui ont consulté cet article ont également lu