Zmiana uprawnień hosta dla użytkowników MySQL

44

Mam następujące granty dla użytkownika / bazy danych

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'              |
+---------------------------------------------------------------------------+

Aby włączyć zewnętrzny dostęp do bazy danych, muszę zmienić localhost na %. Jednym ze sposobów, aby to zrobić, są REVOKEwszystkie uprawnienia i ustawić je ponownie. Problem polega na tym, że istnieje zestaw haseł, którego nie znam, więc jeśli cofnę pozwolenie, nie mogę go przywrócić.

Czy istnieje sposób na zmianę nazwy hosta localhostna %(iz powrotem) bez cofania samego pozwolenia?

Fu86
źródło

Odpowiedzi:

59

Jeśli masz dostęp do mysqlbazy danych, możesz bezpośrednio zmienić tabele uprawnień:

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

... i analogiczne oświadczenie, UPDATEaby to zmienić.

Konieczne może być również wprowadzenie zmian w mysql.dbtabeli:

UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
nickgrim
źródło
Mała poprawka (wersja serwera mysql: 5.7.5-m15 - MySQL Community Server): zarówno z phpmyadmin, jak i z wiersza polecenia mysql - UPDATE mysql. userSET Host= „localhost” GDZIE user. Host= „%” ORAZ user. User= „XXXdbusr”;
Jadeye
1
W przypadku produkcyjnej bazy danych uważam na%, może to stanowić zagrożenie bezpieczeństwa. Jeśli masz wiele serwerów WWW, możesz także używać hostów z symbolami wieloznacznymi, takich jak „192.168.0.%” Lub „% .example.com”. Inną opcją jest wielokrotne dodawanie tego samego użytkownika dla każdego hosta lub utworzenie osobnego użytkownika na serwer WWW.
Fx32
Jeśli, podobnie jak ja, próbowałbym zezwolić na dostęp do roota na lokalnej maszynie testowej (w moim przypadku RasPi), to nie zadziała od MySQL 5.7. Zobacz ten wątek
Raul Pinto
@RaulPinto: ten wątek wydaje się dotyczyć phpMyAdmina, co nie jest tu w pełni istotne, ale warto zauważyć, że osoby, które tylko tego używają.
nickgrim
Lepiej korzystać z dobrze udokumentowanego oświadczenia ZMIEŃ NAZWĘ
Antonio Bardazzi
6

Najlepsza odpowiedź na Stackoverflow sugerująca użycie, RENAME USERktóra kopiuje uprawnienia użytkownika.

Używanie języka kontroli danych (instrukcje GRANT, REVOKE, RENAME itd.) Nie wymaga FLUSH PRIVILEGES;i jest wymagane w architekturze takiej jak Galera lub replikacja grupy, w której tabele MyISAM nie są replikowane.

Antonio Bardazzi
źródło
2

Natknąłem się również na to, a proponowane rozwiązanie nie zadziałało, ponieważ specyficzne dla bazy danych uprawnienia również nie zostałyby przeniesione. co ja zrobiłem:

UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
FLUSH PRIVILEGES;
Roman Haefeli
źródło
I czy „to” zadziałało?
Pierre.Vriens 19.04.16
1

Aby zmienić uprawnienia, najpierw cofnij wszystkie uprawnienia dla użytkownika

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

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

 flush privileges;
Abhishek Anand Amralkar
źródło
To jest dokładnie mój problem, nie mogę odwołać pozwolenia z powodu hasła. Proszę przeczytać moje pytanie.
Fu86
Możesz ustawić skrót hasła tak, aby był taki sam jak stary poprzez aktualizację. Aby to zrobić, nie musisz znać faktycznego hasła.
drogart
0

Brakuje wielu tabel, jeśli masz uprawnienia inne niż tylko db (takie jak tabele lub kolumny itp.). W zależności od tego, co udziela użytkownik, może być konieczne zaktualizowanie wszystkich tych tabel lub niektórych:

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;
mykew
źródło