MYSQL e PHP 5.
Mauro Goretti e Aramini Parri Lucia |
MYSQL e PHP 5.
MySQL è un database relazione
largamente adoperato nella scrittura di siti e Web Application
soprattutto insieme al suo ormai consolidato braccio destro
linguaggio di programmazione PHP.
La sintassi adoperata è la SQL,
attraverso cui è possibile gestire dati memorizzati sottoforma di
database regolati dal modello relazionale. Come per Apache,
l'installazione su Debian Lenny è un
gioco da ragazzi. Da shell, con
privilegi di root, invocheremo nuovamente apt-get come di seguito:
# apt-get install mysql-server
Al termine della
procedura di installazione imposteremo una password per MySQL
relativa all'utente root digitando da shell:
# mysqladmin -u root password
'PASSWORD'
Sostituendo,
naturalmente, 'PASSWORD' con la nostra password e mantenendo le
virgolette.
PHP, giunto alla
release 5 e prossimo alla sesta (per quanto in questa direzione il
progetto sembra
aver trovato una
battuta di arresto) è tra i principali linguaggi adoperati per lo
sviluppo di siti e Web
Application. La
sua forza sta nella sua semplicità e nel fatto di poter contare su
una comunità di
sviluppatori
pressoché infinita. Installiamolo pertanto insieme al worker per
MySQL ed alla security patch “Suhosin” del progetto Hardened PHP:
# apt-get install php5 php5-mysql
php5-suhosin
Concluso il
processo di installazione andremo ad evitare alcune direttive del
file di configurazione
dell'interprete al
file di limitarne le capacità ed, in questo modo, garantire maggiore
sicurezza .
Il file di nostro
interesse è “/etc/php5/apache2/php.ini”. Per ogni riga
da editare offriremo una breve spiegazione di quel che andiamo a
fare. In primo luogo disattiviamo la direttiva Safe Mode
(deprecata a
partire dalla release 5.3 di PHP). Essa si occupava di limitare la
libertà del singolo
utente in contesti
server-shared, ovvero impedire che gli script di X user potessero
interferire con
quelli di Y user
dal momento che entrambi sono letti dal webserver dallo stesso utente
relativo al
demone Apache
(www-data) e con gli stessi privilegi (di solito di sola esecuzione
+x). La patch
Suhosin mette a
punto a questo come a tanti altri cavilli che spesso affliggono Web
Server in produzione in presenza di sorgenti PHP fallati.
safe_mode = Off
safe_mode_gid = Off
Restringiamo il
raggio d'azione delle direttive di inclusione utilizzabili negli
script alla sola directory radice del server web .
open_basedir = /var/www
Disabilitiamo
alcune funzioni del linguaggio che consentono di eseguire comandi sul
server dal
momento che, nel
90% dei casi, non servono e rappresentano esclusivamente una
possibile criticità:
disable_functions = exec, passthru,
shell_exec, system, proc_open,popen,
curl_exec, curl_multi_exec,
parse_ini_file,
show_source, php_uname, getmyuid,
getmypid, leak, listen,
diskfreespace
Disattiviamo la
segnalazione degli errori in modo da limitare l'eventuale fuga di
informazioni in
caso di errori
imprevisti nel codice e tentativi di attacco di tipo SQL Injection:
display_errors = Off
Assicuriamoci che
la direttiva Register Globals sia disattivata. Questo modo di
sviluppare appartiene ormai all'archeologia, occupandosi di
utilizzare variabili HTTP senza specificare la provenienza delle
stesse. Nel caso ad esempio della variabile “pippo” ricevuta via
GET era possibile richiamare la stesse come $pippo piuttosto che
$_GET['pippo']. La conseguenza di ciò è
facilmente
intuibile potendosi riferire, da parte di un attaccante, ad una
variabile adoperata nel nostro sorgente richiamandola semplicemente
via URL:
register_globals = Off
Per quanto non sia
una risposta definitiva agli attacchi di tipo “remote file
inclusion” (in quanto
l'unica concreta
protezione contro questa tipologia di attacchi è data dalla patch
Suhosin) è comunque raccomandabile disabilitare l'inclusione da URL
e l'apertura di file da remoto negli script:
allow_url_fopen = Off
allow_url_include = Off
Qualora non vi sia
l'esigenza di consentire l'upload di file via PHP disabilitiamo
questa funzionalità
(file_uploads =
Off), viceversa indichiamo un percorso dove conservare i file
temporanei (entro il quale magari attiveremo un controllo Antivirus
costante) e la dimensione massima degli stessi
(un valore
accettabile, ai tempi del Web 2.0, può essere 8 Mb):
upload_tmp_dir = /tmp/php_uploads
upload_max_filezize = 8M
Indichiamo un
percorso non standard entro il quale salvare le sessioni
eventualmente generate dagli
script in modo
tale che sia difficile riferirsi alle stesse da parte di un utente
con accesso shell:
session.save_path =
/tmp/php_sessions
Qualora non
strettamente necessario impediamo ad eventuali Javascript di poter
utilizzare le sessioni generate al fine di prevenire fastidiosi
attacchi di tipo XSS:
session.cookie_httponly = 1
ModChroot è
un'interessante patch per Apache che ci permette di restringere
l'environment entro
cui il server
opera ad una determinata directory. A differenza di una classica
operazione di chroot
di Apache, la mod
si occupa di avviare Apache in Jail senza dover ricostruire l'intero
albero di file
e librerie
necessarie per far funzionare il servizio. La chiamata di sistema
chroot() viene eseguita
quando le librerie
ed i file di log sono stati rispettivamente caricati ed aperti. In
prima istanza ci
occuperemo
pertanto di ricreare dei percorsi funzionanti per il server Web nella
directory “/var/www”:
# mkdir -p /var/www/var/www
# mkdir -p /var/www/tmp/php_uploads
# mkdir -p /var/www/tmp/php_sessions
# chown -R
www-data:www-data/var/www/tmp/
# mkdir -p /var/www/var/run/mysqld
# chown -R
mysql:mysql/var/www/var/run/mysqld/
# mkdir /var/www/etc
# cp /etc/resolv.conf/var/www/etc/
Modifichiamo ora
il file di configurazione di MySQL indicando il nuovo percorso per la
creazione
del socket e del
pid:
# vi /etc/mysql/my.cnf
[client]
port = 3306
socket =
/var/www/var/run/mysqld/mysqld.sock
…
[mysqld_safe]
socket =
/var/www/var/run/mysqld/mysqld.sock
nice = 0
…
[mysqld]
user = mysql
pid-file =
/var/www/var/run/mysqld/mysqld.pid
socket =
/var/www/var/run/mysqld/mysqld.sock
…
# vi /etc/mysql/debian.cnf
…
socket =
/var/www/var/run/mysqld/mysqld.sock
…
socket =
/var/www/var/run/mysqld/mysqld.sock
Stoppiamo e
riavviamo quindi il servizio MySQL controllando che il socket ed il
pid file siano stati
salvati nel nuovo
percorso:
# /etc/init.d/mysql stop
# /etc/init.d/mysql start
# Is
-na/var/www/var/run/mysqld/totale 12
drwxr-xr-x 2 107 116 4096 15 lug
17.34.
drwxr-xr-x 3 0 0 4096 15 lug 17.20..
-rw-rw----1 107 116 5 15 lug
17.34
mysqld.pid
srwxrwxrwx 1 107 116 0 15 lug
17.34
mysqld.sock
Provvediamo ora a
modificare opportunamente la configurazione di Apache per segnalare i
cambiamenti avvenuti. Editiamo il file “/etc/apache2/apache2.conf”
modificando il file relativo
al percorso
dell'ID del processo (PID) ed abilitando ModChroot:
# vi /etc/apache2/apache2.conf
…
PidFile/var/run/apache2.pid
ChrootDir /var/www
…
Infine,
installiamo la mod digitando da shell:
# apt-get install
libapache2-mod-chroot
Commenti
Posta un commento
Ciao a tutti voi, sono a chiedervi se avete preferenze per Post di vostro interesse
in modo da dare a tutti voi che mi seguite un aiuto maggiore, grazie per la vostra disponibilità.