sshfs senza accesso alla shell
Il problema, per chi deve accogliere utenti ssh è che questi possono eseguire comandi e girare tutto il file system.
Niente paura ! Possiamo concedere l’accesso al filesystem senza far eseguire una shell.
Non è difficile, forse un pò macchinoso ma sostanzialmente non è complicato.
In questo articolo assegnerò un volume logico ad ogni utente, lo chiuderò in una jail e non permetterò che l’utente possa “loggarsi” in ssh o uscire dalla propria jail. Per fare tutto questo mi avvalgo di un semplice script che prepara i volumi logici, li formatta, li monta e li assegna all’utente.
La decisione di avere un volume logico per ogni utente è legata al fatto che un utente potrà disporre al massimo dello spazio a lui concesso, senza rubare spazio ad altri utenti.
Dopo aver scaricato l’ultima versione di devuan, procederò con l’installazione del sistema operativo.
A cose fatte, dopo aver installato anche ssh, andiamo ad editare il file /etc/ssh/sshd_config
cerchiamo al suo interno la direttiva Subsystem e la commentiamo con un #
Fatto questo, in coda aggiungiamo quanto segue:
Subsystem sftp internal-sftp
Match group sshjail
ChrootDirectory %h
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
salviamo e usciamo
Adesso, andiamo ad aggiungere una nuova shell
# echo “/usr/lib/sftp-server” >>/etc/shells
Quindi un nuovo gruppo
# addgroup – -gid 60000 sshjail
Come s’ intuisce, per avere utenti sshfs senza accesso alla shell, questi devono appartenere al gruppo sshjail.
Creazione degli script
Come di consueto, io inserisco i miei script in /script, di default questa directory non esiste ma possiamo crearla
# mkdir /script
Concedo i giusti permessi
# chmod 700 /script
e forgio gli script che ci permetteranno di gestire gli utenti con il permesso di accedere in sshfs senza accesso alla shell.
Poiché avrò diversi script che faranno uso delle medesime variabili, inizio con il costruire l’ambiente, anche qui non esiste un ambiente predefinito per le nostre esigenze ma possiamo crearlo.
# vi /script/environment.sh
#!/bin/bash
DIR=”/work”
SHELL=”/usr/lib/sftp-server”
BIN=”/bin”
UBIN=”/usr/bin”
SBIN=”/usr/sbin”
GID=”60000″
Salviamo e usciamo ESC :wq
Su questo file non servono permessi di esecuzione, quindi un
#chmod 600 /script/environment.sh
va più che bene.
Adesso creiamo lo script per aggiungere gli utenti
# vi /script/adduser.sh
#!/bin/bash
USER=$1
PASS=$2
source /script/environment.sh
if [ “$USER” == “” ] | [ “$PASS” == “” ]; then
echo “Nessun utente creato”
echo “Utilizza la formula adduser USERNAME PASSWORD”
exit 1
fi
$SBIN”/”useradd –shell=$SHELL –home=$DIR”/”$USER –no-create-home –gid=$GID $USER
{
echo $PASS
sleep 0.1
echo $PASS
} | $UBIN”/”passwd $USER
$BIN”/”mkdir -p $DIR”/”$USER”/”DATA
$BIN”/”mkdir -p $DIR”/”$USER”/”.ssh
chown root:root $DIR”/”$USER”/”
chmod 555 $DIR”/”$USER”/”
chmod 775 $DIR”/”$USER”/”DATA
chmod 775 $DIR”/”$USER”/”.ssh
chown $USER:$GID $DIR”/”$USER”/”DATA
chown $USER:$GID $DIR”/”$USER”/”.ssh
Salviamo e usciamo ESC :wq
di default non ha i permessi di esecuzione, ma possiamo concederglieli
# chmod 700 /script/adduser.sh
Script per cancellare un utente
Questo cancella un utente sshfs senza permesso di accesso alla shell
ATTENZIONE CANCELLA ANCHE GLI UTENTI DI SUSTEMA
# vi /script/userdel.sh
#!/bin/bash
USER=$1
source /script/environment.sh
if [ “$USER” == “” ]; then
echo “Nessun utente cancellato”
echo “Utilizza la formula deluser USERNAME”
exit 1
fi
$SBIN”/”userdel $USER
rm -rf $DIR”/”$USER
salviamo e usciamo
ESC :wq
concediamo i permessi di esecuzione
# chmod 700 /script/userdel.sh
Script per listare gli utenti
e passiamo all’ultimo script, quello che ci permette di visualizzare gli utenti attivi.
ATTENZIONE questo script non mostra TUTTI gli utenti attivi, ma soltanto gli utenti attivi in sshfs senza il permesso di accedere alla shell.
Nel mio sistema c’è l’utente pippo che ha accesso in sshfs ed anche alla shell (ssh), questo non verrà visualizzato.
# vi /script/listuser.sh
#!/bin/bash
source /script/environment.sh
$BIN”/”cat /etc/passwd | grep $GID | cut -d: -f1
salviamo e usciamo
ESC :wq
e concediamo i permessi di esecuzione
# chmod 700 /script/listuser.sh
Giunti a questo punto, digitando /script/adduser.sh pluto 123
Dovremmo avere l’utente pluto con password 123 ed il permesso di accedere in sshfs senza poter accedere alla shell.
Massimizzazione dell’efficienza degli script di backup.
In questo mio precedente articolo https://dibrigida.it/159/autenticarsi-con-ssh-senza-password/ , scritto in tempi non sospetti, descrivevo come potersi autenticare in ssh, senza dover necessariamente inserire la password tutte le volte.
Ebbene, guardando gli script, si nota che faccio costruire una directory chiamata .ssh
Sarà sufficiente posizionarci all’interno la propria chiave pubblica rinominandola authorized_keys
Purtroppo, mancando l’autorizzazione di accesso alla shell, non è possibile usare il comando ssh-copy-id ma possiamo usare sshfs.
Vediamo questo esempio
#sshfs pippo@192.168.1.10:/ /mnt
pippo@192.168.1.10’s password:
Inserendo la password 123 avremo la destinazione montata in /mnt
Mentre digitiamo la password non si vedrà nulla, ne asterischi ne password ne altro, ma a questo siamo abituati.
Digitando il comando
#mount
è possibile verificare l’effettivo montaggio della risorsa remota
pippo@192.168.1.10:/ on /mnt
a questo punto basta copiare la chiave privata, opportunamente rinominata, nel posto giusto
#cp .ssh/id_rsa.pub /mnt/.ssh/authorized_keys
con il comando
#fusermount -u /mnt
smontiamo la risorsa remota.
Facciamo un test, se tutto è andato per il verso giusto, avremo accesso alla nostra area sshfs senza accesso alla shell e senza digitare password.