Abbiamo un server equipaggiato con SSH, vogliamo permette l’accesso agli utenti ma non vogliamo lasciarli liberi di scorazzare per tutto il sistema per ovvie ragioni di sicurezza. Quello che ci piacerebbe è lasciare gli utenti liberi di fare più o meno quello che vogliono nella loro home directory ma impedire che possano mettere anche solo il naso fuori da quella. Una soluzione è quella di mettere tutto l’ambiente SSH all’interno di un CHROOT, ma questo potebbe essere troppo rigido e troppo oneroso dal punto di vista della realizzazione, ad esempio vorremmo che alcuni utenti fidati non siano soggetti a questa limitazione. Vogliamo qualcosa di semplice...
PAM permette di risolvere la cosa con poco disturbo. Il modulo libpam-chroot consente di mettere in chroot la sessione di un utente (nel caso il demone in questione si appoggi a PAM e poche altre condizioni siano rispettate). Quindi l’idea è di
Scarichiamo il pacchetto (apt-get va benissimo), e diamogli una guardata da vicino:
root@localhost:/var/cache/apt/archives# dpkg -i libpam-chroot_0.9-1_i386.deb
Selecting previously deselected package libpam-chroot.
(Reading database ... 20659 files and directories currently installed.)
Unpacking libpam-chroot (from libpam-chroot_0.9-1_i386.deb) ...
Setting up libpam-chroot (0.9-1) ...
root@localhost:/var/cache/apt/archives# dpkg -L libpam-chroot_0.9-1_i386.deb
Package `libpam-chroot_0.9-1_i386.deb' is not installed.
Use dpkg --info (= dpkg-deb --info) to examine archive files,
and dpkg --contents (= dpkg-deb --contents) to list their contents.
root@localhost:/var/cache/apt/archives# dpkg --info libpam-chroot_0.9-1_i386.deb
new debian package, version 2.0.
size 17156 bytes: control archive= 1135 bytes.
26 bytes, 1 lines conffiles
776 bytes, 20 lines control
1060 bytes, 13 lines md5sums
Package: libpam-chroot
Version: 0.9-1
Section: devel
Priority: optional
Architecture: i386
Depends: libpam0g (>= 0.76)
Installed-Size: 112
Maintainer: Javier Fernandez-Sanguino Pen~a <jfs@computer.org>
Description: Chroot Pluggable Authentication Module for PAM
This package includes a special (but not thoroughly tested) PAM
module to provide chrooted (restricted) environments for users.
The module tries to provide a transparent wrapper around the
average user, one that puts them in a fake file-system (eg, their
'/' is really /some/where/else).
.
In order to setup this environment in Debian please read the
README.Debian as well as the detailed example provided in
/usr/share/doc/libpam-chroot/examples
.
Homepage: http://sourceforge.net/projects/pam-chroot/
root@localhost:/var/cache/apt/archives# dpkg --contents libpam-chroot_0.9-1_i386.deb
drwxr-xr-x root/root 0 2004-10-26 23:18:36 ./
drwxr-xr-x root/root 0 2004-10-26 23:18:36 ./etc/
drwxr-xr-x root/root 0 2004-10-26 23:18:36 ./etc/security/
-rw-r--r-- root/root 389 2004-10-26 23:18:36 ./etc/security/chroot.conf
drwxr-xr-x root/root 0 2004-10-26 23:18:36 ./lib/
drwxr-xr-x root/root 0 2004-10-26 23:18:36 ./lib/security/
-rw-r--r-- root/root 14436 2004-10-26 23:18:36 ./lib/security/pam_chroot.so
drwxr-xr-x root/root 0 2004-10-26 23:18:36 ./usr/
drwxr-xr-x root/root 0 2004-10-26 23:18:36 ./usr/share/
drwxr-xr-x root/root 0 2004-10-26 23:18:36 ./usr/share/doc/
drwxr-xr-x root/root 0 2004-10-26 23:18:36 ./usr/share/doc/libpam-chroot/
-rw-r--r-- root/root 1154 2004-06-24 04:02:20 ./usr/share/doc/libpam-chroot/options
-rw-r--r-- root/root 3246 2004-05-05 02:07:47 ./usr/share/doc/libpam-chroot/TROUBLESHOOTING
-rw-r--r-- root/root 1292 2004-10-26 23:18:35 ./usr/share/doc/libpam-chroot/copyright
drwxr-xr-x root/root 0 2004-10-26 23:18:36 ./usr/share/doc/libpam-chroot/examples/
-rw-r--r-- root/root 1328 2004-10-26 23:18:35 ./usr/share/doc/libpam-chroot/examples/README.example
-rw-r--r-- root/root 52 2004-10-26 23:18:35 ./usr/share/doc/libpam-chroot/examples/chroot.conf
-rw-r--r-- root/root 639 2004-10-26 23:18:35 ./usr/share/doc/libpam-chroot/examples/chrooted-directory-tree.txt
-rw-r--r-- root/root 932 2004-10-26 23:18:35 ./usr/share/doc/libpam-chroot/examples/setup-chrootdir-rsync.sh
-rw-r--r-- root/root 1655 2004-10-26 23:18:35 ./usr/share/doc/libpam-chroot/examples/setup-chrootdir-shell.sh
-rw-r--r-- root/root 826 2004-10-26 23:18:35 ./usr/share/doc/libpam-chroot/examples/setup-chrootdir-template.sh
-rw-r--r-- root/root 2253 2004-10-26 23:18:35 ./usr/share/doc/libpam-chroot/README.Debian.gz
-rw-r--r-- root/root 1161 2004-10-26 23:18:35 ./usr/share/doc/libpam-chroot/changelog.Debian.gz
Come si vede già da qui la cosa non sembra difficilissima, e la documentazione pare ricca e dettagliata. In particolare nel file /usr/share/doc/libpam-chroot/README.Debian.gz c’è proprio una sezione intitolata ‘Setting up OpenSSH with libpam-chroot’ e seguendo le indicazioni date da questa sezione il lavoro sembra abbastanza facile: vediamo...
Questo è forse uno dei passaggi più lunghi perchè in pratica dobbiamo realizzare un piccolo sistema nel sistema che sia consistente, ovvero che possa fare solo le cose che decidiamo noi a priori ma che quelle riesca a farle bene! Quindi si tratta di selezionare accuratamente i binari, capire quali file di configurazione sono necessari, quindi le librerie, le cartelle e le device... Inutile dire che qualche errore o dimenticanza la si commette quindi conviene armarsi di pazienza...
Il metodo più facile per preparare l’ambiente di “chroot-ato” è quello di appoggiarsi a makejail. Questo script legge un file di configurazione python e crea per noi la cartella con tutto quello che ci serve... o quasi.
Ho messo assieme e sperimentato il seguente script shell.py da usare con makejail:
################################################# # Simple MakeJail Configuration file ################################################# chroot="/var/jail/" testCommandsInsideJail=["bash ","ls","cd","dir" "tar","gzip","gunzip", "cat","less","vi","echo", "chmod","chown","chgrp", "dd","cp","mv","grep", "kill","ln","mkdir","ps", "pwd","rm","rmdir","sleep", "touch","true", "find","diff", "env","id"] forceCopy=["/etc/shells", "/etc/nologin","/etc/environment", "/etc/hosts*", "/bin/*sh", "/lib/libnss*", "/dev/tty[0-9]*"] preserve=["/dev", "/lib"]
Per far partire il tutto occore fare:
mkdir /var/jail makejail shell.py
dopo di che occorre controllare che /var/jail/dev contenga tutte le device del caso,
# devices cd /var/jail/dev MAKEDEV std tty pty console
... a dire il vero può essere necessario utilizzare questo comando per “sbloccare” makejail in caso i ncontri broblemi: di solito i messaggi d’errore sono abbastanza chiari.
inoltre per alcuni casi, è necessario che /var/jail/proc sia montato col virtual proc filesystem.
# /proc mkdir /var/jail/proc mount -t proc proc /var/jail/proc
A questo punto possiamo copiare o creare la home dell’utente (”user”) nell’ambiente chrootato e fare un /etc/passwd con le credenziali giuste ed altri accordimenti correttivi:
# creare/spostare la directory mkdir -p /var/jail/home/user cp -Rav /home/user /var/jail/home/user # creare /etc/passwd per l'ambiente chrootato grep -e "^root:" /etc/passwd >> /var/jail/etc/passwd grep -e "^user:" /etc/passwd >> /var/jail/etc/passwd # modifichiamo /etc/passwd del sistema sed "s:/home/user:/var/jail/home/user:" /etc/passwd >>> BBB & mv -f BBB /etc/passwd # linkiamo la home dir virtuale al suo richiamo mkdir -p /var/jail/var/jail/home cd /var/jail/var/jail/home ln -s ../../../../home/user user
Siccome il processo può essere lungo e non troppo semplice ho preparato un TGZ che contiene già un ambientino completo, utile per lo meno per le prime prove se non addirittura così com’è. E’ facile da modificare, basta controllare i contenuti del pacchetto con quando qui descritto. Il TGZ va utilizzato da root per mantenere i valori corretti dei permessi e dei proprietari. Contiene un file README con le informazioni del caso ed il file di configurazione python shell.py da utilizzare con makejail.
Non illudetevi però, non è pappa pronta... metterci le mani è quasi sicuramente indispensabile.
Questa è davvero facile da fare, basta una riga
echo "session required pam_chroot.so" >> /etc/pam.d/ssh echo "user /var/jail" >> /etc/security/chroot.conf
Possiamo ora entrare nella nostra prigione (supponendo che sia nella cartella /var/jail col comando:
chroot /var/jail
e sperimentare da li dentro tutte le funzionalità che riteniamo utili all’ambiente o all’utente.
Se chroot si lamenta dell’impossibilità di lanciare /bin/bash ma il file esiste provate a cotrollare:
Successivamente da remoto possiamo testare l’accesso dell’utente vero e proprio
ssh user@server
Può capitare di dimenticarsi di aggiungere all’ambiente chroot un binario od un altro file. In tal caso si può porcedere in diversi modi. Il più semplice è quello di mettere mano allo scrypt python di configurazione del makejail e ripetere tutto da capo. Un secondo, meno invasivo e più utile anche in caso di debug consiste nel copiare il file in questione dall’ambiente esterno a quello chrootato, nel caso questo sia un binario sarà necessario spostare anche i files di configurazioni e le librerie. Per scoprire quali basta usare i comando ldd e strace.
Oltre a questi accorgimenti conviene fare sempre un po’ di hardening generale del sistema e del demone ssh come già esposto in un altra tip.