Modifica delle autorizzazioni dell'host per gli utenti MySQL


44

Ho le seguenti sovvenzioni per un utente / database

mysql> SHOW GRANTS FOR 'username'@'localhost';
+---------------------------------------------------------------------------+
| Grants for username@localhost                                             |
+---------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'username'@'localhost' IDENTIFIED BY PASSWORD 'xxx' |
| GRANT ALL PRIVILEGES ON `userdb`.* TO 'username'@'localhost'              |
+---------------------------------------------------------------------------+

Per abilitare l'accesso esterno al database, devo cambiare localhost in %. Un modo per farlo sono REVOKEtutte le autorizzazioni e impostarlo di nuovo. Il problema è che esiste una password impostata che non conosco, quindi se revoco l'autorizzazione, non posso ripristinarla.

C'è un modo per cambiare il nome host localhostin %(e viceversa ) senza revocare l'autorizzazione stessa?

Risposte:


59

Se hai accesso al mysqldatabase, puoi modificare direttamente le tabelle delle sovvenzioni:

UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
FLUSH PRIVILEGES;

... e una UPDATEdichiarazione analoga per cambiarlo.

Inoltre potrebbe essere necessario apportare modifiche anche alla mysql.dbtabella:

UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';

Una piccola correzione (versione mysql Server: 5.7.5-m15 - MySQL Community Server): sia da phpmyadmin che dal prompt dei comandi mysql - AGGIORNAMENTO mysql. userSET Host= 'localhost' DOVE user. Host= '%' AND user. User= "XXXdbusr";
— Jadeye,

1
Per un database di produzione, starei attento con%, può essere un rischio per la sicurezza. Se disponi di più server Web, puoi anche utilizzare host con caratteri jolly come '192.168.0.%' O ''% .example.com ''. Un'altra opzione è quella di aggiungere lo stesso utente più volte per ciascun host o creare un utente con nome separato per server web.
— Okdewit,

Se, come me, ho cercato di consentire l'accesso come root su una macchina di test locale (RasPi nel mio caso), questo non funzionerà da MySQL 5.7. Vedi questa discussione
— Raul Pinto

@RaulPinto: quel thread sembra riguardare phpMyAdmin, che non è del tutto rilevante qui, ma è utile notare per le persone che lo usano solo.
— nickgrim,

Meglio usare la ben documentata dichiarazione RENAME USER
— Antonio Bardazzi,

6

La migliore risposta su StackOverflow che suggerisce di utilizzare RENAME USERquale copia dei privilegi dell'utente.

L'uso del linguaggio di controllo dei dati (istruzioni come GRANT, REVOKE, RENAME e così via) non richiede FLUSH PRIVILEGES;ed è richiesto in architetture come Galera o Replica di gruppo in cui le tabelle MyISAM non vengono replicate.


2

Mi sono imbattuto anche in questo, e la soluzione proposta non ha funzionato, dal momento che i privilegi specifici del database non sarebbero stati spostati. cosa ho fatto:

UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
FLUSH PRIVILEGES;

E "ha" funzionato?
— Pierre.Vriens,

1

Per modificare i privilegi, revoca innanzitutto tutte le autorizzazioni per l'utente

 revoke all privileges on *.* from 'username'@'localhost';

 grant SELECT,INSERT,UPDATE,DELETE ON `db`.* TO 'username'@'%';

 flush privileges;

Questo è esattamente il mio problema, non posso revocare l'autorizzazione a causa della password. Per favore leggi la mia domanda.
— Fu86,

È possibile impostare l'hash della password in modo che sia uguale a quello precedente tramite un aggiornamento. Non è necessario conoscere la password effettiva per farlo.
— drogart

0

Manca un sacco di tabelle se si dispone di privilegi diversi da semplicemente db (come tabelle o colonne, ecc.). A seconda delle concessioni dell'utente, potrebbe essere necessario aggiornare tutte queste tabelle o alcune:

UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.tables_priv SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.columns_priv SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.procs_priv SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.proxies_priv SET Host='%' WHERE Host='localhost' AND User='username';
FLUSH PRIVILEGES;
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.