Guide tecniche

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.

Di Redazione SqueezeMindPubblicato il Rivisto il 5 min di lettura

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 avere root come 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 775 seguito da /*, così la directory di chroot mantiene il 755. Con chmod g+s sulle 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_config un blocco Match Group per il gruppo con ForceCommand internal-sftp, X11Forwarding no e AllowTcpForwarding no. Poi salva il file e riavvia il servizio con sudo service ssh restart.

Vuoi che ce ne occupiamo noi?

Hosting gestito e migrazione hosting per siti e applicazioni: server o cloud configurati, backup verificati, monitoraggio e performance sotto controllo.

Cloud, hosting & performance Tutti i servizi