Come usare SFTP per trasferire file in modo sicuro

Introduzione FTP, File Transfer Protocol, era un protocollo molto diffuso e non crittografato per trasferire file tra due sistemi remoti. Ad oggi risulta deprecato dalla maggior parte dei moderni software […]

Avatar di GB Factory
GB Factory 4 Luglio 2022

Introduzione

FTP, File Transfer Protocol, era un protocollo molto diffuso e non crittografato per trasferire file tra due sistemi remoti. Ad oggi risulta deprecato dalla maggior parte dei moderni software data la mancanza di sicurezza e può essere utilizzato solo per applicativi legacy.

SFTP, acronimo di Secure File Transfer Protocol, è un protocollo separato contenuto all'interno dell'SSH che implementa i comandi dell'FTP eseguiti attraverso una connessione sicura. Tipicamente può sostituire l'FTP senza nessuna modifica in ogni contesto in cui un server FTP è necessario.

Nella maggior parte dei casi, è preferibile utilizzare SFTP al posto di FTP per la sicurezza aggiuntiva che fornisce e l'abilità di utilizzare una connessione SSH. L'FTP è un protocollo insicuro che dovrebbe essere utilizzato solamente in alcuni casi oppure in reti fidate. Ecco perché in questa guida vedremo Come usare SFTP per trasferire file in modo sicuro.

Anche se l'SFTP è integrato in molti client con interfaccia grafica, in questa guida vedremo come usarlo attraverso la riga di comando.

Come connettersi con SFTP

Di default, l'SFTP utilizza il protocollo SSH per autenticarsi e stabilire una connessione sicura. Per questo motivo, è possibile utilizzare gli stessi metodi di autenticazione disponibili anche con l'SSH.

Sebbene sia possibile autenticarsi anche con una password, è fortemente consigliato creare delle chiavi SSH e copiare la chiave pubblica su qualsiasi server a cui vuoi accedere. Questo può aumentare notevolmente la sicurezza e far risparmiare tempo durante l'accesso.

Proprio per il fatto che SFTP utilizza SSH, connettersi ad un server remoto utilizzando l'SFTP è uguale alla connessione con l'SSH, basta cambiare la prima parola chiave:

Se puoi connetterti alla macchina tramite SSH, allora hai completato tutti i requisiti necessari per utilizzare SFTP per gestire i file. Testare l'accesso SSH con il seguente comando:

sftp nome-utente@ip-server-remoto 

Quando la connessione sarà stata stabilita, il tuo prompt cambierà in un prompt SFTP.

Se stai lavorando su una porta SSH personalizzata (non la porta predefinita 22), puoi aprire una sessione SFTP con il seguente comando:

sftp -oPort=custom_port nome-utente@ip-server-remoto

In questo modo potrai collegarti al server remoto con la porta specificata.

Comando di Aiuto di SFTP

Il comando più utile da imparare è help. Questo ti dà accesso a un riepilogo degli altri comandi SFTP. Puoi richiamarlo digitando una di queste alternative nel prompt:

help
? 

Verrà visualizzato un elenco dei comandi disponibili:

Available commands:
bye                                Quit sftp
cd path                            Change remote directory to 'path'
chgrp grp path                     Change group of file 'path' to 'grp'
chmod mode path                    Change permissions of file 'path' to 'mode'
chown own path                     Change owner of file 'path' to 'own'
df [-hi] [path]                    Display statistics for current directory or
                                   filesystem containing 'path'
exit                               Quit sftp
get [-Ppr] remote [local]          Download file
help                               Display this help text
lcd path                           Change local directory to 'path'
. . .

Vedremo nel dettaglio alcuni di questi comandi proseguendo con la guida.

Possiamo navigare tra i file del sistema remoto usando una serie di comandi che funzionano in modo simile alle loro controparti della shell locale.

Per prima cosa, possiamo scoprire in quale directory ci troviamo attualmente sul sistema remoto. Proprio come viene fatto in una shell locale, possiamo digitare il seguente comando per ottenere la directory corrente:

pwd 
Remote working directory: /home/gbfactory

Possiamo visualizzare il contenuto della directory corrente del sistema remoto con un altro comando che risulterà familiare a chi ha già utilizzato la shell:

ls 
filetestuale.txt     index.html       prova.txt        nuovacartella

È necessario sottolineare che i comandi disponibili all'interno dell'interfaccia SFTP non corrispondono perfettamente alla sintassi tipica della shell e non hanno lo stesso livello di funzionalità. Tuttavia sono stati aggiunti dei flag opzionali più importanti come -la o -ls che consentono di visualizzare più metadati e permessi dei file.

ls -la 
drwxr-xr-x    5 gbfactory   gbfactory       4096 Jun 13 15:11 .
drwxr-xr-x    3 root        root            4096 Jun 13 15:02 ..
-rw-------    1 gbfactory   gbfactory          5 Jun 13 15:04 .bash_history
-rw-r--r--    1 gbfactory   gbfactory        220 Jun 13 15:02 .bash_logout
-rw-r--r--    1 gbfactory   gbfactory       3486 Jun 13 15:02 .bashrc
drwx------    2 gbfactory   gbfactory       4096 Jun 13 15:04 .cache
-rw-r--r--    1 gbfactory   gbfactory        675 Jun 13 15:02 .profile
. . .

Per arrivare a un'altra directory, possiamo emettere questo comando:

cd nuovacartella

Ora abbiamo visto come navigare tra i file del sistema remoto, ma cosa facciamo se abbiamo bisogno di accedere ai nostri file in locale? Possiamo indirizzare i comandi verso il file sistema locale aggiungendo una l prima del comando (iniziale di local).

Tutti i comandi discussi finora hanno la loro controparte locale. Possiamo, come prima cosa, visualizzare la directory di lavoro locale:

lpwd 
Local working directory: /Users/gbfactory

Poi è possibile elencare il contenuto della directory in cui ci troviamo sulla macchina locale:

lls 
Desktop			prova.txt		pagina.html
Documenti		documento.rtf		index.html

Ovviamente possiamo anche cambiare la directory con cui vogliamo interagire sul sistema locale:

lcd Desktop 

Trasferire i file con SFTP

Se vogliamo scaricare un file dal nostro host remoto, possiamo farlo usando il comando get:

get fileremoto
Fetching /home/gbfactory/fileremoto to fileremoto
/home/gbfactory/fileremoto                       100%   37KB  36.8KB/s   00:01

Come puoi vedere, di default, il comando get scarica il file remoto in un file con lo stesso nome sul sistema locale.

Possiamo copiare il file remoto con un nome diverso specificando il nome in questo modo:

get fileRemoto fileLocale 

Il comando get accetta anche alcuni flag di opzione. Ad esempio, possiamo copiare una directory e tutto il suo contenuto indicando che il comando deve essere ricorsivo:

get -r cartellaRemota

Possiamo dire a SFTP di mantenere le corrette autorizzazioni e tempi di accesso utilizzando il flag -P o -p in questo modo

get -Pr cartellaRemota

Copiare File Locali sul Server Remoto

Per trasferire dei file locali sul sistema remoto la procedura è identica, ma è si utilizza il comando put:

put fileLocale
Uploading fileLocale to /home/gbfactory/fileLocale
fileLocale                                     100% 7607     7.4KB/s   00:00

Gli stessi flag utilizzabili con get si applicano anche a put. Quindi per copiare un'intera directory locale, puoi eseguire put -r:

put -r cartellaLocale

Uno strumento utile da utilizzare durante il download e il caricamento dei file è il comando df, con cui puoi verificare di avere spazio sufficiente per completare i trasferimenti che ti interessano:

df -h 
Size     Used    Avail   (root)    %Capacity
19.9GB   1016MB   17.9GB   18.9GB           4%

Tieni presente che non esiste una variazione locale di questo comando, ma possiamo superare questa limitazione inserendo utilizzando il comando !.

Il comando ! ci porta in una shell locale, dove possiamo eseguire qualsiasi comando disponibile sul nostro computer locale. Possiamo controllare l'utilizzo del disco digitando:

! 

e successivamente:

df -h 
Filesystem      Size   Used  Avail Capacity  Mounted on
/dev/disk0s2   595Gi   52Gi  544Gi     9%    /
devfs          181Ki  181Ki    0Bi   100%    /dev
map -hosts       0Bi    0Bi    0Bi   100%    /net
map auto_home    0Bi    0Bi    0Bi   100%    /home

Qualsiasi altro comando locale funzionerà come previsto. Per tornare alla tua sessione SFTP puoi digitare:

exit 

Ora dovresti essere nuovamente all'interno del prompt SFTP.

Manipolare i File con SFTP

SFTP ti consente di eseguire svariati lavori con il filesystem. Ad esempio, puoi cambiare il proprietario di un file sul server remoto con il comando:

chown idutente file 

Nota come, a differenza del comando di sistema chmod, il comando SFTP non accetta il nome dell'utente, ma utilizza invece l'id dell'utente. Sfortunatamente, non esiste un modo veloce per conoscere l'id appropriato direttamente dall'interfaccia SFTP.

Come soluzione alternativa, puoi trovare l'id desiderato all'interno del file /etc/passwd, che associa i nomi utente ai loro ID nella maggior parte degli ambienti Linux:

get /etc/passwd !less passwd 
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
. . .

Nota come invece di eseguire il comando ! da solo, è stato inserito come prefisso prima del comando della shell locale. Funziona per eseguire qualsiasi comando disponibile sulla nostra macchina locale e potrebbe essere stato utilizzato anche in precedenza con il comando df.

L'id dell'utente (UID) sarà nella terza colonna del file, si tenga presente che le colonne sono delineate dai due punti (:).

Con lo stesso sistema, possiamo anche cambiare il gruppo del proprietario di un file con:

chgrp idgruppo file 

Anche in questo caso, non esiste un modo veloce per ottenere l'elenco dei gruppi del sistema remoto e i loro ID. Possiamo risolvere il problema con il seguente comando:

get /etc/group !less group 
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
. . .

La terza colonna contiene l'ID del gruppo associato al suo nome, contenuto nella prima colonna. Questo è ciò che stiamo cercando.

Il comando chmod dell'SFTP funziona normalmente anche su un sistema remoto:

chmod 777 filePubblico
Changing mode on /home/gbfactory/filePubblico

Non esiste un comando equivalente per manipolare i permessi dei file locali, ma puoi impostare umask locale, in modo che tutti i file copiati nel sistema locale abbiano i permessi corrispondenti.

Questo può essere fatto con il comando lumask:

lumask 022 
Local umask: 022

Ora tutti i normali file scaricati (finché il flag -p non viene utilizzato) avranno come permesso 644.

SFTP consente inoltre di creare directory su sistemi sia locali che remoti con lmkdirmkdir rispettivamente.

Il resto dei comandi file ha come target solo il filesystem remoto:

ln rm rmdir 

Questi comandi replicano il comportamento principale dei loro equivalenti shell. Se devi eseguire queste azioni sul file system locale, ricorda che puoi entrare in una shell eseguendo questo comando:

! 

Oppure esegui un singolo comando sul sistema locale premettendo il comando con !in questo modo:

!chmod 644 somefile 

Al termine della sessione SFTP, si può utilizzare exit oppure bye per chiudere la connessione.

bye 

Conclusione

Sebbene la sintassi SFTP sia molto meno completa dei moderni strumenti shell, può essere utile per fornire compatibilità con la sintassi FTP legacy o per limitare con attenzione le funzionalità disponibili per gli utenti remoti di alcuni ambienti.

Se sei abituato a utilizzare FTP o SCP per eseguire i tuoi trasferimenti, SFTP è un buon modo per sfruttare i punti di forza di entrambi. Sebbene non sia appropriato per ogni situazione, è uno strumento flessibile da avere nel tuo repertorio.