Nov 13 2008

Openssh 5 sftp e jail chroot.

Tag: Computer World,Howtosjdoe @ 2:45 pm

Tempo fa installai openssh5 sul mio server perchè necessitavo della nuova feature introdotta in quella versione, che permette in pochi passi e senza troppi problemi di avere un chroot selettivo per alcuni utenti, in modo da poter abilitare SFTP e disabilitare il login. Veniva (e viene) usato per bzr e devo dire che è molto comodo: si abilita in un attimo

Una volta installato openssh5 (io ho openssh-5.0_p1) basta aggiungere le seguenti righe al file /etc/ssh/sshd_config

Match group bzrsftp
    ForceCommand internal-sftp
    ChrootDirectory /srv/bzr/%u

e questo limita tutti gli utenti che fanno parte del gruppo bzrsftp a usare sftp (i tentativi di login per avere una shell falliscono) e esegue il chroot nella loro directory: in questo modo vedono solo i loro file (il repo) e tutti vissero felici e contenti :p

Oggi avevo bisogno invece di avere un utente che potesse loggarsi per fare un reverse tunnel (per esporre un servizio hostato nella rete fastweb… discorso lungo, cmq nulla di che :) ).
Solo che non volevo che questo utente (che si connette con la chiave ma senza passphrase) avesse accesso a tutti i file e a tutti i programmi sul server…

Per prima cosa vi conviene creare l’account e testare il login con chiavi (mettendo la chiave pubblica nel file ~/.ssh/authorized_keys) e quando tutto funziona pensare al chroot.

Dopo un po’ di smattamenti sono arrivato alla conclusione.. intanto serve la conf di sshd
(sempre in /etc/ssh/sshd_config)

Match User tunnel
    ChrootDirectory /home/%u
    GatewayPorts clientspecified
    AllowTcpForwarding yes

Quindi è necessario copiare un po’ di eseguibili dentro la sua home directory
E’ un po’ noioso (andrebbe scriptato, ma non credo che mi ricapiti), assumiamo che la home dell’utente sia /home/tunnel:


# cp -rp /bin /home/tunnel/
# cp -rp /lib /home/tunnel/
# mkdir -p /home/tunnel/usr/{bin,lib} /home/tunnel/{etc,proc,dev} /home/tunnel/home/tunnel
# cp /usr/bin/{id,dircolors,ssh} /home/tunnel/usr/bin
# cp /usr/lib/{libcrypto.so.*,libssl.so.*} /home/tunnel/usr/lib
# cp -rp /home/tunnel/.ssh /home/tunnel/home/tunnel/.ssh
# cp -rp /etc/{bash*,resolv.conf} /home/tunnel/etc
# mount -t proc none /home/tunnel/proc
# mount -o bind /dev /home/tunnel/dev

Forse non è minimale come avrei voluto, ma è sufficente a far loggare l’utente e dargli qualche comando base… in più è possibile per l’utente fare i tunnel, e grazie alla direttiva GatewayPorts clientspecified può bindare i reverse tunnel su indirizzi diversi da 127.0.0.1 (in particolare mi l’ip pubblico del server)
Ricordatevi che i due comandi mount vanno dati all’avvio della macchina, se riavviate, quindi o li mettete nello script di avvio “local” o mettete le relative entry in /etc/fstab

Edit 20081116

C’è da aggiungere una cosa: le sessioni ssh vanno in timeout se non ci sono dati scambiati tra il client e il server.. E ovviamente quindi il tunnel cade se non ci sono dati che lo attraversano.

La soluzione è aggiungere

ClientAliveInterval 60

Che manda un keepalive al minuto che tiene su il tunnel. 60 è indicativo, potete anche aumentarlo o diminuirlo. ClientAliveInterval non può essere aggiunto (anche se mi sarebbe piaciuto) nel “blocco” di configurazioni per il nostro utente (Match User tunnell) ma va aggiunto nelle conf globali.