Varnish in chroot jail
Breve howto per configurare varnish in chroot, in modo da aumentarne la sicurezza
Premessa
Questo howto è basato su Ubuntu 10.10 Maverick Meerkat su piattaforma AMD64 e sul fatto che varnish 2.1 sia già installato e funzionante sotto la directory /usr/local/varnish, nel caso doveste ancora installarlo, potete seguire questa guida.
Creazione delle directory
Per prima cosa creiamo la struttura di directory necessarie a varnish per poter funzionare:
$ cd /usr/local/varnish $ sudo mkdir -p usr/bin $ sudo mkdir mkdir -p usr/lib $ sudo mkdir -p usr/local $ sudo mkdir -p dev $ sudo mkdir -p tmp $ sudo chmod a+rwx tmp $ sudo chmod +t tmp
Copia degli eseguibili
Iniziamo a copiare gli eseguibili della bin
$ cd /usr/local/varnish/bin $ sudo cp -f /bin/bash . $ sudo ln -s bash sh $ sudo cp -f /bin/ls . $ sudo cp -f /bin/mv . $ sudo cp -f /bin/cp . $ sudo cp -f /bin/cat . $ sudo cp -f /bin/mkdir . $ sudo cp -f /bin/pwd . $ sudo cp -f /bin/rm . $ sudo cp -f /bin/false .
Ora passiamo a quelli presenti nella usr/bin
$ cd /usr/local/varnish/usr/bin $ sudo cp -f /usr/bin/id . $ sudo cp -f /usr/bin/vim.tiny . $ sudo ln -s -f vim.tiny vi
Mentre per la sbin
$ cd /usr/local/varnish/sbin $ sudo cp -f /sbin/ldconfig.real . $ sudo ln -s -f ldconfig.real ldconfig
Copia delle librerie
A questo punto iniziamo a copiare le shared lib necessarie,
$ cd /usr/local/varnish/lib $ sudo cp -f /lib/libncurses.so.5 . $ sudo cp -f /lib/libdl.so.2 . $ sudo cp -f /lib/libc.so.6 . $ sudo cp -f /lib64/ld-linux-x86-64.so.2 . $ sudo cp -f /lib/libselinux.so.1 . $ sudo cp -f /lib/librt.so.1 . $ sudo cp -f /lib/libacl.so.1 . $ sudo cp -f /lib/libpthread.so.0 . $ sudo cp -f /lib/libattr.so.1 . $ sudo cp -f /lib/libnsl.so.1 . $ sudo cp -f /lib/libm.so.6 . $ sudo cp -f /lib/libpcre.so.3 . $ cd /usr/local/varnish/usr/local $ sudo ln -s -f / varnish $ cd /usr/local/varnish/lib $ sudo cp -f /lib/libz.so.1 . $ sudo cp -f /lib/libnss_compat.so.2 . $ sudo cp -f /lib/libnss_files.so.2 . $ sudo cp -f /lib/libnss_nis.so.2 .
Ora creiamo un link simbolico di lib64 a lib:
$ cd /usr/local/varnish $ sudo ln -s -f lib lib64
Copia degli include
Data la necessità di varnish a compilare in run time gli script vcl copiamo anche gli include:
$ cd /usr/local/varnish/usr $ sudo cp -R -f /usr/include .
Copia dei file in etc
Adesso diamo la possibilità a varnish in chroot di risolvere i nomi di dominio e gli hostname tramite i file /etc/nsswitch.conf, /etc/resolv.conf e /etc/hosts
$ cd /usr/local/varnish/etc $ sudo cp -f /etc/resolv.conf . $ sudo cp -f /etc/nsswitch.conf . $ sudo cp -f /etc/hosts .
Creazione di /dev/null
Varnish ha bisogno del file speciale /dev/null e per fare utilizziamo il comando mknod
$ sudo mknod -m 666 /usr/local/varnish/dev/null c 1 3
Copia dei file necessari a gcc
Dato che varnish necessita della compilazione in run time, dobbiamo predisporre nella nostra gabbia tutto l'occorrente per gcc
$ cd /usr/local/varnish/usr/bin $ sudo cp -f /usr/bin/gcc-4.4 . $ sudo ln -s gcc-4.4 gcc $ sudo ln -s gcc cc $ cd /usr/local/varnish/usr/lib $ sudo cp -R -f /usr/lib/gcc . $ sudo cp -f /usr/lib/libmpfr.so.4 . $ sudo cp -f /usr/lib/libgmp.so.3 . $ sudo cp -f /usr/lib/libgomp.so.1 . $ cd /usr/local/varnish/lib $ sudo cp -f /lib/libgcc_s.so.1 . $ cd /usr/local/varnish/usr/bin $ sudo cp -f /usr/bin/as . $ sudo cp -f /usr/bin/ld.bfd ld $ sudo cp -f /usr/bin/nm . $ sudo cp -f /usr/bin/strip . $ cd /usr/local/varnish/usr/lib $ sudo cp -f /usr/lib/libopcodes-2.20.51-system.20100908.so . $ sudo cp -f /usr/lib/libbfd-2.20.51-system.20100908.so . $ sudo cp -f /usr/lib/crti.o . $ sudo cp -f /usr/lib/libc.so . $ sudo cp -f /usr/lib/libc_nonshared.a . $ sudo cp -f /usr/lib/crtn.o .
Creazione dell'utente
Ora creiamo un utente "varnish" nella nostra gabbia con uid e gid corrispondenti a 9999 e shell /bin/false
$ cd /usr/local/varnish/etc $ echo "varnish:x:9999:9999::/:/bin/false" > /tmp/passwd $ echo "varnish:\!:14972:0:99999:7:::" > /tmp/shadow $ sed 's/\\//g' /tmp/shadow > /tmp/shadow2 $ sudo cp -f /tmp/passwd . $ sudo cp -f /tmp/shadow2 shadow $ sudo chmod 640 shadow
Esecuzione
Ora non ci resta che effettuare il chroot e lanciare varnish
$ sudo chroot /usr/local/varnish
bash-4.1# /sbin/varnishd -a 0.0.0.0:8080 \
-f /etc/varnish/default.vcl -s malloc,128M -u varnish
Ricordatevi però di modificare prima il file /usr/local/varnish/etc/varnish/default.vcl secondo le proprie esigenze.
Script per la creazione della gabbia
Qui di seguito potete scaricare un semplice script per preparare l'ambiente del chroot.
