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

Limitare i privilegi degli utenti in MySQL

Come gestire gli utenti di un database MySQL gestendone i permessi e limitandone le operazioni sulle risorse cui hanno accesso
Come gestire gli utenti di un database MySQL gestendone i permessi e limitandone le operazioni sulle risorse cui hanno accesso
Link copiato negli appunti

I privilegi sono degli attributi che vengono assegnati agli utenti dall'amministratore di un database manager in modo che questi abbiano la possibilità di effettuare determinate operazioni a carico di record e tabelle come per esempio modifiche, interrogazioni e manipolazioni dei dati.

In questa breve trattazione vedremo come i privilegi assegnati agli utenti possano essere limitati sulla base delle diverse esigenze di lavoro e di sicurezza.

Le diverse tipologie dei privilegi

Per assegnare dei privilegi agli utenti viene utilizzato il comando GRANT che può avere una sintassi anche estremamente composita:

GRANT privilegio [(lista_campi)] [, privilegio [(lista_campi)]] ... 
ON [oggetto] {nome_tabella | * | *.* | nome_database.*} 
TO utente [IDENTIFIED BY [PASSWORD] 'password'] [, utente [IDENTIFIED BY [PASSWORD] 'password']] ... [WITH  [opzioni] ...]

Il soggetto dei permessi, cioè colui che potrà sfruttarli è l'utente che avrà la possibilità di accedere alle funzioni consentite tramite la password che gli è stata assegnata; l'oggetto dei privilegi possono essere invece:

  • delle tabelle;
  • delle funzioni;
  • delle procedure.

Le opzioni sono dei limiti imposti alle operazioni consentite: un utente avrà per esempio la possibilità di effettuare un certo numero di interrogazioni in un determinato periodo di tempo oppure potrà usufruire di un numero di connessioni assegnate in un intervallo di tempo predefinito

Utilizzando le istruzioni basate su GRANT, l'amministratore del database potrà creare degli utilizzatori dotati di privilegi che potranno essere rimossi attraverso il comando REVOKE; assegnare e revocare continuamente dei privilegi potrebbe risultare abbastanza scomodo, soprattutto dovendo gestire numerosi account, vi è quindi la possibilità di associare ai privilegi delle opzioni in grado di definire dei limiti che sono nello stesso tempo fattuali, quantitativi e temporali.

Le prime limitazioni sono imposte dal livello dei privilegi disponibili; è possibile distinguere i diversi livelli di privilegio in cinque categorie che si differenziano sulla base dell'estensione stessa dei permessi accordati agli utenti. Le vediamo nella pagina successiva.

I privilegi degli utenti

1 - Privilegi globali: si tratta di privilegi che vengono applicati su tutti i database disponibili per un determinato Database server, le infomazioni relative a questa tipologia di permessi sono allocate nella tabella relativa agli utenti del database MySQL. I privilegi globali possono essere attribuiti attraverso una wildcard (*.*) che indica genericamente tutti i database coinvolti:

GRANT ALL ON *.*

2 - Privilegi su specifici database: in questo caso i privilegi si estendono soltanto sugli elementi che compongono una determinata base di dati; le informazioni su questo tipo di privilegi sono allocate nella tabelle db e host del Database manager, per assegnarli basta associare al comando GRANT il nome del database coinvolto:

GRANT ALL ON nome_database.*

3 - Privilegi su specifiche tabelle: sono privilegi applicati su tutti gli elementi relativi a determinate tabelle le cui informazioni sono memorizzati nelle tabella table_priv del Database manager; si assegnano passando al comando GRANT un parametro costituito da una concatenazione tra il nome della tabella e il nome del database di appartenenza:

GRANT ALL ON nome_database.nome_tabella

4 - Privilegi su specifici campi: sono privilegi che permettono di operare soltanto su determinati campi all'interno di una tabella; a differenza dei privilegi precedenti questi sono invece memorizzati nella tabella columns_priv; per ottenerli è sufficiente passare come argomento a GRANT il nome dei campi interessati.

5 - Privilegi a livello di routine: consentono di assegnare agli utenti la possibilità di utilizzare istruzioni contenenti comandi come CREATE ROUTINE, EXECUTE etc; possono essere forniti sia a livello globale che su specifici database; le informazioni relative a questo tipo di privilegi sono conservate nella tabella procs_priv.

Privilegi quali per esempio FILE, PROCESS, RELOAD, SHUTDOWN, SHOW DATABASES, SUPER sono da considerarsi come attributi amministrativi e possono essere assegnati soltanto a livello globale.

Limitare le risorse per gli utenti

A partire dalla versione 5.0 di MySQL è stato possibile imporre agli utilizzatori delle restrizioni sul loro accesso alle risorse ed in particolar modo relativamente a:

  • il numero di interrogazioni che è possibile effettuare ogni ora (campo: max_questions);
  • il numero di aggiornamenti che è possibile effettuare ogni ora (campo: max_updates);
  • il numero di volte per ogni ora che un determinato account può connettersi al DBMS (campo: max_connections);
  • il numero di connessioni simultanee disponibili per ogni account (campo: max_user_connections).

Quindi, ogni istruzione inviata da uno o più client verrà conteggiata fino al raggiungimento del numero di query stabilito dalle limitazioni imposte per mano dell'amministratore relativamente all'utente che le stabilisce, lo stesso si avrà nel caso di limitazioni per gli update e così via.

Un discorso a parte meritano i limiti che è possibile fissare sul numero di connessioni simultanee per ciascun account: infatti, prima della versione 5.0.3 di MySQL un utente aveva la possibilità di effettuare connessioni da qualsiasi host appartenente ad un determinato dominio quando l'host non era stato specificato. Per fare un esempio, se l'host era specificato con il valore %.dominio.it, l'utente aveva la possibilità di effettuare connessioni simultanee da differenti host quali host1.dominio.it e host2.dominio.it e i limiti imposti dall'amministratore venivano applicati separatamente per ciascuna connessione. Da MySQL 5.0.3 qualcosa è cambiato.

A partire dalla versione 5.0.3 di MySQL, invece, le limitazioni a carico delle connessioni disponibili vengono applicate contemporaneamente su tutte le connessioni richieste e stabilite da un account per un qualsiasi host relativo ad uno specifico dominio. In ogni caso sarà possibile utilizzare il sistema di limitazione delle risorse disponibile nelle versioni precedenti avviando il Database server una volta selezionata l'opzione --old-style-user-limits.

Le limitazioni appena elencate possono essere imposte attraverso una semplice istruzione basata sul comando GRANT:

mysql> GRANT ALL ON data.* TO 'claudiogarau'@'localhost'
IDENTIFIED BY 'claudio'
WITH MAX_QUERIES_PER_HOUR 30
MAX_UPDATES_PER_HOUR 15
MAX_CONNECTIONS_PER_HOUR 10
MAX_USER_CONNECTIONS 4;

La clausola WITH permette di introdurre i nomi dei campi che si desidera coinvolgere nelle limitazioni, per ognuno di essi viene specificato un valore numerico intero (30 query per ora, 15 aggiornamenti per ora e così via).

Se l'istruzione non contiene la clausola WITH i primi tre limiti indicati assumeranno un valore pari a zero (che significa nessuna limitazione); anche il campo MAX_USER_CONNECTIONS sarà pari a zero ma per stabilire il numero di connessioni disponibili verrà utilizzato invece il valore della variabile di sistema max_user_connections.

Per configurare o modificare un limite definito dall'amministratore per un account, è possibile utilizzare il comando GRANT USAGE anche a livello globale; se per esempio si desidera aumentare il numero di aggiornamenti disponibili per l'utente claudio fino al limite di 40, è possibile utilizzare la seguente istruzione:

mysql> GRANT USAGE ON *.* TO  'claudiogarau'@'localhost'
MAX_UPDATES_PER_HOUR 40;

Grazie all'istruzione indicata, sarà possibile modificare il valore del limite imposto per gli update, nello stesso tempo, i privilegi associati all'account non verranno intaccati in nessun modo.

Per eliminare del tutto un limite precedentemente imposto, sarà possibile utilizzare nuovamente il comando GRANT USAGE impostando su zero il valore relativo al limite:

mysql> GRANT USAGE ON *.* TO 'claudiogarau'@'localhost'
WITH MAX_QUERIES_PER_HOUR 0;

Basandosi sull'esempio fatto in precedenza, quando un server è attivo esso ha il compito di conteggiare gli aggiornamenti effettuati nell'arco di un ora dall'utente specificato; se il limite imposto dovesse essere superato, il database manager si occuperebbe di rigettare tutte le ulteriori interrogazioni lanciate durante l'ora considerata restituendo un messaggio di errore come notifica per l'utilizzatore.

È bene tenere conto che le risorse disponibili per ogni utente vengono distribuite per account e non per client, quindi non sarà possibile eludere i controlli sui limiti effettuati dal database manager utilizzando più client: se per esempio un determinato account ha un limite di update pari a 40, due client non potranno richiedere 41 aggiornamenti se provenienti dallo stesso utente.

Conclusioni

In questa breve trattazione è stato affrontato l'argomento relativo alle limitazioni che l'amministratore di un Database manager può imporre sui privilegi associati agli account che possono avere accesso alla manipolazione di basi di dati, tabelle e record.

Per far questo sono stati trattati gli argomenti relativi ai diversi livelli di privilegio, alle tipologie di limitazioni e ai comandi che è possibile utilizzare per lanciare istruzioni con le quali imporre o rimuovere le limitazioni.

Per eventuali approfondimenti è possibile consultare l'apposita sezione dedicata alla limitazione delle risorse per gli account della guida ufficiale di MySQL.

Ti consigliamo anche