Repository 32bit  Forum
Repository 64bit  Wiki

Apache+PHP+MySQL in chroot jail: differenze tra le versioni

Da Slacky.eu.
m
(Modificato l'uso di upgradepkg. Non --root, ma ROOT=.)
Riga 208: Riga 208:
Se uno dei server va aggiornato ad una versione successiva, allora si
Se uno dei server va aggiornato ad una versione successiva, allora si
potrà eseguire semplicemente un:
potrà eseguire semplicemente un:
# upgradepkg --root /chroot_jail nome_pacchetto
+
# ROOT=/chroot_jail upgradepkg nome_pacchetto
Nel caso in cui vogliamo anche la possibilità di disinstallare
Nel caso in cui vogliamo anche la possibilità di disinstallare
Riga 245: Riga 245:
= Copyright - License =
= Copyright - License =
Autore: [[Utente:Spina|spina]] 00:00, 16 ago 2011 (CEST)
+
Autore: [[Utente:Spina|spina]] 22:42, 26 ago 2011 (CEST)
{{Information
{{Information
|GNU Free Documentation Licence
|GNU Free Documentation Licence

Versione delle 21:42, 26 ago 2011

Indice

Introduzione

In questo Wiki verrà spiegato come installare un server apache, l'interprete di scripting PHP e il server MySQL in un ambiente chroot. Tutto ciò che serve è una distribuzione Slackware con i suoi tool di installazione dei pacchetti.

Nota:
Questa procedura è stata eseguita con una Slackware 13.37, ma dovrebbe funzionare con qualsiasi versione di Slackware. Ovviamente bisogna stare attenti alle modifiche fatte ai file di configurazione e ai pacchetti che vengono listati, poiché sia i primi che i secondi potrebbero differire da versione a versione.

Perché farlo?

Se si vuole eseguire un server apache accedibile da qualsiasi utente sul web è utile che esso giri all'interno di una prigione (jail) in modo che se qualche malintenzionato riesce ad avere un accesso al filesystem tramite, ad esempio, di un bug di qualche software PHP installato (uno per tutti, Joomla), il nostro aggressore si ritroverà in un ambiente senza diritti e senza la possibilità di fare grandi danni.

In cosa differesce questo wiki dalle altre guide?

Leggendo su internet le varie guide che suggeriscono come effettuare l'imprigionamento del server apache in un ambiente chroot (chroot jail, per l'appunto) si può notare come tutte tendano a rendere difficile una simile operazione cercando di rendere l'ambiente chroot il più ristretto possibile. Tutte le guide, quindi, suggeriscono di copiare e/o spostare solo i file necessari e nulla più. Ora, se da un certo punto di vista è preferibile avere nell'ambiente chroot il minor numero di software possibile e il minimo indispensabile per far eseguire al server apache tutte le sue funzioni, dall'altro lato copiare e spostare solo i file necessari rende scomoda l'aggiunta o l'aggiornamento del server stesso ad una versione più sicura.

Questo wiki invece punta a rendere la vita semplice a chi deve mantenere l'ambiente chroot aggiornato e facilmente modificabile. Lo scopo viene raggiunto tramite l'installazione, non di singoli file ma di interi pacchetti Slackware.

Inoltre, qui verrà installato nell'ambiente anche il server MySQL e l'interprete PHP, procedura che in genere non viene spiegata dalle guide per il chroot jail di apache. In effetti un server apache senza il supporto a MySQL non serve a molto nei giorni d'oggi.

Nota per i pignoli:
E' vero che il server MySQL è anche in grado di ascoltare connessioni via web e di accettare solo quelle dello stesso host. In questo caso invece si vuole rendere più sicuro il tutto facendo dialogare apache con mysql solo attraverso il socket locale.

La procedura

Come prima cosa bisogna creare un directory che conterrà l'ambiente chroot per i server che vogliamo installare:

# mkdir /chroot_jail

L'installazione dei pacchetti

Una volta creata la directory destinata a contenere tutto il nostro software, non ci resta che installare l'insieme minimo di pacchetti necessari a fare eseguire nel nostro ambiente:

  • il server apache con l'interprete PHP
  • il server MySQL

I pacchetti, relativi alla distribuzione Slackware 13.37 (viene indicata anche la directory che li contiene), sono:

  • a/aaa_base
  • a/aaa_elflib
  • a/coreutils
  • a/bash
  • a/etc
  • a/glibc-solib
  • a/grep
  • a/sed
  • a/util-linux
  • ap/mysql
  • l/apr
  • l/apr-util
  • l/libmcrypt
  • l/libxml2
  • n/cyrus-sasl
  • n/httpd
  • n/openssl
  • n/php

Questi pacchetti vanno installati eseguendo il comando:

# installpkg --root /chroot_jail nome_pacchetto

La configurazione post-installazione

In linea teorica è tutto fatto. La directory /chroot_jail contiene tutto il software necessario in circa 190MB di dati. Restano però ancora alcune piccole configurazioni da fare.

Attenzione:
In questo contesto non ci preoccupiamo di configurare il server apache o il server mysqld. Il wiki spiega come creare l'ambiente adatto a farli partire, non come configurarli al meglio.

Gli rc per l'halt dei server

Purtroppo i file rc dei due server eseguono il comando killall per fermarli. Questo comando in un ambiente chroot non ha senso poiché in questo ambiente non esiste niente nella directory /proc. Vanno quindi modificati gli script rc in modo da fermare i server usando il comando kill.

Il server apache (rc.httpd)

Il file in questione è /chroot_jail/etc/rc.d/rc.httpd e vanno eliminate le due righe:

killall httpd
rm -f /var/run/httpd/*.pid

in questo caso il file rc ferma correttamente il server apache eseguendo il comando:

/usr/sbin/apachectl -k stop

quindi le due righe eliminate servono solo come meccanismo di sicurezza in più...noi invece siamo fiduciosi ;).

Il serve MySQL (rc.mysqld)

Si deve modificare il file /chroot_jail/etc/rc.d/rc.mysqld sostituendo la riga:

killall mysqld

con:

kill $(cat /var/run/mysql/mysql.pid)

I fusi orari

Affinché i nostri server riportino l'orario in maniera corretta occorre copiare nell'ambiente il file /etc/localtime con:

# cp /etc/localtime /chroot_jail/etc/localtime

Il generatore di numeri casuali

Il server apache necessita di generare dei numeri casuali per mitivi di sicurezza. Per fare questo è necessario copiare il device urandom:

# cp -a /dev/urandom /chroot_jail/dev/urandom

La risoluzione degli indirizzi

Molti script PHP necessitano l'uso del DNS per risolvere i domini internet. Questo sotto linux viene effettuato semplicemente facendo conoscere alle librerie (già installate) l'indirizzo IP del nostro DNS. Bisogna quindi copiare i file:

# cp /etc/resolv.conf /chroot_jail/etc/resolv.conf
# cp /etc/hosts /chroot_jail/etc/hosts
In oltre:
Ovviamente si possono copiare anche i file /etc/hosts.allow, /etc/hosts.deny e /etc/hosts.equiv.

Hostname

I log di apache e di MySQL contengono anche l'hostname della macchina su cui gira il server, quindi se vogliamo dare un nome al tutto possiamo anche copiare (e modificare) il file:

# cp /etc/HOSTNAME /chroot_jail/etc/HOSTNAME

Loggare l'output dei programmi usando syslogd

I programmi, sotto linux, inviano i propri messaggi al server syslogd attraverso l'uso del socket /dev/log=. Per far sì che anche i nostri programmi che vengono eseguiti nell'ambiente chroot possano inviare i messaggi al server syslogd bisogna avvisare quest'ultimo facendogli creare un socket anche nell'ambiente creato. Per fare questo bisogna modificare il file /etc/rc.d/rc.syslog facendo invocare il demone, anziché senza opzioni, con l'aggiunta dell'opzione -a. Quindi invece della riga:

/usr/sbin/syslogd

va inserita la riga:

/usr/sbin/syslogd -a /chroot_jail/dev/log

(la riga è corretta, non ci vuole il segno '=' dopo log).

Nota:
La creazione del socket non è necessaria per l'utilizzo dei soli server apache e MySQL, dato che questi ultimi hanno già i loro file di log.

La sicurezza non è mai troppa

Come si è visto, usando questa procedura l'ambiente chroot contiene un sacco di software (anche inutile) che potrebbe essere sfruttato da un malintenzionato che riesce ad ottenere l'accesso al filesystem. E' vero che il malintenzionato si trova in un ambiente chiuso, però possiamo rendergli la vita ancora più difficile rendendo tutto il software installato eseguibile solo all'utente root. Per fare questo basta eseguire il comando:

# chroot /chroot_jail bash -c 'IFS=:; for dir in $PATH; do [ -d $dir ] && chmod go-rx ${dir}/*; done'

Dobbiamo anche eliminare tutti gli utenti e tutti gruppi, a parte 'mysqld' e 'apache', dai relativi file /chroot_jail/etc/passwd, /chroot_jail/etc/shadow e /chroot_jail/etc/group. Questa operazione può essere fatta a mano oppure eseguendo il semplice comando:

# sed -i -n '/apache/p;/mysql/p' /chroot_jail/etc/passwd /chroot_jail/etc/shadow /chroot_jail/etc/group

Testare il tutto

Per testare se tutto è andato per il meglio non resta che avviare i relativi server con:

# chroot /chroot_jail/ /etc/rc.d/rc.mysqld start
# chroot /chroot_jail/ /etc/rc.d/rc.httpd start

Start e stop al boot/shutdown

Se vogliamo che i nostri server siano attivi al momento del boot e si fermino automaticamente allo shutdown, basta:

  • inserire i due comandi precedenti per l'avvio dei server nel file /etc/rc.d/rc.local
  • inserire i due comandi di stop dei server inserendo le righe seguenti nel file /etc/rc.d/rc.local_shutdown (se il file non esiste va creato):
chroot /chroot_jail/ /etc/rc.d/rc.httpd stop
chroot /chroot_jail/ /etc/rc.d/rc.mysqld stop
Appunto:
Si noti l'oridine inverso rispetto allo 'start'. All'avvio va prima eseguito il server mysql e poi apache. Durante lo shutdown invece bisogna fermare prima il server apache e poi mysql.

Manutenzione

Come detto all'inizio, la forza di questa procedura sta nella manutenzione dei vari server. Se il server apache, ad esempio, necessita di qualche software aggiuntivo richiesto dai vari programmi PHP installati, allora non resterà altro da fare che installarglieli tramite il comando:

# installpkg --root /chroot_jail nome_pacchetto

Se uno dei server va aggiornato ad una versione successiva, allora si potrà eseguire semplicemente un:

# ROOT=/chroot_jail upgradepkg nome_pacchetto

Nel caso in cui vogliamo anche la possibilità di disinstallare alcuni pacchetti dall'ambiente, bisogna installare anche il pacchetto:

a/pkgtools

Questo perché il comando removepkg non accetta l'opzione --root. Una volta fatta questa operazione, per rimuovere un qualsiasi pacchetto installato nell'ambiente chroot sarà sufficiente dare un:

# chroot /chroot_jail removepkg nome_pacchetto

Software PHP e mail

Molti programmi PHP usano la funzione mail() per inviare posta. Questa funzione, sotto linux, fa uso del programma sendmail. E' ovvio quindi che se vogliamo far sì che anche questa funzione possa essere eseguita con successo, in linea teorica dovremmo installare anche il pacchetto sendmail nell'ambiente chroot.

Come alternativa alla soluzione precedente, PHP fornisce anche la classe SMTP per spedire le email, questa classe si connette ad un server SMTP invece che usare il comando sendmail. Dove è possibile settare i programmi PHP in modo da usare questa classe invece che la funzione mail(), si potrebbe anche optare per questa soluzione invece che installare sendmail nell'ambiente chroot.

Un'alternativa interessante

Per completezza di informazione va detto che il server apache ha già di suo la capacità di avviarsi in un ambiente chroot. Basta installargli il software aggiuntivo mod_chroot. Questa è un'ottima alternativa al problema della sicurezza del server apache. Comunque l'ambiente creato attraverso la proceduta spiegata in questo wiki rende possibile una separazione netta, in termini di software installato, tra ciò che vogliamo esporre al mondo via web e ciò che invece fa parte della nostra partizione root standard.

Copyright - License

Autore: spina 22:42, 26 ago 2011 (CEST)

GNU Free Documentation Licence
This article is released under the GNU Free Documentation Licence. You are welcome to copy and redistribute it (subject to certain conditions).
Strumenti personali
Namespace

Varianti