Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Sicurezza MySQL con phpMyAdmin

Come utilizzare l'applicazione phpMyAdmin per rendere sicuro verso l'esterno un database MySQL
Come utilizzare l'applicazione phpMyAdmin per rendere sicuro verso l'esterno un database MySQL
Link copiato negli appunti

PhpMyAdmin è un'applicazione web scritta in PHP per la gestione di MySQL. Server database e Web server (più estensione PHP) possono o essere sulla stessa macchina di phpMyAdmin oppure si può usare un Web server esterno per la connessione remota al database in questione (è richiesta qualche semplicissima impostazione). Vediamo la prima ipotesi.

In poche semplici "mosse" creeremo ora come esempio un utente non amministrativo per l'interazione di un'ipotetica prima applicazione Web con MySQL. Dato che ogni applicazione Web sul server avrà il suo utente, i passi successivi ne saranno la copia.

Modifichiamo, però, prima di tutto, l'account dell'utente amministrativo di modo che abbia una password (molto forte). Una volta avviato, possiamo agevolmente utilizzare la voce Privilegi di phpMyAdmin ricordandoci di modificare la descrizione di tale account nel file libraries/config.default.php del programma di modo che questo possa riconnettersi al database nel futuro. Come azione predefinita infatti phpMyAdmin utilizza, come MySQL, una password nulla per l'utente root ed è per questo che, senza impostare nulla, è stato immediatamente in grado di operare la connessione coi massimi privilegi.

Dopo aver modificato l'account amministrativo aggiungiamo il primo utente non privilegiato, dotato di password robusta, che possa connettersi solamente da locale e senza privilegi globali, ma che abbia un discreto controllo sulla tabella rubrica.

Figura 2: aggiunta di un nuovo utente
aggiunta di un nuovo utente

Non sono stati inseriti limiti sulle risorse, cosa che sarebbe da fare, per la verità, ma valutando prima ogni effetto sull'usabilità del sistema complessivo. Una volta creato possiamo allora assegnare i limiti tramite l'opzione di modifica, come da figura

Figura 3: modifica dei privilegi per l'utente
modifica dei privilegi per l'utente

Volendo potremmo usare il controllo sui privilegi colonna per colonna:

Figura 4: privilegi colonna per colonna
privilegi colonna per colonna

Una volta terminate le modifiche è utile rinfrescare i privilegi del server direttamente da phpMyAdmin o riavviando mysqld.

Gli script PHP dovranno ora utilizzare questi account per la connessione al database; vediamo nel box in basso uno script di esempio su singola pagina:

<?php

$db_host = "localhost";
$db_user = "simpleclient_1";
$db_password = "le<fe4FR$%.f£:FRs2";
$db_options = "";

$db_name = "rubrica";

if ($db = @mysql_connect($db_host, $db_user, $db_password, 0, $db_options))
    {  
    if (@mysql_select_db($db_name, $db))
        {
        $query = "SELECT cognome FROM tabella_addetto WHERE cognome IS NOT NULL";
        if ($result = @mysql_query($query, $db)) 
            {
              while ($rslt = @mysql_fetch_array($result)) 
                echo strip_tags($rslt['cognome'])."<br/>";
              }
        else die ("Sintassi SQL errata.");
        }
    else die ("No database.");
    @mysql_close($db);          
    }
else die ("Errore nella connessione al database.");     
?>

Una nota su phpMyAdmin

PhpMyAdmin è un ottimo tool per la gestione del database anche in sede di produzione se le richieste di sicurezza non sono critiche. Non ha senso però proteggere l'accesso al database con password se poi possiamo averne accesso amministrativo liberamente dal Web o da LAN.

Allo scopo, nel file di configurazione di phpMyAdmin citato poco sopra, rimuoviamo username e password e commutiamo la voce auth_type in http. Ad ogni interazione con phpMyAdmin verremo forzati nell'inserire le credenziali per la sessione corrente.

Figura 5: inserimento delle credenziali di login
inserimento delle credenziali di login

Locale o remoto?

Definiti gli utenti che potranno connettersi al database ed i loro permessi, distinguiamo le due possibili fonti della comunicazione: da locale (localhost, come fatto nell'esempio di cui sopra) e da remoto (via LAN o VPN).

Di solito le connessioni tra PHP e MySQL avviene in locale, ovvero PHP (Apache) e MySQL girano sullo stesso server (fisico o virtuale): in questo caso è inutile che MySQL ascolti su porta TCP, dato che la comunicazione tra i due processi avviene attraverso il file di socket di dominio UNIX (di default MySQL ascolta su porta TCP ma limita le connessioni a 127.0.0.1, tramite la direttiva bind-address).

Possiamo quindi evitare che MySQL accetti connessioni di rete: nel suo file di configurazione my.cnf aggiungiamo la riga: skip-networking e riavviamo il server: con il solito comando /etc/init.d/mysql restart.

Al contrario, se è necessaria una connessione remota, è bene utilizzare un tunneling SSL nonché abilitare tramite firewall la stessa connessione alla porta TCP usata (default 3306) ai soli host previsti (via iptables locale ad esempio). Risulta chiaro, ma vale ribadirlo, che usare un tunnel SSL da/verso locale non ha senso, in quanto non ha alcuna implicazione sulla sicurezza della comunicazione.

Ti consigliamo anche