angelo.pezzullo
pubblicato più di 2 anni fa

Gestione dei privilegi di accesso a MySQL

L’articolo illustra la gestione dei privilegi di accesso ad un database MySQL con riferimento alle tabelle di MySQL di gestione dei privilegi, le logiche per il controllo dell accesso e la sintassi dei comandi GRANT e REVOKE.

Nota: L’articolo è un estratto da Manuale Essenziale MySQL del prof. Luciano Viviani

Le informazioni relative ai privilegi sono memorizzate nelle tabelle user, db, host, tables_priv e columns_priv nel database mysql, solo l’amministratore del sistema deve avere accesso a queste tabelle e deve utilizzarle con molta cautela dopo aver letto queste note.

Tipi di privilegio

Privilegio Nome della colonna Significato select Select_priv Perm. (Y) o vieta (N) l'operazione SELECT su una tabella insert Insert_priv Perm. o vieta l'operazione SQL INSERT su una tabella update Update_priv Perm. o vieta la modifica dei dati di una riga delete Delete_priv Perm. o vieta la cancellazione di una riga index Index_priv Perm. o vieta la creazione di un indice alter Alter_priv Perm. o vieta la modifica della struttura di una tabella create Create_priv Perm. la creazione di database, tabelle, indici drop Drop_priv Perm. l'eliminazione di tabelle o database grant Grant_priv Perm. di assegnare privilegi ad altri utenti references References_priv Perm. di creare riferimenti tra tabelle reload Reload_priv Ricarica o rinfresca le tabelle shutdown Shutdown_priv Può disattivare il servizio process Process_priv Può visualizzare e terminare i processi in corso file File_priv Perm. la lettura o scrittura di file interni

Questa tabella concede privilegi su tutto il contenuto dei database nel server, compreso mysql stesso. I permessi a questo livello (valori Y nei campi di privilegio) dovrebbero essere concessi solo agli amministratori del sistema, un utente normale dovrebbe quindi contenere tutti N in questi campi. Una gestione corretta viene gestita dai comandi GRANT e REVOKE.

Come lavora il sistema di privilegi di MySQL

  1. Il privilegio viene accordato in funzione del NomeUtente e del nome del computer da cui ci si collega, l’identificazione viene fatta con entrambi i valori
  2. Nel caso in cui utente@computer abbia diritto di accesso ogni operazione sul database viene controllata con i diritti d’accesso per quell’operazione

Il server usa le tabelle user, db, host per controllare gli accessi, i campi delle tabelle sono i seguenti:

Nome tabella user db host Campi di scopo Host Host Host User Db Db Password User Select_priv Select_priv Select_priv Insert_priv Insert_priv Insert_priv Campi di privilegi Update_priv Update_priv Update_priv Delete_priv Delete_priv Delete_priv Index_priv Index_priv Index_priv Alter_priv Alter_priv Alter_priv Create_priv Create_priv Create_priv Drop_priv Drop_priv Drop_priv Grant_priv Grant_priv Grant_priv References_priv Reload_priv Shutdown_priv Process_priv File_priv

Per controllare il diritto a compiere determinate operazioni vengono consultate, per gli utenti che comunque hanno l’accesso anche le tabelle tables_priv e columns_priv.

Tabelle tables_priv columns_priv Campi di scopo Host Host Db Db User User Table_name Table_name Column_name Campi di privilegi Table_priv Column_priv Column_priv Altri campi Timestamp Timestamp Grantor

Ciascuna tabella contiene campi di scopo e di privilegio, i campi di scopo determinano il contesto cui si applicano i privilegi per ciascun record della tabella. Per esempio un record nella tabella user con i valori:

Host: uno.sistemi.net User: luciano

determinerà i privilegi dell’utente luciano, che accede da uno.sistemi.net, limitatamente al database anagrafe, in modo analogo funzionano le tabelle tables_priv e columns_priv. Tutti i confronti, tranne Host (compatibilità con Windows), tengono conto di maiuscole-minuscole. I campi di privilegio indicano quali operazioni possono essere compiute da un determinato utente, il server combina le informazioni nelle varie tabelle per creare una descrizione completa di ciascun utente, le regole saranno descritte in seguito. I campi di scopo sono stringhe di caratteri, dichiarati come segue, e con valore di default la stringa vuota.

Nome del campo Tipo del campo Host CHAR(60) User CHAR(16) Password CHAR(16) Db CHAR(64) CHAR(60) per le tabelle tables_priv e columns_priv Table_name CHAR(60) Column_name CHAR(60)

Nelle tabelle user, db e host tutti i campi di privilegio sono dichiarati ENUM (‘N’,’Y’) con valore di default ‘N’. Nelle tabelle tables_priv e columns_priv i campi di privilegio sono dichiarati come SET con i seguenti valori possibili:

Nome tabella Nome campo Elementi del SET tables_priv Table_priv 'Select','Insert','Update','Delete', 'Create','Drop','Grant','References', 'Index','Alter' tables_priv Column_priv 'Select','Insert','Update','References' columns_priv Column_priv 'Select','Insert','Update','References'

I tipi di dati ENUM e SET sono estensioni MySql, il primo è un elenco di valori (massimo 65535) di cui uno solo può essere attribuito alla variabile, il secondo è un oggetto di tipo stringa che può assumere zero o più valori(massimo 64) che devono essere scelti dalla lista .

In breve, il server usa le tabelle dei privilegi di accesso nel seguente modo:

  • I campi di scopo della tabella user determinano se accettare o rifiutare una connessione;
  • Se la connessione è accettata i privilegi indicati nel record delle tabella relativo all’utente si applicano a tutte le basi dati del server, sono cioè privilegi globali. in particolare i privilegi relativi all’amministrazione sono solo globali e si trovano solo in questa tabella;
  • Le tabelle db e host sono utilizzate insieme:
    • i campi di scopo della tabella db determinano quali utenti possono aver l’accesso, a quali basi dati e da quali host, i campi di privilegio determinano le operazioni ammesse.
    • La tabella host è usata come estensione della tabella db se si vuole che un utente, identificato dalla tabella db, possa accedere a un data base da più host. In questo caso il campo Host nella tabella db deve essere vuoto e per ogni host si deve creare un record nella tabella host.
    • Le tabelle tables_priv e columns_priv funzionano come db, a un livello di dettaglio maggiore.

Il server legge le tabelle dei diritti di accesso solo quando parte, se si desidera che le nuove impostazioni abbiano effetto senza far ripartire il server si deve eseguire l’istruzione FLUSH PRIVILEGES.

Controllo dell’accesso, Stadio1: verifica della connessione

Quando un utente tenta la connessione al server, il server esegue le seguenti verifiche:

  1. host dal quale l’utente si connette;
  2. nome dell’utente;
  3. password;

Se l’identità è accertata correttamente la connessione viene stabilita e il server passa allo stadio 2, altrimenti la connessione viene rifiutata. La verifica viene eseguita impiegando i tre campi di scopo della tabella user: Host, User e Password nel seguente modo:

  • Il campo Host deve contenere un nome di host, ‘localhost’ o un indirizzo IP;
  • Si può usare il carattere jolly % o lasciare il campo vuoto, in quest’ultimo caso tutti gli host sono accettati;
  • Nel campo User non sono accettati caratteri jolly, se viene lasciato vuoto qualsiasi nome utente viene accettato;
  • Il campo Password può essere vuoto, in questo caso l’utente può connettersi senza specificare una password;
  • Le password sono crittografate mediante la funzione PASSWORD;

Esempi di host e utenti

Host User Valori accettati nella connessione 'uno.sistemi.net' 'luciano' luciano quando si connette da uno.sistemi.net 'uno.sistemi.net' '' chiunque si connetta da uno.sistemi.net '%' 'luciano' luciano, da qualunque host si connetta '%' '' chiunque si connetta da qualsiasi host '%.sistemi.net' 'luciano' luciano, che si connette da un host qualsiasi del dominio sistemi.net '192.168.1.1' 'luciano' luciano, quando si connette da 192.168.1.1 '192.168.1.%' 'luciano' luciano, quando si connette da un host nella rete di classe C 192.168.1

Può capitare il caso che una connessione sia verificata da più record nella tabella, dato che l’identificazione deve essere unica il server procede come segue:

  1. La tabella viene ordinata in memoria mettendo prima le indicazioni più specifiche e dopo le più generiche, per esempio, nella nostra tabella, le righe più specifiche sono la prima e la sesta (la corrispondenza deve essere esatta), mentre la quarta è la più generica;
  2. Viene usata la prima corrispondenza trovata (cioè la più specifica tra quelle che verificano la connessione);
  3. Nell’ordinamento il campo Host viene usato per primo, a parità di host si utilizza il campo User.

Controllo dell’accesso, Stadio2: verifica delle richieste

Stabilita la connessione, il server entra nel secondo stadio. Per ogni richiesta (comando SQL) verifica se l’utente ha sufficienti privilegi per eseguirla. La verifica viene fatta, controllando nell’ordine le tabelle:

  1. user se il permesso è concesso la richiesta viene eseguita, altrimenti si prosegue con:
  2. db se il permesso è concesso la richiesta viene eseguita, altrimenti si prosegue con:
  3. host se il permesso è concesso la richiesta viene eseguita, altrimenti si prosegue con:
  4. tables_priv se il permesso è concesso la richiesta viene eseguita, altrimenti si prosegue con:
  5. columns_priv se il permesso è concesso la richiesta viene eseguita, altrimenti rifiutata

Come si vede, si procede dal permesso più generale al più specifico, è quindi se voglio concedere un permesso solo a livello più basso (per esempio per una specifica colonna) devo negarlo a tutti i livelli più alti. Le tabelle che concedono l’accesso sono normalmente manipolate con i comandi GRANT e REVOKE.

Sintassi di GRANT e REVOKE

I comandi SQL GRANT e REVOKE servono a concedere o revocare permessi ad un utente, GRANT crea anche un nuovo utente, se questo non esiste.

GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {tbl_name | * | *.* | db_name.*} TO user_name [IDENTIFIED BY 'password'] [, user_name [IDENTIFIED BY 'password'] ...] [WITH GRANT OPTION] REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {tbl_name | * | *.* | db_name.*} FROM user_name [, user_name ...] priv_type //deve essere specificato con le seguenti parole chiave ALL PRIVILEGES FILE RELOAD ALTER INDEX SELECT CREATE INSERT SHUTDOWN DELETE PROCESS UPDATE DROP REFERENCES USAGE

USAGE serve per creare un utente senza alcun privilegio, REFERENCES non è attualmente implementato.Un utente con l’opzione grant (WITH GRANT OPTION) può attribuire e revocare privilegi agli altri, per toglierli questa possibilità si usa REVOKE GRANT OPTION ONFROM; Ovviamente, oltre ad essere corretta sintatticamente, l’istruzione deve anche tener conto del sistema di protezione prima spiegato, per esempio FILE o SHUTDOWN non hanno alcun senso a livello di tabella. Nella clausola ON il simbolo “asterisco” si riferisce al database corrente (o ai privilegi globali se non c’è alcun database corrente), “asterisco.asterisco” indica privilegi globali, db_name.* si riferisce al database db_name. Il nome dell’utente può essere specificato nella forma utente@host usando eventualmente caratteri jolly o indirizzi IP, in tal caso la stringa deve essere tra virgolette (esempio luciano@”192.168.1.%” ).

Nota:

L’articolo è un estratto da Manuale Essenziale MySQL del prof. Luciano Viviani. Il documento originale è presente al seguente link: http://www.itiseuganeo.it/materiale/abstract.asp?COD=2

Condividi su:

Esprimi un voto:

  • Current rating: 0.0/5
  • 1
  • 2
  • 3
  • 4
  • 5

Argomenti chiave:

Ultimi commenti Ultimi commenti

Esegui il Login oppure registrati per scrivere un commento.
Cerca nel sito...
Ultime recipes

Un utilissimo tool di shell che effettua un dettagliato e comodo report su MySQL MySQL Report un tool di shell per tenere tutto sotto controllo

Un utilissimo tool di shell che effettua un dettagliato e comodo report su MySQL


Vai alla recipe

Un utilissimo tool per sniffare il traffico Client/Server TCP/IP di MySQL MySQLSniffer sniffare il traffico TCP di MySQL

Un utilissimo tool per sniffare il traffico Client/Server TCP/IP di MySQL


Vai alla recipe

Verificare l'integrità, riparare gestire chiavi e memoria di tabelle MyISAM attraverso myisamchk riparare file MyISAM

Verificare l'integrità, riparare gestire chiavi e memoria di tabelle MyISAM attraverso il file myisamchk


Vai alla recipe

Un tool per comprimere le tabelle MyISAM fino a oltre il 50% myisampack comprimere file MyISAM

Un tool per comprimere le tabelle MyISAM fino a oltre il 50%


Vai alla recipe

mysqlshow le info di base sui database, tabelle e colonne senza utilizzare alcun mysqlshow visualizzare le informazioni sul database MySQL

mysqlshow le info di base sui database, tabelle e colonne senza utilizzare alcun client


Vai alla recipe

Utilizzando UNION / UNION ALL su campi int unsigned zerofill,
ho notato che MysqlUNION / UNION ALL su campi int unsigned zerofill. di DebUsr
Vai al tip

Utilizzo di funzioni come alias di campo tramite l'impiego di prepared statementReport con alias di campo dinamici di john_revelator
Vai al tip

Può capitare che sia necessario eseguire un dump di database in formato Comma SeparatedEsecuzione dump in formato CSV (tabelle in engine MyIsam esportate in formato CSV) di ghigomatto
Vai al tip

E' possibile eseguire le query SQL contenute in un file di testo. Questo è utileEseguire le query da un file di testo di Sante Caserio
Vai al tip

Se vogliamo fare il backup di tutti i database con mysqldump, e ne abbiamo parecchiFare il backup di tutti i database di Sante Caserio
Vai al tip

Salve, dopo tante storie ho studiato il php e mysql .. . che in questo forum parlavo php e campo mysql timestamp di gigi Vai al topic

ciao a tutti ho creato un forum su aruba ma non so come farlo visualizzare nel mio aruba di albertodiprima Vai al topic

Salve a tutti gente, questo è il mio primo post su questo forum e questo a causa Problema Gravissimo con AutoIncrement di stefanoadsl Vai al topic

Salve! Mi presento, mi chiamo Adriano e sono uno studente di ingegneria informatica Problema Trigger di Xanakro Vai al topic

Ciao a tutti!
Volevo chiedere una informazione.
Ho una query che lanciata la prima Query Eseguita più volte di OltreLeStelle Vai al topic