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, i file possono essere condivisi su computer non Windows utilizzando NFS, FTP, SFTP, FTPS, SCP e altri protocolli. Se si utilizza solo PowerShell, ad esempio, su Windows Server senza un’interfaccia grafica, la connessione alla condivisione SFTP per la prima volta può sembrare difficile. Questo post del blog spiega come utilizzare SFTP in Windows con PowerShell.
Che cos’è SFTP?
SFTP sta per SSH File Transfer Protocol o Secure File Transfer Protocol. SFTP è l’alternativa sicura al tradizionale File Transfer Protocol (FTP) con funzionalità simili. SFTP funziona sul livello applicativo del modello OSI (livello 7), utilizza la connessione SSH ed è particolarmente diffuso sui computer Linux che di solito dispongono di un client SFTP a riga di comando integrato. Se utilizzi Windows, installa un client SSH gratuito come WinSCP, che ha una GUI e supporta più di SFTP, oppure configura gli strumenti PowerShell se devi utilizzare la riga di comando. Windows e PowerShell non supportano SFTP in modo nativo, 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 dagli aggressori. SSH viene utilizzato per l’autenticazione e, se si dispone delle credenziali utente Linux, è possibile accedere ai file su una macchina Linux di destinazione dopo aver superato l’autenticazione dal client SFTP della riga di comando o da un client GUI. Consente inoltre di copiare file da/verso una macchina Linux remota alla propria macchina Linux o Windows locale. La configurazione del server SFTP su Linux non è difficile: è sufficiente installare il server SSH, creare utenti e concedere le autorizzazioni necessarie per utenti e file/directory.
Non confondere SFTP e FTPS. Questi due protocolli sono utilizzati per scopi simili. Tuttavia, SFTP utilizza un unico numero di porta per la connessione, mentre FTPS utilizza più numeri di porta per i canali di controllo e dati (il che può essere più difficile da configurare dal punto di vista della sicurezza, inclusi i firewall). FTPS è FTP con SSL (Secure Socket Layer). In questo post del blog non approfondisco come configurare il server SFTP. Per informazioni sull’installazione e la configurazione di Linux (incluso il server SSH) su Hyper-V, consultate qui.
Installazione del modulo Posh-SSH
Per eseguire operazioni con i file (copia, eliminazione) su macchine remote utilizzando SFTP e SCP in PowerShell, è necessario installare il modulo Posh-SSH in PowerShell. L’installazione di questo modulo consente anche di eseguire comandi remoti su un computer remoto utilizzando la sessione SSH. Per installare e utilizzare Posh-SSH sono obbligatori PowerShell 3.0 e .NET Framework 4.0. È quindi possibile installare questo modulo su Windows 8 o versioni più recenti di Windows. È anche possibile aggiornare manualmente PowerShell e .NET Framework su Windows 7 SP1. Esegui questo comando per installare il modulo SFTP di PowerShell (Posh-SSH):
install-module posh-ssh
In alternativa, puoi 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 è necessaria una connessione Internet. Nel mio caso, ho installato il modulo Posh-SSH in PowerShell e posso passare alle fasi di configurazione avanti.
Connessione a un host remoto in PowerShell
In questo post del blog utilizzo un ambiente con un computer Windows locale e un computer Linux remoto, entrambi connessi 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 sono utilizzati nei miei esempi. Inserisci i tuoi indirizzi IP e le tue credenziali nei comandi e nei file di configurazione appropriati.
Controlliamo la nostra condivisione SFTP collegandoci al server Linux tramite SFTP utilizzando WinSCP, il client SFTP gratuito per Windows. La connessione a un server SFTP è molto semplice. Inserisci l’indirizzo IP dell’host di destinazione, il numero di porta (TCP 22 è il numero di porta predefinito, ma puoi configurare un server SSH per utilizzare un numero di porta personalizzato), il nome utente e la password per connetterti. Non dimenticare di selezionare il protocollo SFTP.
Nel mio caso, la connessione SFTP funziona. Abbiamo copiato due file nella cartella condivisa (l’ubicazione dei file è /home/user1/shared/ sul computer Linux remoto). 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. Inserisci un nome utente e una password per accedere al computer Linux remoto con i file a cui devi accedere tramite SFTP. Se hai inserito le credenziali corrette, dovresti vedere 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 immettere il comando di Guida con gli argomenti appropriati per visualizzare le brevi informazioni di Guida sulla sintassi per l’utilizzo dei comandi PowerShell:
help New-SFTPSession
Elenca tutti i comandi posh PowerShell disponibili:
Get-Command -Module Posh-SSH
o
Get-command -Name * -module *posh-ssh
Ecco il metodo per creare una sessione SSH che consente di eseguire un comando su un host remoto, ad esempio per elencare i file 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. Non si tratta di uno script SFTP, ma di uno script PowerShell per lavorare con SFTP. Questo script di prova dovrebbe copiare il file di installazione di .NET Framework da un computer Linux remoto a un computer Windows locale.
Creare un file di script test-PS.ps1 con il contenuto visualizzato 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, andare alla cartella in cui è memorizzato questo script di test ed eseguire lo script
.test-PS.ps1
Il file NetFrameworkNDP462.exe deve essere copiato da /home/user1/shared/ (su una macchina Linux remota) a C:tempps (su una macchina Windows locale). Come potete vedere nella schermata qui sotto, nel mio caso il file è stato copiato correttamente.
Per elencare i file 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 tramite 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 computer locale da una cartella in cui è memorizzato questo file di script.
.list-files.ps1
Prestare attenzione al parametro -Recursive definito nello script di test. Nello screenshot qui sotto puoi vedere i risultati dell’utilizzo del parametro -Recursive e senza questo parametro.
Uno degli svantaggi dell’esecuzione di script come quelli mostrati negli esempi sopra è che le credenziali sono memorizzate nel testo semplice di uno script, il che non è sicuro. Un utente in grado di aprire uno script (anche con autorizzazioni di sola lettura) può vedere una password e utilizzarla per accedere senza autorizzazione.
Esiste un metodo per migliorare il livello di sicurezza e memorizzare una password in una vista crittografata in un file. L’API Windows di protezione dei dati viene utilizzata per crittografare una password, a cui è 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"
Quindi la password viene salvata in forma crittografata nel file di testo. Se qualcuno vede il contenuto di questo file, la password non viene visualizzata come testo normale.
Quando è necessario inserire la password, definire il file con una password crittografata salvata (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 garantisce una maggiore sicurezza. È possibile modificare lo script in cui è stata definita la password. In alternativa all’apertura di uno script in un editor di testo, è possibile fare clic con il pulsante destro del mouse sul file ps1 e nel menu contestuale fare clic su Modifica.
Si apre Windows PowerShell ISE. Si tratta di uno strumento nativo di Windows che colorizza la sintassi per maggiore praticità e visualizza i comandi PowerShell disponibili nel riquadro destro.
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 per eseguire il file di installazione scaricato sul computer Windows. Il comando per installare .NET Framework in modalità silenziosa (dalla ubicazione del file di installazione) è:
.NetFrameworkNDP462.exe /q /norestart
Inserisci il nome del tuo file di installazione se il nome è diverso.
Aggiungere la riga alla fine dello script:
Start-process "C:temppsNetFrameworkNDP462.exe" -argumentlist /q /norestart
Se si desidera eliminare il file di installazione al termine dell’installazione, considerare l’aggiunta di questa riga alla fine dello script:
remove-item -path "C:temppsNetFrameworkNDP462.exe" -recurse -force
L’utilizzo di PowerShell e Posh-SSH consente di automatizzare le operazioni in PowerShell utilizzando il protocollo SFTP per copiare i file tra gli host della rete. È possibile creare uno script per scaricare i file ed eseguirli, risparmiando tempo quando è necessario eseguire l’installazione di massa di software su un numero elevato di computer.
Conclusione
Ora è possibile copiare file da/verso macchine Linux tramite SFTP se un server SSH è configurato sulle macchine Linux. 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 MSP e dagli amministratori di sistema nelle organizzazioni.
PowerShell viene spesso utilizzato per gestire VM Hyper-V e VM VMware (in PowerCLI). Ricordate di eseguire il backup delle macchine virtuali Hyper-V. Proprio come PowerShell viene utilizzato per automatizzare l’esecuzione dei comandi, NAKIVO Backup & Replication automatizza il backup delle VM e fornisce molte funzionalità aggiuntive per la protezione dei dati. Inoltre, il prodotto supporta l’installazione in Modalità multi-tenant, particolarmente utile per i fornitori di servizi gestiti. Scarica l’Edizione gratuita di NAKIVO Backup & Replication & e inizia oggi stesso a proteggere le vostre macchine virtuali e fisiche.










