I comandi Linux: MySQL ( 2 ) | ALTRI capitoli | ||||||
I privilegi di accesso al database I sistemi MySQL, per decidere chi possa accedere a cosa, utilizzano uno speciale database, composto dalle cosiddette GRANT table, tabelle GRANT ( concedere, accordare ), nelle quali vengono memorizzati i privilegi di accesso. Le GRANT table, contenute nel database
Qualsiasi privilegio accordato in questa tabella (
La tabella
La tabella
E' possibile l'assegnazione di privilegi granulari, riferiti, addirittura, alle singole tabelle, alle singole colonne di ciascuna tabella e
alle singole funzioni ( stored routine ). All'interno delle tabelle
Il valore assegnato di default è N ( No ). In questi due esempi, vediamo che il super user ( root ) si vede assegnati tutti i privilegi nella tabella
Questi privilegi esprimono la possibilità di eseguire i comandi SQL SELECT, INSERT, UPDATE, DELETE, CREATE, DROP. Normalmente, sono legati al database, più che agli utenti, tanto è vero che, normalmente, un utente diverso da root non trova questi privilegi assegnati nella tabella
Esprime la possibilità di assegnare a terzi i propri privilegi.
Esprime la possibilità di creare e rimuovere indici.
Esprime la possibilità di eseguire il comando SQL ALTER TABLE.
Il privilegio FILE esprime la possibilità di leggere qualsiasi file, presente sul server MySQL, che sia leggibile da tutti, oppure che sia leggibile da MySQL. Da usare con estrema cautela! Per quanto riguarda le tabelle GRANT
Il privilegio REFERENCES, attualmente, non viene utilizzato. Il server MySQL carica in memoria, in fase di inizializzazione, il contenuto delle tabelle GRANT. Ogni decisione relativa all'accesso di un quasiasi utente viene presa in base alle tabelle caricate in memoria, con una serie di operazioni logiche. Sapendo che il valore di un privilegio può essere 0 ( zero ) oppure 1, corrispondenti a No oppure Si, avremo:
Questo significa che l'account " root ", o super user, dovrà avere le colonne dei privilegi della tabella
( MySQL 5.5 Reference Manual ) Il server MySQL, prima di accettare una richiesta di connessione, cerca una corrispondenza della coppia UserName e Password inviata dall'utente, all'interno della tabella:
In realtà, la prima ricerca che il server MySQL effettua, all'interno della tabella
In questo esempio, la prima riga ( record ) dice che l'utente
Quest'ordine è dovuto alla maggiore specificità dell'Host
Se ancora aveste dei dubbi, potreste effettuare una ulteriore verifica, controllando quale UserName avevate specificato voi, in fase di connessione. Questo è ciò che fa la funzione
In questo caso, i due output coincidono, indicando che l'utente ha effettuato correttamente, con l'account sperato, l'accesso al server MySQL. E' possibile prevedere l'ordine esatto nel quale il server MySQL attraversa la tabella
Lo stesso meccanismo di selezione vale anche per le tabelle:
per le quali, il server MySQL eseguirà:
Per assegnare i privilegi di accesso al server MySQL, è possibile modificare direttamente le tabelle interessate, oppure utilizzare il comando GRANT. Come abbiamo già visto, è possibile assegnare i privilegi a differenti livelli. Il livello più elevato è il livello amministrativo, che dovrebbe essere assegnato esclusivamente all'amministratore del sistema. Il livello amministrativo è conservato nella tabella:
Ciascun valore Y assegnato in questa tabella si applica a tutti i livelli sottostanti: database, tabella, colonna. Ecco perchè i privilegi assegnati a questo livello vengono definiti privilegi globali. Molti privilegi, quali FILE, PROCESS, RELOAD, SHOW DATABASES, SHUTDOWN, sono presenti in questa sola tabella, poichè sono privilegi globali, non applicabili ad oggetti con portata più limitata. Per indicare un privilegio globale, si rappresenta l'oggetto di destinazione con il simbolo:
Quindi, per assegnare privilegi globali, useremo il comando:
In questi due casi, stiamo assegnando tutti i privilegi ( ALL ), su tutti i database presenti sul server MySQL, all'utente "admin", mentre all'utente "ViceAdmin" stiamo assegnando solo i privilegi SELECT, INSERT, sempre su tutti i database presenti sul server MySQL. Per poter inviare il comando GRANT, è necessario ottenere il privilegio GRANT OPTION, oltre al privilegio o ai privilegi che si desidera assegnare.
Nella query è possibile inserire i caratteri jolly ( wildcard ), nella parte riservata al nome dell'host di provevienza dell'utente. Le seguenti sequenze sono tutte legali:
Non è possibile inserire i caratteri jolly ( wildcard ), nella parte riservata al nome dell'utente. Per definire un utente anonimo, lasciare vuoto il campo del nome utente:
Per assegnare privilegi a livelli inferiori, è sufficiente specificare il livello:
In questi due casi, stiamo assegnando tutti i privilegi ( ALL ), ma limitatamente al database "Ufficio", all'utente "admin" ed i soli privilegi SELECT, INSERT all'utente "ViceAdmin", sempre limitatamente al solo database "Ufficio".
In questi due casi, stiamo assegnando tutti i privilegi ( ALL ), ma limitatamente alla tabella "Opzioni", del database "Ufficio", all'utente "admin" ed i soli privilegi SELECT, INSERT all'utente "ViceAdmin", sempre limitatamente alla tabella "Opzioni", del database "Ufficio".
In questo caso, stiamo assegnando il solo privilegio SELECT all'utente "admin", ma limitatamente alla colonna ( campo ) "Commerciale", della tabella "Opzioni", del database "Ufficio".
In questo caso, stiamo assegnando il solo privilegio UPDATE all'utente "admin", ma limitatamente alle colonne ( campo ) "Uno" e "Due", della tabella "Opzioni", del database "Ufficio". Quando si specifica, all'interno della query:
quel termine ALL identifica TUTTI i privilegi previsti al livello specificato. Quindi, il termine ALL indica privilegi differenti, a seconda che l'operatore ON specifichi l'intero spazio del server MySQL, oppure un database, oppure una tabella di uno specifico database, oppure una colonna ( campo ) di una tabella di uno specifico database:
Esiste una clausola, WITH GRANT OPTION, che permette di cedere ad un utente, oltre ad uno specifico privilegio, anche la facoltà di trasferire ad un terzo utente tutti i privilegi detenuti ad uno specifico livello:
In questo esempio, un utente, probabilmente un super user, o root, assegna all'utente "admin" tutti i privilegi globali (
un utente sta assegnando il privilegio INSERT, per il database "Ufficio", all'utente "admin", oltre alla possibilità di trasferire il privilegio INSERT, per il database "Ufficio", ad un terzo utente. Se un domani, l'utente "admin" si vedesse assegnare, sempre per il database "Ufficio", anche il privilegio UPDATE, questo nuovo privilegio sarebbe esportabile quanto il privilegio INSERT. Il privilegio GRANT OPTION, è bene ripeterlo, permette l'assegnazione di privilegi di cui si sia già in possesso, per il livello specificato. La clausola WITH può essere usata anche per imporre restrizioni ai privilegi assegnati:
Se si desidera imporre restrizioni di accesso ad un utente, senza alterarne i privilegi, occorre specificare il privilegio USAGE, che indica che il comando GRANT non assegna alcun nuovo privilegio:
E' possibile assegnare privilegi per database e tabelle che ancora non esistono. Inoltre, sebbene, normalmente, un amministratore di sistema utilizzi il comando CREATE USER, per creare un account, per poi eseguire GRANT, per definirne i privilegi, è bene ricordare che GRANT, se non trova l'account di destinazione citato nella riga di comando, potrebbe crearlo ex novo, in determinate condizioni ( vedi la modalità NO_AUTO_CREATE_USER ). Per revocare uno o più privilegi assegnati, utilizzare il comando REVOKE. MySQL non revoca i privilegi automaticamente, quando viene eliminato un database o una tabella o una colonna. Bisogna ricordarsi di farlo manualmente. Questo comando SQL ( statement ):
elenca il comando ( o i comandi ) GRANT che deve essere eseguito ( o che devono essere eseguiti ) per duplicare i privilegi assegnati ad un utente. Per inviare lo statement al server MySQL, utilizziamo il comando
Se l'account per cui si chiede l'elenco dei privilegi è il proprio, è sufficiente utilizzare una delle seguenti sintassi:
In questo esempio, sono stati richiesti i privilegi assegnati ad un account anonimo. Il privilegio USAGE indica, in realtà, l'assenza di privilegi, per l'account indicato.
Il comando
Per poter eseguire questo comando, è necessario avere il privilegio globale per la creazione di utenti, CREATE USER, oppure il privilegio UPDATE per il database
è necessario detenere il privilegio GRANT OPTION, oltre ai privilegi che si desidera revocare.
|
|||||||
I comandi Linux: MySQL ( 2 ) | Le guide di .bit: contenuto originale |