Come Trasferire File in Sicurezza Usando SCP e SFTP con SSH
Trasferisci file in modo sicuro con SCP e SFTP su SSH, inclusi comandi pratici, autenticazione tramite chiave e controlli di accesso lato server più sicuri.
Come Trasferire File in Modo Sicuro Usando SCP e SFTP con SSH
Trasferire file tra sistemi locali e remoti è un requisito fondamentale dell'amministrazione di sistema e dello sviluppo. Tuttavia, l'uso di protocolli non crittografati come FTP standard o comandi R espone i dati sensibili a intercettazioni e attacchi. Il protocollo Secure Shell (SSH) fornisce due metodi robusti e crittografati per il trasferimento di file: il Secure Copy Protocol (SCP) e l'SSH File Transfer Protocol (SFTP).
Questa guida spiega quando usare SCP, quando usare SFTP e come evitare gli errori comuni che rendono il trasferimento sicuro dei file meno sicuro nella pratica.
Comprendere le Basi: SSH
Sia SCP che SFTP utilizzano SSH (tipicamente in esecuzione sulla porta 22) come livello di trasporto sottostante. Quando si avvia un trasferimento utilizzando uno dei due protocolli, SSH stabilisce prima un tunnel sicuro e crittografato tra il client e il server. Tutti i dati, inclusi i credential di autenticazione e il contenuto dei file, vengono trasmessi attraverso questo tunnel, rendendo entrambi i metodi alternative altamente sicure ai protocolli di trasferimento file legacy.
Caratteristiche chiave fornite dalla base SSH:
- Crittografia: Tutti i dati sono crittografati end-to-end.
- Autenticazione: Supporta sia l'autenticazione tramite password che quella molto più sicura tramite coppia di chiavi pubblica/privata.
- Integrità: Utilizza hashing crittografico per garantire che i file non vengano alterati durante il trasferimento.
Secure Copy Protocol (SCP)
SCP è un protocollo di rete basato sul protocollo di copia remota (rcp) ma avvolto con la sicurezza di SSH. È progettato per semplicità e velocità, rendendolo ideale per trasferimenti rapidi e non interattivi, specialmente in scripting o automazione.
Caratteristiche e Proprietà di SCP
- Semplicità: Utilizza una sintassi molto simile al comando Unix standard
cp. - Velocità: Spesso veloce per copie singole semplici, anche se le prestazioni dipendono dall'implementazione SSH, dal cifrario, dalla rete e dal set di file.
- Non Interattivo: Una volta avviato, il trasferimento viene eseguito fino al completamento senza la possibilità di gestire la sessione o interrompere lo stato del trasferimento.
Comandi Pratici di SCP
La sintassi generale per SCP è scp [opzioni] [sorgente] [destinazione].
1. Copiare un File dal Sistema Locale al Server Remoto
Per inviare un file locale nella home directory di un utente remoto:
scp /path/to/local/file.txt user@remote_host:/home/user/destination/
2. Copiare un File dal Sistema Remoto a Quello Locale
Per prelevare un file dal server nella directory corrente:
scp user@remote_host:/var/log/system.log .
# Nota: Il '.' indica la directory locale corrente
3. Copiare un'Intera Directory (Ricorsiva)
Usa il flag -r (ricorsivo) per copiare directory e tutto il loro contenuto:
scp -r /path/to/local/folder/ user@remote_host:/data/backups/
4. Specificare una Porta Non Standard
Se il demone SSH è in esecuzione su una porta diversa dalla 22, usa il flag -P (nota la P maiuscola):
scp -P 2222 local_file.zip user@remote_host:/tmp/
Nota su SCP: Il comportamento tradizionale del protocollo SCP ha una storia di rischi nella gestione di nomi di file e percorsi. Alcuni client OpenSSH moderni usano SFTP internamente per
scpper impostazione predefinita, ma non tutti i client o server si comportano allo stesso modo. Per nuovi flussi di lavoro, preferisci SFTP o rsync su SSH a meno che non sia specificamente necessaria la compatibilità con SCP.
SSH File Transfer Protocol (SFTP)
SFTP è un sottosistema di SSH che fornisce un ambiente interattivo più ricco per la gestione dei file. A differenza di SCP, che è puramente uno strumento di copia, SFTP è un protocollo con stato che consente l'elenco, l'eliminazione, la ridenominazione e la creazione di directory attraverso la stessa connessione protetta da SSH.
Caratteristiche e Proprietà di SFTP
- Sessione Interattiva: I trasferimenti avvengono all'interno di una sessione shell interattiva dedicata.
- Robustezza: Supporta la ricerca, la ripresa e la gestione di singoli trasferimenti all'interno della sessione.
- Gestione Completa: Consente di elencare (
ls), cambiare directory (cd) e manipolare file remoti e locali utilizzando comandi di sessione (put,get,lcd,lmkdir). - Sicurezza: Utilizza SSH per il trasporto ed è la scelta predefinita migliore per i trasferimenti interattivi moderni.
Comandi Pratici di SFTP
1. Avviare una Connessione SFTP
Avvia una sessione interattiva verso il server remoto:
sftp user@remote_host
Se si utilizza una porta specifica:
sftp -P 2222 user@remote_host
2. Comandi Interattivi di SFTP
Una volta connessi, si opera nell'ambiente remoto per impostazione predefinita. Usa i comandi per gestire trasferimenti e directory:
| Comando | Descrizione | Esempio |
|---|---|---|
ls |
Elenca file remoti | ls -l |
cd |
Cambia directory remota | cd /var/www/html |
put |
Carica file (Locale a Remoto) | put local_data.zip |
get |
Scarica file (Remoto a Locale) | get server_backup.tar.gz |
lcd |
Cambia directory locale | lcd /Users/me/downloads |
lpwd |
Stampa la directory di lavoro locale | lpwd |
mkdir |
Crea directory remota | mkdir new_project |
quit |
Esci dalla sessione SFTP | quit |
Esempio: Caricamento e Download all'interno di una Sessione SFTP
$ sftp [email protected]
sftp> cd /data/backups
sftp> lcd /home/local/reports
sftp> put daily_report.csv # Carica il file
Uploading daily_report.csv to /data/backups/daily_report.csv
daily_report.csv 100% 512KB 4.3MB/s 00:00
sftp> get configuration.yaml # Scarica un file
Fetching /data/backups/configuration.yaml to configuration.yaml
configuration.yaml 100% 20KB 1.1MB/s 00:00
sftp> quit
SCP vs. SFTP: Scegliere lo Strumento Giusto
Sebbene entrambi i protocolli siano sicuri, servono a diverse esigenze operative:
| Caratteristica | Secure Copy Protocol (SCP) | SSH File Transfer Protocol (SFTP) |
|---|---|---|
| Meccanismo | Protocollo di copia semplice (Non Interattivo) | Protocollo di gestione file interattivo (Con stato) |
| Caso d'Uso | Trasferimenti rapidi di singoli file; scripting/automazione. | Trasferimenti complessi; gestione directory; sessioni interattive. |
| Velocità | Spesso buona per copie semplici. | Di solito abbastanza veloce, con più funzionalità di gestione file. |
| Ripresa | Limitata; usa un altro strumento per un comportamento robusto di ripresa. | Supporta operazioni di trasferimento più controllate, ma il comportamento di ripresa del client varia. |
| Stato di Sicurezza | Strumento di compatibilità; il protocollo tradizionale ha problemi di progettazione. | Scelta predefinita migliore per il trasferimento gestito di file su SSH. |
Quando usare SCP: Usa SCP quando hai bisogno della massima velocità per un semplice trasferimento di file e stai eseguendo il comando all'interno di uno script dove è preferita la non interattività.
Quando usare SFTP: Usa SFTP per praticamente tutti i trasferimenti manuali di file, quando hai bisogno di gestire più file, cambiare directory o richiedere robustezza della sessione e funzionalità di sicurezza moderne.
Best Practice per Trasferimenti Sicuri di File
Usare SCP o SFTP è solo il primo passo. Una corretta configurazione di sicurezza sul server SSH è essenziale per proteggere l'ambiente remoto.
1. Dare Priorità all'Autenticazione tramite Chiave SSH
L'autenticazione basata su password è vulnerabile agli attacchi di forza bruta. Usa sempre coppie di chiavi SSH pubblica/privata per autenticare i trasferimenti di file. L'uso delle chiavi elimina il rischio di compromissione della password durante trasferimenti automatici o manuali.
Generare Chiavi (se necessario):
ssh-keygen -t ed25519 -C "file-transfer"
Usare una chiave specifica per il trasferimento:
scp -i ~/.ssh/my_transfer_key file.txt user@remote_host:/tmp/
# oppure
sftp -i ~/.ssh/my_transfer_key user@remote_host
2. Disabilitare l'Accesso Root
Non consentire mai trasferimenti diretti di file utilizzando l'utente root. I trasferimenti dovrebbero sempre essere eseguiti da un account utente dedicato con privilegi ridotti. Se è necessario l'accesso amministrativo, i file possono essere spostati nella posizione appropriata dopo il trasferimento usando sudo localmente sulla macchina remota.
3. Limitare l'Accesso usando ChrootDirectory (SFTP)
Per i sistemi che forniscono accesso SFTP a utenti esterni o non fidati, implementa le restrizioni ChrootDirectory all'interno del file sshd_config. Questo blocca l'utente SFTP in una directory specifica, impedendogli di navigare nel resto del filesystem.
Esempio di configurazione in /etc/ssh/sshd_config:
Match User sftp_external_user
ForceCommand internal-sftp
ChrootDirectory /var/sftp/%u
AllowTcpForwarding no
X11Forwarding no
4. Limitare i Permessi
Assicurati che l'account utente utilizzato per i trasferimenti abbia solo i permessi minimi necessari per il suo compito (Principio del Minimo Privilegio). Se un utente deve solo caricare file in /data/uploads, assicurati che non possa eliminare file in /etc/config.
Conclusione
Usa SFTP come impostazione predefinita quando hai bisogno di navigare, caricare, scaricare o gestire file in modo interattivo. Usa SCP per casi di compatibilità semplici in cui ti fidi del server e comprendi il comportamento del client. In entrambi i casi, abbina il comando a chiavi SSH, account con privilegi minimi e permessi di directory restrittivi.