Situazione ed Obiettivo

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...

Una soluzione proposta

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

  • dotarci di questo modulo,
  • configurare SSHD in modo che richieda l’intervento di libpam-chroot e quindi
  • configurare l’ambiente blindato
  • decidere quali utenti mettere nell’ambiente limitato e come configurare altri parametri

Facciamo un giro su libpam

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...

Implementazione passo-passo

1 Creare l'ambiente blindato

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

Pappa Pronta

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.

prod:jail_v0.2.tgz

Non illudetevi però, non è pappa pronta... metterci le mani è quasi sicuramente indispensabile.

2 Configurare SSH con PAM

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

3 Testare

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:

  • la presenza di tutte le librerie necessarie alla bash (le si trova con ldd)
  • la presenza delle TTY (le si crea entrando nella cartella /dev della jail ed utilizzando “MAKEDEV std console tty pty”)
  • la presenza della cartella /proc nella jail con il virtual filesystem proc montato (“mount -t proc proc /var/jail/proc”)

Successivamente da remoto possiamo testare l’accesso dell’utente vero e proprio

  ssh user@server

4 Se ci siamo dimenticati qualcosa

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.

Note finali

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.

Link Esterni

 
tips/ssh_con_chroot.txt · Ultima modifica: 2006-08-31 14:56 by emcywikiroot
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki