Titolo originale: chroot + apache + sash + smtp = phpBB
Edit: Ho modificato il testo in pochi particolari. Quelle presenti saranno le ultime modifiche all'howto, perché contemporaneamente ho collocato il materiale sul wiki.
Una versione risistemata nell'esposizione e in qualche contenuto è in lingua "inglese" (si fa per dire
Se però emergono osservazioni, commenti o richieste, continuate pure a postare qui.
Edit 2: Sul wiki è aggiunto il supporto a mod_python.
sudato.
Ma soddisfatto, alla fine, perché ho configurato un ambiente di chroot dove ingabbiare un server apache con il mio phpBB.
Ho ridotto all'osso il numero delle librerie indispensabili, senza rinuciare a un client smtp con autenticazione ssl, che funziona facendo uso di ssmtp e di una shell depotenziata: sash.
Grazie a makoomba e a tutto il forum di gentoo per avermi quasi condotto per mano alla soluzione, fino a rendere possibile questo piccolo successo.
Come ho fatto? Ve lo dico adesso. Se vi va, dateci un'occhio, così poi metto tutto sul wiki.
- Indice:
1. Prerequisiti
2. Il chroot
3. Spedire e-mail
4. Conclusioni.
Bisogna prima avere installato il phpBB. Qundi devono funzionare anche php, mysql e apache.
Non vi interessa phpBB? Per la verità, questo non è poi molto importante, perché comunque tutto ciò che segue funziona lo stesso. Il servizio di mail lavora in modo indipendente dal paccetto software che ne fa uso.
Poi bisognerà saper configurare un client di posta in linea di comando. Io usato ssmtp. Se ho tempo e se ci riesco, aggiungerò anche l'opzione msmtp, che mi sta simpatico, perché è il primo client in linea di comando che ho imparato ad usare.
Se il vostro client funziona nell'ambiente abituale, questo howto spiega come trasferirlo nel chroot, per essere utilizzato da apache.
Quando segue è stato testato su queste versioni del software:
Code: Select all
s939 ~ # emerge -pv dev-lang/php mysql apache glibc
These are the packages that I would merge, in order:
Calculating dependencies ...done!
[ebuild R ] dev-lang/php-5.1.1 (-adabas) -apache +apache2 -bcmath +berkdb (-birdstep) +bzip2 -calendar -cdb -cgi -cjk -cli +crypt -ctype +curl -curlwrappers -db2 +dba -dbase (-dbmaker) -debug -discard-path -doc (-empress) (-empress-bcs) (-esoob) +exif -fastbuild (-fdftk) (-filepro) (-firebird) -flatfile -force-cgi-redirect (-frontbase) -ftp +gd -gd-external +gdbm +gmp -hardenedphp -hyperwave-api -iconv -imap (-informix) -inifile -interbase -iodbc -ipv6 -java-external -kerberos +ldap -libedit -mcve -memlimit +mhash +ming -msql -mssql +mysql -mysqli +ncurses +nls -oci8 (-oci8-instant-client) +odbc -pcntl +pcre -pdo -pdo-external -pic +posix -postgres -qdbm +readline -recode -sapdb -sasl +session -sharedext -sharedmem -simplexml -snmp -soap -sockets (-solid) +spell -spl +sqlite +ssl (-sybase) (-sybase-ct) -sysvipc +threads -tidy -tokenizer +truetype -vm-goto -vm-switch -wddx +xml -xmlreader -xmlrpc +xpm -xsl -yaz -zip +zlib 0 kB
[ebuild R ] dev-db/mysql-5.0.18 +berkdb -big-tables -cluster -debug -extraengine -max-idx-128 -minimal +perl (-selinux) +ssl -static +utf8 0 kB
[ebuild R ] net-www/apache-2.0.55-r1 +apache2 -debug -doc +ldap -mpm-leader -mpm-peruser -mpm-prefork -mpm-threadpool -mpm-worker -no-suexec (-selinux) +ssl -static-modules +threads 0 kB
[ebuild R ] sys-libs/glibc-2.3.5-r2 -build -erandom -glibc-compat20 -glibc-omitfp -hardened -linuxthreads-tls (-multilib) +nls +nptl -nptlonly -pic -profile (-selinux) +userlocales 0 kB
Total size of downloads: 0 kB
Code: Select all
s939 ~ # cat /etc/conf.d/apache2 |grep OPTS=
APACHE2_OPTS="-D SECURITY -D SSL -D DEFAULT_VHOST -D SSL_DEFAULT_VHOST -D PHP5"
Sembra buono. Ma su internet può non bastare. Avviare il processo apache in chroot significa farlo operare in un ambiente depotenziato, affinché un eventuale aggressore faccia fatica ad assumere il controllo pieno della macchina.
Per apache, il chroot si realizza con l'uso di un modulo preconfezionato chiamato mod_security.
Code: Select all
s939 ~ # emerge -av mod_security
These are the packages that I would merge, in order:
Calculating dependencies ...done!
[ebuild R ] net-www/mod_security-1.8.7 +apache2 -doc 0 kB
Code: Select all
s939 ~ # sed -i -e 's/APACHE2_OPTS=\"-D SSL/APACHE2_OPTS=\"-D SECURITY -D SSL/' /etc/conf.d/apache2
Ma di questo si parlerà dopo. Adesso è necessario preparare il nuovo ambiente di chroot per apache.
Code: Select all
s939 ~ # mkdir -p /chroot/apache/var/www
Code: Select all
s939 ~ # cat /etc/fstab |grep /var/www
/var/www /chroot/apache/var/www auto bind 0 0
s939 ~ # mount -a
Code: Select all
s939 chroot # mkdir apache/var/www -p
s939 chroot # mkdir apache/var/run/apache2 -p
s939 chroot # mkdir apache/var/run/mysqld -p
s939 chroot # mkdir apache/usr/lib64 -p
s939 chroot # mkdir apache/lib64 -p
s939 chroot # mkdir apache/dev -p
s939 chroot # chown mysql:mysql apache/var/run/mysqld
s939 chroot # ln -s lib64 apache/lib
s939 chroot # ln -s lib64 apache/usr/lib
Le cartelle in var/run, invece, preparano il luogo per ospitare i pid e i socket dei processi che funzioneranno nel chroot.
E finalmente possiamo tornare a mod_security. Le impostazioni di avvio sono contenute nel file /etc/apache2/modules.d/99_mod_security.conf
Per ora, è sufficiente inserire una sola riga in fondo, in modo da leggere:
Code: Select all
s939 apache # tail -n 2 /etc/apache2/modules.d/99_mod_security.conf
SecChrootDir /chroot/apache
</IfModule>
Code: Select all
s939 apache # ps -e|grep apache
29876 ? 00:00:00 apache2
29880 ? 00:00:00 apache2
29881 ? 00:00:00 apache2
29883 ? 00:00:00 apache2
s939 apache # pkill -9 apache2
Code: Select all
s939 ~ # /etc/init.d/apache2 restart
Io ho modificato come segue le righe qui sotto:
Code: Select all
s939 apache # cat /etc/mysql/my.cnf |grep chroot
socket = /chroot/apache/var/run/mysqld/mysqld.sock
err-log = /chroot/apache/var/log/mysql/mysql.err
socket = /chroot/apache/var/run/mysqld/mysqld.sock
pid-file = /chroot/apache/var/run/mysqld/mysqld.pid
log-error = /chroot/apache/var/log/mysql/mysqld.err
tmpdir = /chroot/apache/tmp/
Per apache, invece, si tratta esclusivamente di toccare una riga in /etc/apache2/http.conf :
Code: Select all
s939 apache # cat /etc/apache2/httpd.conf |grep chroot
# chroot dir is optional:
# Processor user group /path/to/chroot
Scriptsock /chroot/apache/var/run/apache2/cgisock
Il "corretto" avvio del chroot si può già osservare digitando:
Code: Select all
s939 apache # tail -n 7 /var/log/apache2/error_log
[Tue Jan 24 16:07:06 2006] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec2)
[Tue Jan 24 16:07:06 2006] [notice] mod_security: chroot checkpoint #1 (pid=29875 ppid=29872)
[Tue Jan 24 16:07:07 2006] [notice] Digest: generating secret for digest authentication ...
[Tue Jan 24 16:07:07 2006] [notice] Digest: done
[Tue Jan 24 16:07:07 2006] [notice] mod_security: chroot checkpoint #2 (pid=29876 ppid=1)
[Tue Jan 24 16:07:07 2006] [notice] mod_security: chroot successful, path=/chroot/apache
[Tue Jan 24 16:07:07 2006] [notice] Apache configured -- resuming normal operations
Code: Select all
s939 apache # ls /chroot/apache/var/run/apache2/ -l
total 4
-rw-r--r-- 1 root root 6 gen 24 16:34 apache2.pid
srwx------ 1 apache root 0 gen 24 16:34 cgisock=
Non è gravissimo, in fondo ho spiegato sopra come uscirne.
Ma se vi dà tanto fastidio, allora fate così:
Code: Select all
s939 ~ # rm /var/run/apache2 -rf
s939 ~ # ln -s /chroot/var/run/apache2 /var/run/
Ho aggiunto anche il link a mysqld non perché sia indispensabile allo script di init, ma perché dà noia ad alcune utility in linea di comando di mysql (come ad esempio lo stesso comando `msql`), per qualche ragione su cui non ho indagato...
Che noia. /var/run viene svuotata ad ogni riavvio? Non so, trovate una soluzione. Per esempio aggiungete i due link in /etc/conf/local.start.
Però il sito funziona da schifo? Lo so. Era chiaro. Non è che state chiedendo troppo?
Ci sono infatti diverse cose da fare ancora.
Prima di tutto, il modulo di sicurezza sta funzionando. E non è che questo sia completamente una buona cosa.
Il guasto è che funziona troppo. Provate, ad esempio, a registrare un nuovo utente. A parte gli scarabocchi sul browser, i log strillano così:
Code: Select all
s939 ~ # tail -n 1 /var/log/apache2/error_log
[Tue Jan 24 18:15:18 2006] [error] [client 172.16.200.127] mod_security: Access denied with code 500. Pattern match "multipart/form-data" at HEADER [hostname "cloc3.dyndns.org"] [uri "/birraelattuga/profile.php"]
Code: Select all
# SecFilterScanPOST On
#SecFilterSelective "HTTP_CONTENT_TYPE" multipart/form-data
# SecFilterSelective ARGS_VALUES 888
Siate prudenti. Ogni commento ai controlli di sicurezza diminuisce le potenzialità di filtro di mod_security. D'altra parte, bisogna cercare un equilibrio con le esigenze primarie di funzionalità. Riferitevi sempre alla documentazione se vi sembra di non saper bene quello che state facendo.
3. Spedire e-mail.
E adesso. Anche le e-mail? Ma non siete già stufi di seguirmi?
Ma sapete usare ssmtp? Anche con google?
Se no, fatevi una ricerchina sul forum.
Code: Select all
s939 ~ # echo ""|ssmtp pluto@gmail.com
Ma ssmtp va compilato nel chroot (fuori serve solo di esercizio). E bisogna avere anche una shell:
Code: Select all
s939 ~ # chroot # USE="-* ssl readline" FEATURES="nodoc noman noinfo" ROOT=/chroot/apache INSTALL_MASK="*.h" emerge ssmtp sash -a
These are the packages that I would merge, in order:
Calculating dependencies ...done!
[ebuild N ] net-mail/mailbase-1 to /chroot/apache/
[ebuild N ] dev-libs/openssl-0.9.7e-r2 to /chroot/apache/
[ebuild N ] mail-mta/ssmtp-2.61 to /chroot/apache/
[ebuild N ] app-misc/ca-certificates-20050804 to /chroot/apache/
[ebuild N ] app-shells/sash-3.7-r1 to /chroot/apache/
Code: Select all
s939 ~ # ln -s sash /chroot/apache/bin/sh
s939 ~ # /etc/init.d/apache2 restart
Osservate che la cartella apache/lib/ è ancora vuota. Infatti mancono i binari delle glibc. A me pare che questi siano indispensabili:
Code: Select all
s939 chroot # ls -lR /chroot/apache/lib/
/chroot/apache/lib/:
total 368
-rwxr-xr-x 1 root root 107378 gen 24 08:32 ld-2.3.5.so*
lrwxrwxrwx 1 root root 11 gen 24 22:20 ld-linux-x86-64.so.2 -> ld-2.3.5.so*
-rwxr-xr-x 1 root root 23216 gen 24 08:32 libcrypt-2.3.5.so*
lrwxrwxrwx 1 root root 17 gen 24 22:20 libcrypt.so.1 -> libcrypt-2.3.5.so*
lrwxrwxrwx 1 root root 13 gen 24 22:20 libc.so.6 -> libc-2.3.5.so
-rwxr-xr-x 1 root root 11240 gen 24 08:32 libdl-2.3.5.so*
lrwxrwxrwx 1 root root 14 gen 24 22:20 libdl.so.2 -> libdl-2.3.5.so*
-rwxr-xr-x 1 root root 84688 gen 24 08:32 libnsl-2.3.5.so*
lrwxrwxrwx 1 root root 15 gen 24 22:20 libnsl.so.1 -> libnsl-2.3.5.so*
-rwxr-xr-x 1 root root 19144 gen 24 08:32 libnss_dns-2.3.5.so*
lrwxrwxrwx 1 root root 19 gen 24 22:20 libnss_dns.so.2 -> libnss_dns-2.3.5.so*
-rwxr-xr-x 1 root root 44336 gen 24 08:32 libnss_files-2.3.5.so*
lrwxrwxrwx 1 root root 21 gen 24 22:20 libnss_files.so.2 -> libnss_files-2.3.5.so*
-rwxr-xr-x 1 root root 73800 gen 24 08:32 libresolv-2.3.5.so*
lrwxrwxrwx 1 root root 18 gen 24 22:20 libresolv.so.2 -> libresolv-2.3.5.so*
drwxr-xr-x 2 root root 112 gen 24 11:08 tls/
/chroot/apache/lib/tls:
total 1225
-rwxr-xr-x 1 root root 1252640 gen 24 08:32 libc-2.3.5.so*
lrwxrwxrwx 1 root root 13 gen 24 22:20 libc.so.6 -> libc-2.3.5.so*
In etc, bisogna in primo luogo aggiungere il file di configurazione di ssmtp, che avete provato in precedenza, nel sistema principale:
Code: Select all
s939 ~ # cp -a /etc/ssmtp/ssmtp.conf /chroot/apache/etc/ssmtp
Code: Select all
s939 ~ # cp -a /etc/hosts /etc/host.conf /etc/resolv.conf /etc/passwd /chroot/apache/etc
Code: Select all
s939 ~ # mknod /chroot/apache/dev/urandom c 1 9
s939 ~ # mknod /chroot/apache/dev/null c 1 3
4. Conclusioni.
Buona fortuna. Se non ho dimenticato nulla, potete spedire la prima e-mail con il vostro phpBB.



