Come creare strumenti PowerShell per configurare SFTP
Quando si utilizzano più computer con sistema operativo Windows, potrebbe essere necessario accedere alle risorse condivise utilizzando protocolli diversi. Quando si crea una condivisione file su un computer Windows, solitamente viene utilizzato il protocollo SMB. Tuttavia, è possibile condividere file su computer non Windows utilizzando NFS, FTP, SFTP, FTPS, SCP e altri protocolli. Se si utilizza solo PowerShell, ad esempio su Windows Server senza interfaccia grafica, connettersi per la prima volta a una condivisione SFTP può sembrare difficile. Questo articolo del blog spiega come utilizzare SFTP in Windows con PowerShell.
Che cos’è l’SFTP?
SFTP è l’acronimo di SSH File Transfer Protocol o Secure File Transfer Protocol. L’SFTP è l’alternativa sicura al tradizionale File Transfer Protocol (FTP) e offre funzionalità simili. L’SFTP opera a livello di applicazione del modello OSI (livello 7), utilizza la connessione SSH ed è particolarmente diffuso sui sistemi Linux, che solitamente dispongono di un client SFTP da riga di comando integrato. Se utilizzi Windows, installa un client SSH gratuito come WinSCP, che dispone di un’interfaccia grafica (GUI) e supporta non solo SFTP, oppure configura gli strumenti di PowerShell se devi utilizzare la riga di comando. Windows e PowerShell non offrono supporto nativo per SFTP, quindi sarà necessario installare componenti aggiuntivi.
Quando si utilizza una connessione SSH, i trasferimenti di dati sulla rete sono crittografati e la connessione è sicura, a differenza del tradizionale protocollo FTP non crittografato, in cui i dati possono essere intercettati da malintenzionati. SSH viene utilizzato per l’autenticazione e, se si dispone delle credenziali di un utente Linux, è possibile accedere ai file su un sistema Linux di destinazione dopo aver superato l’autenticazione dal proprio client SFTP da riga di comando o da un client con interfaccia grafica. Consente inoltre di copiare file da/verso una macchina Linux remota sulla propria macchina locale Linux o Windows. Configurare il server SFTP su Linux non è difficile: basta installare il server SSH, creare utenti e concedere i permessi necessari per utenti, file e directory.
Non confondere SFTP e FTPS. Questi due protocolli vengono utilizzati per scopi simili. Tuttavia, SFTP utilizza un unico numero di porta per la connessione, mentre FTPS ne utilizza diversi per i canali di controllo e di dati (il che può risultare più complesso da configurare dal punto di vista della sicurezza, inclusi i firewall). FTPS è FTP con SSL (Secure Socket Layer). In questo articolo del blog non mi soffermo su come configurare un server SFTP. Per informazioni sull’installazione e la configurazione di Linux (compreso il server SSH) su Hyper-V, consultare qui.
Installazione del modulo Posh-SSH
Per eseguire operazioni sui file (copia, eliminazione) su computer remoti utilizzando SFTP e SCP in PowerShell, è necessario installare il modulo Posh-SSH in PowerShell. L’installazione di questo modulo consente inoltre di eseguire comandi remoti su un computer remoto tramite la sessione SSH. Per installare e utilizzare Posh-SSH sono obbligatori PowerShell 3.0 e .NET Framework 4.0. Pertanto, è possibile installare questo modulo su Windows 8 o versioni più recenti di Windows. È inoltre possibile aggiornare manualmente PowerShell e .NET Framework su Windows 7 SP1. Eseguire questo comando per installare il modulo SFTP di PowerShell (Posh-SSH): install-module posh-ssh
In alternativa, è possibile utilizzare questo comando per installare il modulo Posh-SSH per PowerShell:
iex (New-Object Net.WebClient).DownloadString("https://gist.github.com/darkoperator/6152630/raw/c67de4f7cd780ba367cccbc2593f38d18ce6df89/instposhsshdev")
Per installare Posh-SSH con i comandi sopra indicati è obbligatoria una connessione a Internet. Nel mio caso, ho installato il modulo Posh-SSH in PowerShell e posso passare ai passaggi di configurazione successivi.
Connessione a un host remoto in PowerShell
In questo post del blog, sto utilizzando un ambiente con un computer Windows locale e un computer Linux remoto, entrambi collegati alla stessa rete:
- 192.168.101.210 è un computer Windows locale con Windows 10 versione 20H2 installato
- 192.168.101.209 è un computer Linux remoto su cui è in esecuzione il server SSH (SFTP)
- user1 è il nome dell’utente Linux
Questi indirizzi IP vengono utilizzati nei miei esempi. Inserite i vostri indirizzi IP e le vostre credenziali nei comandi e nei file di configurazione appropriati.
Verifichiamo la nostra condivisione SFTP collegandoci al server Linux tramite SFTP utilizzando WinSCP, il client SFTP gratuito per Windows. La connessione a un server SFTP è semplice. Inserite l’indirizzo IP dell’host di destinazione, il numero di porta (TCP 22 è il numero di porta predefinito, ma è possibile configurare un server SSH per utilizzare un numero di porta personalizzato), il nome utente e la password per effettuare la connessione. Non dimenticate di selezionare il protocollo SFTP.
Nel mio caso la connessione SFTP funziona. Abbiamo copiato due file nella cartella condivisa (il percorso dei file è /home/user1/shared/ sulla macchina Linux remota). Vediamo come connettersi alla cartella condivisa da Windows e come utilizzare SFTP con Posh-SSH in PowerShell.
Per lavorare con i file tramite SFTP, è necessario prima stabilire una sessione. A tal fine, eseguire questo comando in PowerShell:
New-SFTPSession -Computername 192.168.101.209
Dopo aver eseguito il comando, viene visualizzata la finestra di autenticazione. Inserire un nome utente e una password per accedere alla macchina Linux remota contenente i file a cui si desidera accedere tramite SFTP. Se sono state inserite le credenziali corrette, dovrebbe essere visualizzato l’output di PowerShell con le informazioni relative al numero di sessione SFTP, all’indirizzo IP dell’host remoto e allo stato della connessione. Una volta creata una sessione, a questa viene assegnato un numero di indice.
È sempre possibile digitare il comando help con gli argomenti appropriati per visualizzare le brevi informazioni di guida relative alla sintassi per l’utilizzo dei comandi di PowerShell:
help New-SFTPSession
Elencare tutti i comandi posh disponibili di PowerShell: Get-Command -Module Posh-SSH
oppure
Get-command -Name * -module *posh-ssh
Ecco come creare una sessione SSH che ti permetta di eseguire un comando su un host remoto, ad esempio per elencare i file presenti nella directory:
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"
Creazione di uno script PowerShell
Creiamo uno script di prova per esplorare le operazioni di base che è possibile eseguire in PowerShell quando si lavora con risorse SFTP. Questo non è uno script SFTP, ma uno script PowerShell per lavorare con SFTP. Questo script di test dovrebbe copiare il file di installazione di .NET Framework da una macchina Linux remota a una macchina Windows locale.
Creare un test-PS.ps1 file di script con il contenuto riportato di seguito.
#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
Aprire PowerShell su un computer Windows, accedere alla cartella in cui è memorizzato questo script di prova ed eseguire lo script
.test-PS.ps1
Il file NetFrameworkNDP462.exe dovrebbe essere copiato da /home/user1/shared/ (su un computer Linux remoto) in C:tempps (su un computer Windows locale). Come si può vedere nella schermata qui sotto, nel mio caso il file è stato copiato con successo.
Per elencare i file presenti in una directory nella risorsa SFTP, è possibile creare uno script PowerShell con il seguente contenuto:
$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
Dove:
Your_Password000 è la password dell’account utente utilizzato per connettersi via SSH alla condivisione SFTP;
user1 è il nome dell’utente;
192.168.101.209 è l’indirizzo IP dell’host remoto a cui ci connettiamo per accedere ai file tramite SFTP.
Salvare lo script come list-files.ps1 ed eseguire questo script in PowerShell sul proprio computer locale dalla cartella in cui è memorizzato il file dello script.
.list-files.ps1
Prestare attenzione al parametro -Recursive definito nello script di test. Nello screenshot qui sotto è possibile vedere i risultati ottenuti utilizzando il parametro -Recursive e senza di esso.
Uno degli svantaggi dell’esecuzione di script come quelli mostrati negli esempi precedenti è che le credenziali vengono memorizzate in chiaro all’interno dello script, il che non garantisce la sicurezza. Un utente in grado di aprire uno script (anche con permessi di sola lettura) può visualizzare una password e utilizzarla per un accesso non autorizzato.
Esiste un metodo per migliorare il livello di sicurezza e memorizzare una password in forma crittografata in un file. L’API Windows di protezione dei dati viene utilizzata per crittografare una password, alla quale è possibile accedere solo dall’account utente e dal computer utilizzati per creare questo file di password. (get-credential).password | ConvertFrom-SecureString | set-content "C:temppassword.txt"
La password viene quindi salvata in forma crittografata nel file di testo. Se qualcuno dovesse visualizzare il contenuto di questo file, la password non verrebbe mostrata in chiaro.
Quando è necessario inserire la password, specificare il file in cui è stata salvata la password crittografata ( C:temppassword.txt nel nostro caso).
$password = Get-Content "C:temppassword.txt" | ConvertTo-SecureString
$credential = New-Object System.Management.Automation.PsCredential("user1",$password)
Questo metodo di definizione della password è più sicuro. È possibile modificare lo script in cui è stata definita la password. In alternativa all’apertura dello script in un editor di testo, è possibile fare clic con il tasto destro del mouse sul file ps1 e, nel menu contestuale, selezionare Edit.
Si aprirà Windows PowerShell ISE. Si tratta di uno strumento nativo di Windows che evidenzia la sintassi a colori per una maggiore comodità e visualizza i comandi PowerShell disponibili nel riquadro di destra.
I comandi nello script di test sono ora i seguenti:
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
È possibile modificare nuovamente lo script e impostarlo in modo che esegua il file di installazione scaricato sul computer Windows. Il comando per installare .NET Framework in modalità silenziosa (dalla directory in cui si trova il file di installazione) è:
.NetFrameworkNDP462.exe /q /norestart
Inserisci il nome del tuo file di installazione se è diverso.
Aggiungere la riga alla fine dello script:
Start-process "C:temppsNetFrameworkNDP462.exe" -argumentlist /q /norestart
Se si desidera eliminare il file di installazione quando l’installazione termina, valutare l’aggiunta di questa riga alla fine dello script:
remove-item -path "C:temppsNetFrameworkNDP462.exe" -recurse -force
L’uso di PowerShell e Posh-SSH consente di automatizzare le operazioni in PowerShell utilizzando il protocollo SFTP per copiare file tra host nella rete. È possibile creare uno script per scaricare i file ed eseguirli, risparmiando tempo quando è necessario eseguire l’installazione in massa di software su un gran numero di computer.
Conclusione
Ora è possibile copiare file da e verso macchine Linux tramite SFTP, a condizione che su tali macchine sia configurato un server SSH. Posh-SSH è un modulo PowerShell obbligatorio per utilizzare SFTP su macchine Windows da cui si desidera accedere a server SFTP remoti ed eseguire attività di automazione SFTP. PowerShell e SFTP possono essere utilizzati dai fornitori di servizi gestiti e dagli amministratori di sistema all’interno delle organizzazioni.
PowerShell viene spesso utilizzato per gestire VM Hyper-V e VM VMware (in PowerCLI). Ricordatevi di eseguire il backup delle VM Hyper-V. Proprio come PowerShell viene utilizzato per automatizzare l’esecuzione dei comandi, NAKIVO Backup & Replication automatizza il backup delle VM e offre numerose funzioni aggiuntive per la protezione dei dati. Inoltre, il prodotto supporta l’installazione in Modalità multi-tenant, particolarmente utile per gli MSP (Managed Service Provider). Scarica l’edizione gratuita di NAKIVO Backup & Replication e inizia oggi stesso a proteggere le tue VM e macchine fisiche.










