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.