Limit user SFTP access to one directory
Updated at: 24/11/2016


Se si vuole far accedere un utente a un server Linux (es Debian) condiviso e limitarne l'accesso alla sua cartella soltanto, è possibile farlo tramite SFTP, configurando l'ambiente nel seguente modo (è possibile anche che la cartella dell'utente sia una cartella gestita da apache, su cui l'utente modifica i file del proprio sito, vedremo alla fine come fare quest'ultimo step).

Configurazione Accesso SFTP limitato

Per prima cosa creiamo un gruppo dentro cui mettere tutti gli utenti che devono avere la limitazione sulla navigazione e accesso
groupadd sftponly
Quindi creiamo l'utente, assegnamolo al gruppo desiderato e modifichiamo qualche attributo
# in questo modo creiamo un utente, assegnato al gruppo sftponly che non può fare login in ssh
useradd -g sftponly -s /bin/false nome_utente

# impostiamo una password per l'utente
passwd nome_utente
Creiamo la directory a cui faremo puntare la home dell'utente (non deve stare per forza in /home, però è bene evitare cartelle speciali, ad esempio /var/www perché altrimenti poi non funziona)
mkdir /home/nome_utente
chown root /home/nome_utente
chmod go-w /home/nome_utente
mkdir /home/nome_utente/public  # questa è la cartella in cui può scrivere
chown nome_utente:sftponly /home/nome_utente/public
chmod ug+rwX /home/nome_utente/public
Impostiamo la home dell'utente
usermod nome_utente -d /home/nome_utente
Modifichiamo il file sshd_config
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
nano /etc/ssh/sshd_config
Commentiamo, se presenti, le seguenti linee e aggiungiamo in fondo al file le altre
#Subsystem sftp /usr/lib/openssh/sftp-server #UsePAM yes SubSystem sftp internal-sftp Match Group sftponly ChrootDirectory %h ForceCommand internal-sftp AllowTcpForwarding no
Riavviamo il servizio ssh
service ssh restart
A questo punto l'utente nome_utente è abilitato all'accesso SFTP limitato alla sua cartella (se si usa un client tipo WinSCP ricordarsi di rimuovere l'opzione per aggiornare anche il timestamp dei file, altrimenti va in errore sul salvataggio)
sftp nome_utente@host
 

Configurazione Apache per far puntare un sito alla cartella dell'utente appena creato

Se vogliamo far puntare un sito nella cartella dell'utente, in modo che possa modificarlo, dobbiamo creare un sito normale (in /var/www) e poi creare un link tra la cartella public dell'utente e quella del sito
mkdir /var/www/nome_sito
chown nome_utente:www-data /var/www/nome_sito
chmod 775 /var/www/nome_sito

# quindi creiamo un "link" tra le due cartelle
mount --bind /var/www/nome_sito /home/nome_utente/public
A questo punto, una volta configurato correttamente il virtual host di apache per puntare nella cartella /var/www/nome_sito e fatto un reload, dovrebbe funzionare tutto   Guide da cui ho preso ispirazione: https://bensmann.no/restrict-sftp-users-to-home-folder/ http://www.tecmint.com/restrict-sftp-user-home-directories-using-chroot/ https://www.digitalocean.com/community/questions/how-do-i-restrict-a-user-to-a-specific-directory http://askubuntu.com/a/134442 http://unix.stackexchange.com/a/30639/132665