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

Post popolari in questo blog

INSTAFETCH - Android -

I pesci abissali. Zoologia marina.

La Centrale Idroelettrica.