Jail for Apache
Contents
Chroot Apache
Στο λειτουργικό σύστημα linux μπορούμε να δημιουργήσουμε ένα ξεχωριστό
ψευδό-σύστημα αρχείων κάτω από το ήδη υπάρχον σύστημα αρχείων. Είναι δλδ
μία εικόνα του συστήματος, συνήθως μόνο με τα πολύ απαραίτητα στοιχεία.
Η δυνατότητα αυτή μας δίνει το πλεονέκτημα να μπορούμε να χρησιμοποιούμε
υπηρεσίες οι οποίες τρέχουν στο σύστημά μας αλλά μέσα στα πλαίσια του
συγκεκριμένου ψευδό-συστήματος αρχείων.
Πιο αναλυτικά το chroot ή jail περιβάλλον είναι ένας συγκεκριμένος
κατάλογος στο σύστημά μας, ο οποίος έχει τροποποιηθεί με τέτοιο τρόπο
ώστε να προσφέρει το κατάλληλο περιβάλλον για να τρέξει μία υπηρεσία.
file:apachechroot.gif
Εγκατάσταση της υπηρεσίας
Πριν μεταφέρουμε μία υπηρεσία σε ένα chroot περιβάλλον, χρειάζεται
φυσικά να την εγκαταστήσουμε στο σύστημά μας. Στο συγκεκριμένο παράδειγμα
θα εγκαταστήσω πολύ γενικά την τελευταία (για την ώρα) έκδοση του apache:
apache 2.2.14 οπότε και αρκετά βήματα παρακάτω μπορεί να τροποποιηθούν
ανάλογα με το πως έχουμε εγκαταστήσει την υπηρεσίας μας.
Ως διαχειριστές απλά τρέχουμε το εξής script:
#!/bin/bash wget -c http://apache.otenet.gr/dist/httpd/httpd-2.2.14.tar.bz2 tar jxvf httpd-2.2.14.tar.bz2 cd httpd-2.2.14 ./configure \ --enable-modules \ --enable-rewrite \ --enable-so \ --enable-ssl make make install
με αυτό τον τρόπο έχουμε εγκαταστήσει τον Web Server Apache Version 2.2.14
κάτω από τον κατάλογο /usr/local/apache2 (ο συγκεκριμένος κατάλογος
ορίζεται ως o προεπιλεγμένος κατά την βασική εγκατάσταση του apache).
Δημιουργία Χρήστη
Τώρα μπορούμε να δημιουργήσουμε έναν νέο ξεχωριστό χρήστη. Αυτό το
κάνουμε ώστε όταν εκκινούμε την υπηρεσία να μεταβιβάζονται τα δικαιώματα
σε αυτόν τον νέο χρήστη, που του έχουμε αφαιρέσει όλα τα υπόλοιπα
δικαιώματα, για να μην τρέχει η υπηρεσία μας με δικαιώματα διαχειριστή.
Αυτή η δυνατότητα μας προσφέρει μεγαλύτερη ακόμα ασφάλεια, καθώς εάν
κάποιος κακόβουλος χρήστης καταφέρει να αποκτήσει τον έλεγχο της υπηρεσίας
θα αποκτήσει τα δικαιώματα του συγκεκριμένου χρήστη. Αυτό γίνεται με τις εξής εντολές:
groupadd apache useradd -c 'Apache User' -d /dev/null -g apache -s /sbin/nologin apache
Οπότε και πρέπει να τον ορίσουμε στο αρχείο ρυθμίσεων του apache.
Στο παραπάνω παράδειγμα είναι το εξής αρχείο: /usr/local/apache2/conf/httpd.conf
Με τις παρακάτω εντολές πραγματοποιούμε τις αλλαγές που θέλουμε:
perl -p -i -e 's/User daemon/User apache/g' /usr/local/apache2/conf/httpd.conf perl -p -i -e 's/Group daemon/Group apache/g' /usr/local/apache2/conf/httpd.conf perl -p -i -e 's/#ServerName www.example.com:80/ServerName localhost/g' /usr/local/apache2/conf/httpd.conf
Shared Libraries
Σε αυτό το σημείο χρειάζεται να καταγράψουμε τα βασικά στοιχεία,
shared libraries του λειτουργικού μας συστήματος, με σκοπό να τα
μεταφέρουμε αργότερα εντός του chroot περιβάλλοντος. Για να γίνει αυτό
απλά πληκτρολογούμε την εξής εντολή:
ldd /usr/local/apache2/bin/httpd
Στο δικό μου σύστημα μου έχει βγάλει το εξής αποτέλεσμα:
linux-gate.so.1 => (0xb7708000) libssl.so.0.9.8 => /usr/lib/libssl.so.0.9.8 (0xb76c1000) libcrypto.so.0.9.8 => /usr/lib/libcrypto.so.0.9.8 (0xb756f000) libz.so.1 => /usr/lib/libz.so.1 (0xb755b000) libm.so.6 => /lib/libm.so.6 (0xb751f000) libaprutil-1.so.0 => /usr/lib/libaprutil-1.so.0 (0xb7501000) libdb-4.8.so => /usr/lib/libdb-4.8.so (0xb73a0000) libgdbm.so.3 => /usr/lib/libgdbm.so.3 (0xb739a000) libexpat.so.1 => /usr/lib/libexpat.so.1 (0xb7374000) libapr-1.so.0 => /usr/lib/libapr-1.so.0 (0xb734f000) libuuid.so.1 => /lib/libuuid.so.1 (0xb734b000) librt.so.1 => /lib/librt.so.1 (0xb7342000) libcrypt.so.1 => /lib/libcrypt.so.1 (0xb7310000) libpthread.so.0 => /lib/libpthread.so.0 (0xb72f6000) libdl.so.2 => /lib/libdl.so.2 (0xb72f2000) libc.so.6 => /lib/libc.so.6 (0xb71ac000) /lib/ld-linux.so.2 (0xb7709000)
Δημιουργιά chroot περιβάλλοντος
Για να δημιουργήσουμε ένα τέτοιο περιβάλλον αρχικά ορίζουμε (και
δημιουργούμε) το αρχείο σημείο που θα δηλώσουμε ως chroot περιβάλλον.
Έστω λοιπόν ο κατάλογος /chroot/ θα αναλάβει αυτόν τον ρόλο και επειδή
θέλουμε να υλοποιήσουμε τον apache δλδ έναν web server ώστε ο κατάλογος
web/ για αυτό (για τις ανάγκες του παραδείγματός μας χρειάζεται να έχουμε
δικαιώματα διαχειριστή – root)
export jail=/chroot/web mkdir -pv $jail
Στην συνέχεια χρειάζεται – όπως αναφέραμε και παραπάνω – μία εικόνα του
συστήματος αρχείων μας κάτω από τον παραπάνω κατάλογο. Οι σημαντικοί
κατάλογοι είναι οι εξής:
/dev /etc /home /lib /usr /var
και οι υποκατάλογοι:
/usr/lib /usr/sbin /var/log /var/run
οπότε:
mkdir -pv $jail/dev mkdir -pv $jail/etc mkdir -pv $jail/home mkdir -pv $jail/lib mkdir -pv $jail/usr/lib mkdir -pv $jail/usr/sbin mkdir -pv $jail/var/log mkdir -pv $jail/var/run
Μεταφορά της υπηρεσίας
Τώρα είμαστε έτοιμοι να μεταφέρουμε την υπηρεσία μας εντός του chroot.
Στην παραπάνω εγκατάσταση μας όπως είδαμε ο apache βρίσκεται κάτω από το
/usr/local/apache2 οπότε και χρειάζεται να δημιουργήσουμε τον εξής
κατάλογο κάτω από το $jail. Καθώς επίσης όπως επίσης φαίνεται από τα
παραπάνω κατά την δημιουργία του χρήστη χρειάζεται να δημιουργήσουμε τον
αρχικό του κατάλογο /dev/null. Για να γίνουν αυτά απλά πληκτρολογούμε:
mkdir -pv $jail/usr/local mknod $jail/dev/null c 1 3 chmod 666 $jail/dev/null groupadd apache useradd -c 'Apache User' -d /dev/null -g apache -s /sbin/nologin apache grep apache /etc/passwd > $jail/etc/passwd grep apache /etc/group > $jail/etc/group grep 127.0.0.1 /etc/hosts > $jail/etc/hosts cp /etc/resolv.conf $jail/etc/resolv.conf cp /etc/localtime $jail/etc/localtime cp /etc/nsswitch.conf $jail/etc/nsswitch.conf
Με το παραπάνω έχουμε αντιγράψει και όλα τα απαραίτητα στοιχεία/αρχεία
που χρειαζόμαστε εντός του chroot περιβάλλοντος για να παίξει η υπηρεσία
μας. Και για να ολοκληρώσουμε την μεταφορά της υπηρεσίας χρειάζεται να
αντιγράψουμε τον κατάλογο /usr/local/apache2 εντός του $jail.
cp -rav /usr/local/apache2 $jail/usr/local/ mv /usr/local/apache2 /usr/local/apache2.old
Σημείωση: Όταν θέλουμε να δημιουργήσουμε μία συσκευή (δλδ ένα αρχείο
το οποίο αντιστοιχεί σε μία συσκευή) χρειαζόμαστε μερικές πληροφορίες για
το mknod. Όπως τον τύπο της συσκευής και τα major/minor numbers. Μία καλή
συμβουλή είναι να κοιτάς τις λεπτομέρειες του αρχείου από το ήδη υπάρχον
σύστημα. Για παράδειγμα:
ls -l /dev/null /dev/zero crw-rw-rw- 1 root root 1, 3 2008-04-22 20:49 /dev/null crw-rw-rw- 1 root root 1, 5 2008-06-27 10:09 /dev/zero
οπότε εάν θέλουμε να δημιουργήσουμε την συσκευή zero πρέπει να πληκτρολογήσουμε το εξής:
mknod $jail/dev/zero c 1 5
Shared Libraries
Το τελικό στάδιο είναι η αντιγραφή των libraries που χρειάζονται
εντός του chroot περιβάλλοντος. Με την παραπάνω εντολή ldd που τρέξαμε
μπορούμε να βρούμε ποια είναι αυτά τα libraries και να τα προσθέσουμε
εντός του chroot καταλόγου.
Ξεκινάμε με την πιο βασική βιβλιοθήκη:
cp /lib/ld-* $jail/lib
Για να βρούμε και να αντιγράψουμε τις βιβλιοθήκες ακολουθούμε τα εξής βήματα:
a. Αναζητούμε το αρχείο με την εντολή locate
b. Αντιγράφουμε το αρχείο από τον κατάλογο /lib ή /usr/lib εντός του
lib καταλόγου κάτω από το chroot περιβάλλον.
Παράδειγμα:
$ locate libssl.so.0.9.8 /usr/lib/libssl.so.0.9.8 /usr/lib/i486/libssl.so.0.9.8 /usr/lib/i586/libssl.so.0.9.8 /usr/lib/i686/cmov/libssl.so.0.9.8 $ cp /usr/lib/libssl.so.0.9.8 $jail/lib
chroot web server
Αφού έχουμε αντιγράψει όλα τα αρχεία που χρειάζονται τότε το μόνο που μένει
είναι να τρέξουμε τον apache εντός του chroot καταλόγου:
chroot $jail /usr/local/apache2/bin/httpd -k start
Εάν δεν παίξει τότε χρειάζεται να κάνουμε χρήση του προγράμματος strace
π.χ.
strace chroot $jail /usr/local/apache2/bin/httpd -k start
Και να προσθέσουμε ότι χρειάζεται.
Ένα πλήρες παράδειγμα
#!/bin/bash ./configure \ --enable-ssl \ --enable-rewrite \ --enable-so make make install groupadd apache useradd -c 'Apache User' -d /dev/null -g apache -s /sbin/nologin apache perl -p -i -e 's/User daemon/User apache/g' /usr/local/apache2/conf/httpd.conf perl -p -i -e 's/Group daemon/Group apache/g' /usr/local/apache2/conf/httpd.conf perl -p -i -e 's/#ServerName www.example.com:80/ServerName localhost/g' /usr/local/apache2/conf/httpd.conf export -p jail=/opt/chroot mkdir -pv $jail/dev mkdir -pv $jail/etc mkdir -pv $jail/lib mkdir -pv $jail/usr/local mkdir -pv $jail/usr/lib mkdir -pv $jail/var/log mkdir -pv $jail/var/run mknod $jail/dev/null c 1 3 mknod $jail/dev/zero c 1 5 chmod 0666 $jail/dev/null chmod 0666 $jail/dev/zero grep apache /etc/passwd > $jail/etc/passwd grep apache /etc/group > $jail/etc/group grep 127.0.0.1 /etc/hosts > $jail/etc/hosts cp /etc/resolv.conf $jail/etc/resolv.conf cp /etc/localtime $jail/etc/localtime cp /etc/nsswitch.conf $jail/etc/nsswitch.conf cp /lib/ld-* $jail/lib ldd /usr/local/apache2/bin/httpd | grep -o '\/.* ' | awk '{print "cp " $1 " " "'"$jail"'"$1}' | sh -x cp /lib/libnss_files.so.2 $jail/lib/libnss_files.so.2 cp -rav /usr/local/apache2 $jail//usr/local/apache2 mv /usr/local/apache2 /usr/local/apache2.NoChroot chroot /opt/chroot /usr/local/apache2/bin/httpd -k start # stace chroot /opt/chroot /usr/local/apache2/bin/httpd -k start
Some links
http://www.securityfocus.com/infocus/1356 http://www.linux.com/articles/113283 http://www.linux.com/articles/36331 http://www.faqs.org/docs/securing/chap29sec254.html