Hits : 2656

Jail for Apache


Chroot Apache


Στο λειτουργικό σύστημα linux μπορούμε να δημιουργήσουμε ένα ξεχωριστό
ψευδό-σύστημα αρχείων κάτω από το ήδη υπάρχον σύστημα αρχείων. Είναι δλδ
μία εικόνα του συστήματος, συνήθως μόνο με τα πολύ απαραίτητα στοιχεία.
Η δυνατότητα αυτή μας δίνει το πλεονέκτημα να μπορούμε να χρησιμοποιούμε
υπηρεσίες οι οποίες τρέχουν στο σύστημά μας αλλά μέσα στα πλαίσια του 
συγκεκριμένου ψευδό-συστήματος αρχείων.


Πιο αναλυτικά το chroot ή jail περιβάλλον είναι ένας συγκεκριμένος
κατάλογος στο σύστημά μας, ο οποίος έχει τροποποιηθεί με τέτοιο τρόπο
ώστε να προσφέρει το κατάλληλο περιβάλλον για να τρέξει μία υπηρεσία.


file:apachechroot.gif


top


Εγκατάσταση της υπηρεσίας


Πριν μεταφέρουμε μία υπηρεσία σε ένα 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).


top


Δημιουργία Χρήστη


Τώρα μπορούμε να δημιουργήσουμε έναν νέο ξεχωριστό χρήστη. Αυτό το 
κάνουμε ώστε όταν εκκινούμε την υπηρεσία να μεταβιβάζονται τα δικαιώματα
σε αυτόν τον νέο χρήστη, που του έχουμε αφαιρέσει όλα τα υπόλοιπα
δικαιώματα, για να μην τρέχει η υπηρεσία μας με δικαιώματα διαχειριστή.
Αυτή η δυνατότητα μας προσφέρει μεγαλύτερη ακόμα ασφάλεια, καθώς εάν
κάποιος κακόβουλος χρήστης καταφέρει να αποκτήσει τον έλεγχο της υπηρεσίας
θα αποκτήσει τα δικαιώματα του συγκεκριμένου χρήστη. Αυτό γίνεται με τις εξής εντολές:


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


top


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)

top


Δημιουργιά 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


top


Μεταφορά της υπηρεσίας


Τώρα είμαστε έτοιμοι να μεταφέρουμε την υπηρεσία μας εντός του 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


top


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


top


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


Και να προσθέσουμε ότι χρειάζεται.


top


Ένα πλήρες παράδειγμα


#!/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

top


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

top