Come configurare SFTP su un server web
Guida passo passo alla configurazione di SFTP con utenti multipli all'interno di un server web con tutte le dovute autorizzazioni.
In breve
Per configurare SFTP su un server web con utenti limitati al proprio sito crei un gruppo per ogni sito e vi associ gli utenti, poi in /etc/ssh/sshd_config imposti Subsystem sftp internal-sftp e un blocco Match Group con ChrootDirectory e ForceCommand internal-sftp. Infine assegni i permessi: root come proprietario, 755 alle directory di chroot e 775 ai loro contenuti.
- I gruppi di utenti permettono di aggiungere nuovi utenti SFTP senza configurare le autorizzazioni a mano, utente per utente.
- La direttiva ForceCommand internal-sftp impedisce agli utenti del gruppo di accedere al server via terminale SSH.
- La directory che contiene le directory di chroot, qui /var/www/, deve avere root come proprietario, altrimenti SFTP rifiuta le connessioni.
- Gli utenti amministratori non vanno aggiunti ai gruppi SFTP, altrimenti non riescono più ad accedere via SSH.
SFTP è di gran lunga una soluzione più sicura del tradizionale protocollo di upload di file FTP. Nella sua configurazione di base, SFTP consente agli utenti di accedere un po’ dappertutto all’interno del server web.
In questa guida imparerai a configurare SFTP affinché gli utenti accedano alle sole directory di loro competenza, senza avere nemmeno la possibilità di utilizzare SSH.
Analisi del web server
Quello che vogliamo è far sì che ogni utente acceda alla sola directory del sito web di competenza, senza la possibilità di navigare altre directory del server web. Naturalmente ogni server è configurato a suo modo. Nel nostro caso abbiamo la directory /var/www/ che contiene tutte le root directory dei vari siti web:
/var/www/miosito.com/var/www/staging.miosito.com
All’interno delle root directory abbiamo la directory public_html che contiene i file html del sito web:
/var/www/miosito.com/public_html/var/www/staging.miosito.com/public_html
Quindi nel nostro caso andremo a creare un gruppo di utenti in grado di accedere solo a /var/www/miosito.com/ ed uno in grado di accedere solo a /var/www/staging.miosito.com/ con possibilità di scrivere solo sulle rispettive public_html.
Creazione dei gruppi di utenti
Dopo aver verificato con un semplice test di connessione che SFTP funziona correttamente, iniziamo con la creazione dei gruppi di utenti.
I gruppi sono molto comodi in quanto consentono di aggiungere nuovi utenti SFTP in futuro senza dover configurare autorizzazioni manualmente utente per utente. Iniziamo con la creazione dei due gruppi:
sudo groupadd staging
sudo groupadd live
Gli utenti del gruppo staging saranno quelli autorizzati ad accedere a staging.miosito.com mentre quelli del gruppo live a miosito.com. Naturalmente sentiti libero di cambiare le nomenclature come meglio preferisci.
Creazione utenti SFTP
A questo punto creiamo gli utenti. Per comodità ne creiamo uno per il primo gruppo e uno per il secondo, fermo restando che è possibile crearne quanti ne vuoi.
sudo adduser utentestaging
sudo adduser utentelive
Creati gli utenti non rimane che associarli ai rispettivi gruppi:
sudo usermod -a -G staging utentestaging
sudo usermod -a -G live utentelive
Configurazione di SFTP
Adesso occorre configurare SFTP per dare le giuste autorizzazioni ai gruppi creati al punto 2.
Come già detto vogliamo che gli utenti appartenenti a questi gruppi non siano in grado di fare il login via SSH. Dopodiché vogliamo che dopo il login con SFTP la loro home corrisponda a quella della root directory del sito web.
Per fare questo modifichiamo il file /etc/ssh/sshd_config, commentiamo la riga Subsystem sftp anteponendo un # e aggiungiamo la riga Subsystem sftp internal-sftp. Alla fine dovrà venir fuori qualcosa di simile:
#Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp
A questo punto in fondo al file occorre aggiungere un Match Group con un ChrootDirectory. La directory di chroot è quella immediatamente precedente la public_html, ovvero la root directory, e corrisponde alla directory che gli utenti vedranno dopo il login via SFTP.
Aggiungere le seguenti righe in fondo a sshd_config:
Match Group staging
ChrootDirectory /var/www/staging.miosito.com/
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
PasswordAuthentication yes
Match Group live
ChrootDirectory /var/www/miosito.com/
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
PasswordAuthentication yes
Praticamente stiamo dicendo ad SSH di inibire l’accesso via terminale agli utenti che fanno parte dei gruppi live e staging grazie alla direttiva ForceCommand internal-sftp. Dopodiché di forzare la home directory a quella di chroot.
Per ovvi motivi è molto importante non aggiungere utenti amministratori ai gruppi appena creati altrimenti non riuscirebbero ad effettuare più alcun accesso via SSH.
Non rimane che salvare il file e riavviare SSH:
sudo service ssh restart
Configurazione dei permessi
Questo passo è importantissimo in quanto se non fatto correttamente SFTP rifiuterà i tentativi di connessione. Come prima cosa la directory che ingloba tutte le directory di chroot deve avere root come owner. Nel nostro caso la directory è /var/www/. Quindi:
sudo chown root:root /var/www/
Per consentire agli utenti di effettuare l’accesso occorre settare alle directory di chroot il permesso 755 ed associare i rispettivi gruppi. Quindi:
sudo chown -R root:live /var/www/miosito.com/
sudo chown -R root:staging /var/www/staging.miosito.com/
sudo chmod 755 /var/www/miosito.com/
sudo chmod 755 /var/www/staging.miosito.com/
Infine facciamo in modo che eventuali nuovi file creati all’interno delle directory di chroot ereditino lo stesso gruppo:
sudo find /var/www/miosito.com/ -type d -exec chmod g+s {} \;
sudo find /var/www/staging.miosito.com/ -type d -exec chmod g+s {} \;
Per consentire agli utenti dei gruppi di scrivere all’interno delle directory di chroot, occorre impostare a file e sottodirectory il permesso 775:
sudo chmod -R 775 /var/www/miosito.com/*
sudo chmod -R 775 /var/www/staging.miosito.com/*
ATTENZIONE: L’asterisco seguito dallo slash è importante altrimenti il permesso viene cambiato anche alla stessa directory di chroot!
Alla fine avremo qualcosa del tipo:
ls -l /var/www/
drwxr-sr-x 3 root root 4096 Jun 13 09:09 miosito.com
drwxr-sr-x 4 root root 4096 Jun 13 09:05 staging.miosito.com
ls -l /var/www/staging.miosito.com
drwxrwsr-x 10 root staging 4096 Jun 13 09:07 public_html
ls -l /var/www/miosito.com
drwxrwsr-x 2 root live 4096 Jun 13 09:09 public_html
Non rimane che effettuare un test di connessione per verificare che tutto funzioni correttamente.
Domande frequenti
- SFTP è più sicuro di FTP?
- Sì. SFTP è una soluzione molto più sicura del tradizionale protocollo FTP per caricare file sul server. Nella configurazione di base però lascia agli utenti accesso un po' dappertutto nel server web: per questo conviene limitarli alla sola directory del loro sito con il chroot.
- Perché SFTP rifiuta la connessione dopo aver configurato il chroot?
- Di solito per i permessi. La directory che contiene le directory di chroot deve appartenere a
root, e le directory di chroot devono avererootcome proprietario, il gruppo degli utenti e il permesso 755. Se questi passaggi non sono fatti correttamente, SFTP rifiuta i tentativi di connessione. - Come faccio a far scrivere gli utenti SFTP nella cartella del sito?
- Imposta il permesso 775 su file e sottodirectory con
chmod -R 775seguito da/*, così la directory di chroot mantiene il 755. Conchmod g+ssulle directory, i nuovi file creati ereditano lo stesso gruppo degli utenti. - Come si impedisce agli utenti SFTP di usare SSH?
- Aggiungi in fondo a
sshd_configun bloccoMatch Groupper il gruppo conForceCommand internal-sftp,X11Forwarding noeAllowTcpForwarding no. Poi salva il file e riavvia il servizio consudo service ssh restart.