MySql: concedi opzioni di sola lettura?


98

Ho un utente, a cui desidero concedere tutte le autorizzazioni di lettura su uno schema db.

Un modo è questo:

GRANT SELECT, SHOW_VIEW  ON test.* TO 'readuser'@'%';

C'è un modo per raggruppare tutte le operazioni di lettura in concessione?


Il privilegio è SHOW VIEW, no SHOW_VIEW, ma non è necessario concederlo a un utente a meno che non si desideri che sia in grado di accedere alle SHOW CREATE VIEWviste ... possono selezionare dalle viste con l'unico SELECTprivilegio. Cosa intendi per "raggruppa tutte le operazioni di lettura in concessione"?
Michael - sqlbot

Se esiste un singolo privilegio che sta per TUTTE le operazioni di LETTURA sul database. Capisco che stanno fornendo un accesso granulare, ma una comoda astrazione di alto livello ci avrebbe aiutato.
Ajeet Ganga

Risposte:


161

Se esiste un singolo privilegio che sta per TUTTE le operazioni di LETTURA sul database.

Dipende da come definisci "tutto letto".

"Leggere" da tabelle e viste è il SELECTprivilegio. Se questo è ciò che intendi con "tutto letto", allora sì:

GRANT SELECT ON *.* TO 'username'@'host_or_wildcard' IDENTIFIED BY 'password';

Tuttavia, sembra che tu intenda la capacità di "vedere" tutto, di "guardare ma non toccare". Quindi, ecco gli altri tipi di lettura che mi vengono in mente:

"Leggere" la definizione delle viste è il SHOW VIEWprivilegio.

"Leggere" l'elenco delle query attualmente in esecuzione da altri utenti è il PROCESSprivilegio.

"Leggere" lo stato di replica corrente è il REPLICATION CLIENTprivilegio.

Tieni presente che alcune o tutte queste informazioni potrebbero esporre più informazioni di quelle che intendi esporre, a seconda della natura dell'utente in questione.

Se questa è la lettura che vuoi fare, puoi combinare uno qualsiasi di questi (o qualsiasi altro dei privilegi disponibili ) in una singola GRANTdichiarazione.

GRANT SELECT, SHOW VIEW, PROCESS, REPLICATION CLIENT ON *.* TO ...

Tuttavia, non esiste un singolo privilegio che conceda un sottoinsieme di altri privilegi, che è quello che sembra che tu stia chiedendo.

Se stai facendo le cose manualmente e stai cercando un modo più semplice per farlo senza dover ricordare l'esatta concessione che di solito concedi per una certa classe di utenti, puoi cercare la dichiarazione per rigenerare le concessioni di un utente comparabile e cambiarla intorno per creare un nuovo utente con privilegi simili:

mysql> SHOW GRANTS FOR 'not_leet'@'localhost';
+------------------------------------------------------------------------------------------------------------------------------------+
| Grants for not_leet@localhost                                                                                                      |
+------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, REPLICATION CLIENT ON *.* TO 'not_leet'@'localhost' IDENTIFIED BY PASSWORD '*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' |
+------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

La modifica di "not_leet" e "localhost" in modo che corrispondano al nuovo utente che desideri aggiungere, insieme alla password, risulterà in un riutilizzabile GRANT un'istruzione per creare un nuovo utente.

Ovviamente, se si desidera che una singola operazione configuri e conceda il set limitato di privilegi agli utenti, e magari rimuova eventuali privilegi immeritati, è possibile creare una procedura memorizzata che incapsula tutto ciò che si desidera fare. All'interno del corpo della procedura, dovresti costruire il fileGRANT istruzione con SQL dinamico e / o manipolare direttamente le tabelle di concessione stesse.

In questa recente domanda sugli amministratori di database , il poster voleva la possibilità per un utente non privilegiato di modificare altri utenti, il che ovviamente non è qualcosa che può essere fatto normalmente - un utente che può modificare altri utenti lo è, praticamente per definizione, non un utente senza privilegi, tuttavia, le stored procedure hanno fornito una buona soluzione in quel caso, perché funzionano con il contesto di sicurezza del loro DEFINERutente, consentendo a chiunque abbia EXECUTEprivilegi sulla procedura di assumere temporaneamente privilegi intensificati per consentire loro di fare le cose specifiche procedura completa.


1
Grazie. A parte un'ottima risposta, mi è piaciuta anche la tua password. :)
Ajeet Ganga

2
Vale la pena notare: PROCESS e REPLICATION CLIENT sono tipi di privilegi "globali", quindi la sintassi fallirà se definita con un'esclusione "per database". GRANT PROCESS ON mydb. * Non sarebbe valido, ma GRANT PROCESS ON *. * Sarebbe OK.
Bee Kay

GRANT SELEZIONA SU db_name. * TO 'demo' @ '%' CON GRANT OPTION;
Musa

16
GRANT SELECT ON *.* TO 'user'@'localhost' IDENTIFIED BY 'password';

Questo creerà un utente con SELECTprivilegi per tutti i database, comprese le viste.


9

Diverse autorizzazioni che puoi concedere a un utente sono

ALL PRIVILEGES- This would allow a MySQL user all access to a designated database (or if no database is selected, across the system)
CREATE- allows them to create new tables or databases
DROP- allows them to them to delete tables or databases
DELETE- allows them to delete rows from tables
INSERT- allows them to insert rows into tables
SELECT- allows them to use the Select command to read through databases
UPDATE- allow them to update table rows
GRANT OPTION- allows them to grant or remove other users' privileges

Per fornire un'autorizzazione a un utente specifico, puoi utilizzare questo framework:

GRANT [type of permission] ON [database name].[table name] TO ‘[username]’@'localhost’;

Ho trovato questo articolo molto utile


3

Una guida passo passo che ho trovato qui .

Per creare un account utente di database di sola lettura per MySQL

Al prompt di UNIX, eseguire il programma della riga di comando MySQL e accedere come amministratore digitando il seguente comando:

mysql -u root -p

Digita la password per l'account root. Al prompt di mysql, eseguire una delle seguenti operazioni:

Per concedere all'utente l'accesso al database da qualsiasi host, digita il seguente comando:

grant select on database_name.* to 'read-only_user_name'@'%' identified by 'password';

Se il collector verrà installato sullo stesso host del database, digita il seguente comando:

grant select on database_name.* to 'read-only_user_name' identified by 'password';

Questo comando fornisce all'utente l'accesso in sola lettura al database solo dall'host locale. Se conosci il nome host o l'indirizzo IP dell'host su cui verrà installato il collector, digita il seguente comando:

grant select on database_name.* to 'read-only_user_name'@'host_name or IP_address' identified by 'password';

Il nome host deve essere risolvibile da DNS o dal file host locale. Al prompt di mysql, digita il seguente comando:

flush privileges;

genere quit .

Di seguito è riportato un elenco di comandi di esempio e messaggi di conferma:

mysql> grant select on dbname.* to 'readonlyuser'@'%' identified 
by 'pogo$23';
Query OK, 0 rows affected (0.11 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> quit

3

Anche l'utente ha ottenuto una risposta e @Michael - sqlbot ha coperto molto bene i punti nel suo post, ma manca un punto, quindi provo solo a coprirlo.

Se desideri fornire il permesso di lettura a un utente semplice (non di tipo amministratore):

GRANT SELECT, EXECUTE ON DB_NAME.* TO 'user'@'localhost' IDENTIFIED BY 'PASSWORD';

Nota: qui è richiesto EXECUTE, in modo che l'utente possa leggere i dati se è presente una procedura memorizzata che produce un report (ha poche istruzioni select).

Sostituisci localhost con un IP specifico da cui l'utente si connetterà al DB.

Ulteriori autorizzazioni di lettura sono:

  • SHOW VIEW: Se vuoi mostrare lo schema di visualizzazione.
  • CLIENTE DI REPLICA: Se l'utente deve controllare lo stato di replica / slave. Ma è necessario dare il permesso su tutti i DB.
  • PROCESSO: se l'utente deve controllare il processo in esecuzione. Funzionerà solo con tutti i DB.

1

Nota per MySQL 8 è diverso

Devi farlo in due passaggi:

CREATE USER 'readonly_user'@'localhost' IDENTIFIED BY 'some_strong_password';
GRANT SELECT, SHOW VIEW ON *.* TO 'readonly_user'@'localhost';
flush privileges;

Questa è l'unica soluzione che ha funzionato per me. Sembra che le altre soluzioni siano obsolete come hai detto. Grazie per aver fornito questa soluzione aggiornata.
Kyle Bridenstine

0

Se si desidera che la vista venga letta solo dopo aver concesso l'autorizzazione di lettura, è possibile utilizzare l'ALGORITMO = TEMPTABLE nella definizione della vista DDL.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.