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.


Nov 03 2008

Gentoo bash-completion e bazaar

Tag: Howtosjdoe @ 1:27 pm

Usando bzr come VCS preferito, ho sempre trovato scomodo il file distribuito insieme al pacchetto su gentoo per abilitare la bash-completion. Infatti lo script completa solo qualche comando, non tutti, mentre io spesso non mi ricordo il nome preciso del comando e sono sempre a dare bzr help commands :p

E sicome sono pigro, mi sono riscritto lo scriptino: non so se funziona per voi, per me si. Beh, più che riscritto me lo sono “esteso” con i comandi che mancavano.

Lo script lo potete trovare qua: http://jdoe.asidev.com/files/bzr-autocompletion-20081103

per usarlo, basta che lo mettiate nella directory

~/.bash_completion.d/

con nome

bzr

Ah, ovviamente dovete avere bash-completion abilitata!