L'interazione client/server avviene attraverso la connessione del client al server con paradigma di autenticazione basato su username/password (in chiaro). La lista di utenti, password e permessi relativi a MySQL è immagazzinata in alcune sue tabelle:
- user: elenca account, host, password e privilegi globali (ossia validi per tutte le tabelle) degli utenti che possono connettersi al database server, nonché le opzioni sull'SSL e sull'utilizzo delle risorse;
- db: elenca account e relativi privilegi, database per database;
- tables_priv e columns_priv: specificano account e relativi privilegi a livello di singola tabella o colonna.
- root è l'account di amministrazione di MySQL; non ha nulla a che fare con l'account di Linux, se non per il nome e la capacità di provocare danni se mal usato...
È possibile modificarne il nome o crearne più d'uno. Ad ogni modo, root è l'unico utente che deve possedere il pieno controllo del server (operazioni SQL sulle tabelle, riavvio di mysqld
, eccetera), tutti i rimanenti utenti non devono possedere privilegi globali, ma locali alle tabelle che utilizzano (pensiamo a più programmi Web sul server, ciascuno abilitato ad eseguire query SQL sulle sole tabelle cui deve poter avere accesso).
Le regole generali sono:
- non utilizzare account senza password (soprattutto per root, ciò che è di default!);
- far accedere ogni applicazione o programma Web tramite un proprio utente;
- concedere ad ognuno i minimi privilegi possibili, il resto è "il male";
- concedere come detto privilegi per singoli database, facendo attenzione a che nessuno tranne root abbia accesso alla tabella mysql, che contiene le regole stesse di accesso;
- concedere il privilegio FILE con molta parsimonia, anzi bandirlo (permette di leggere sul filesystem del server Linux);
- ogni altro privilegio amministrativo dovrà esser dato con (molta) parsimonia.
Le tipologie dei privilegi sono:
Privilegi amministrativi:
Privilegio | Funzione |
---|---|
CREATE USER | permette di creare, cancellare e rinominare gli account utente; |
GRANT | permette di concedere i propri privilegi ad altri account; l'inverso è REVOKE; |
LOCK TABLES | permette di eseguire lock su tabelle (per il thread corrente); |
PROCESS | permette di visualizzare le informazioni sui thread in esecuzione sul server; |
REFERENCES | non usato; |
RELOAD | permette di ricaricare le tabelle dei permessi, svuotare i registri o la cache attraverso i relativi comandi; |
REPLICATION C/S | accorda il diritto di richiedere informazioni relative ai server di replica; |
SHOW DATABASES | permette di visualizzare la lista completa dei database; |
SHUTDOWN | permette di arrestare il server database; |
SUPER | permette di eseguire operazioni di amministrazione (MySQL permette connessioni anche oltre gli eventuali limiti imposti per utenti in possesso di tali privilegi). |
Privilegi per database, tabelle e colonne - struttura;
Privilegio | Funzione |
---|---|
ALTER | permette di alterare la struttura delle tabelle esistenti; |
ALTER ROUTINE | permette la modifica e la cancellazione di stored procedure memorizzate; |
CREATE | permette di creare nuove tabelle e database; |
CREATE TEMPORARY TABLES | consente di creare tabelle temporanee; |
CREATE ROUTINE | permette la creazione di stored procedures; |
CREATE VIEW | permette la creazione di nuove viste; |
DROP | permette di eliminare database e tabelle; |
EXECUTE | consente di eseguire stored procedures; |
INDEX | permette di creare ed eliminare indici; |
SHOW VIEW | permette la visualizzazione delle viste. |
Privilegi per database, tabelle e colonne - dati:
Privilegio | Funzione |
---|---|
DELETE | permette di cancellare righe nelle tabelle; |
FILE | consente di leggere e scrivere file sul filesystem (ove l'utente mysql ne ha i permessi); |
INSERT | permette di inserire righe nelle tabelle; |
SELECT | consente di estrarre righe dalle tabelle; |
UPDATE | permette di aggiornare i dati nelle tabelle. |
Non ci occuperemo dell'organizzazione interna delle tabelle user
, db
, tables_priv
e columns_priv
in quanto, per la configurazione degli account, useremo
un frontend grafico: phpMyAdmin.