Mengubah izin host untuk pengguna MySQL

44

Saya memiliki hibah berikut untuk pengguna / basis data

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

Untuk mengaktifkan akses eksternal ke database, saya perlu mengubah localhost menjadi %. Salah satu cara untuk melakukan ini adalah REVOKEsemua izin dan atur kembali. Masalahnya adalah, ada set kata sandi yang saya tidak tahu, jadi jika saya mencabut izinnya, saya tidak bisa mengaturnya kembali.

Apakah ada cara untuk mengubah nama host localhostmenjadi %(dan kembali lagi) tanpa mencabut izin itu sendiri?

Fu86
sumber

Jawaban:

59

Jika Anda memiliki akses ke mysqldatabase, Anda dapat mengubah tabel hibah secara langsung:

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

... dan pernyataan analog UPDATEuntuk mengubahnya kembali.

Anda juga mungkin perlu melakukan perubahan pada mysql.dbtabel:

UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
pendatang
sumber
Perbaikan kecil (versi mysql Server: 5.7.5-m15 - MySQL Community Server): baik dari phpmyadmin dan juga mysql command prompt - UPDATE mysql. userSET Host= 'localhost' DI MANA user. Host= '%' DAN user. User= 'XXXdbusr';
Jadeye
1
Untuk basis data produksi, saya akan berhati-hati dengan%, ini bisa menjadi risiko keamanan. Jika Anda memiliki beberapa webservers, Anda juga dapat menggunakan host wildcard seperti '192.168.0.%', Atau ''% .example.com ''. Pilihan lain adalah menambahkan pengguna yang sama beberapa kali untuk setiap host, atau membuat pengguna yang disebutkan secara terpisah per server web.
okdewit
Jika, seperti saya, mencoba mengizinkan akses root pada mesin uji lokal (RasPi dalam kasus saya), ini tidak akan berfungsi sejak MySQL 5.7. Lihat utas ini
Raul Pinto
@ RaulPinto: utas itu sepertinya tentang phpMyAdmin, yang tidak sepenuhnya relevan di sini, tetapi baik untuk dicatat bagi orang-orang yang hanya menggunakannya.
jemaah
Lebih baik menggunakan pernyataan yang didokumentasikan dengan baik RENAME USER
Antonio Bardazzi
6

Jawaban terbaik pada Stackoverflow menyarankan untuk menggunakan RENAME USERyang menyalin hak pengguna.

Menggunakan Bahasa Kontrol Data (pernyataan sebagai GRANT, REVOKE, RENAME, dan sebagainya) tidak memerlukan FLUSH PRIVILEGES;dan diperlukan dalam arsitektur seperti Galera atau Replikasi Grup di mana tabel MyISAM tidak direplikasi.

Antonio Bardazzi
sumber
2

Saya menemukan yang satu ini juga, dan solusi yang diusulkan tidak bekerja, karena hak istimewa basis data tidak akan dipindahkan juga. apa yang saya lakukan:

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
sumber
Dan apakah "itu" berhasil?
Pierre.Vriens
1

Untuk mengubah hak istimewa, pertama-tama batalkan semua izin untuk pengguna

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

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

 flush privileges;
Abhishek Anand Amralkar
sumber
Persisnya masalah saya, saya tidak bisa mencabut izin karena kata sandinya. Silakan baca pertanyaan saya.
Fu86
Anda dapat mengatur hash kata sandi menjadi sama dengan yang lama melalui pembaruan. Anda tidak perlu tahu kata sandi yang sebenarnya untuk melakukan itu.
drogart
0

Kehilangan banyak tabel jika Anda memiliki hak istimewa selain hanya db (seperti tabel atau kolom dll). Bergantung pada hibah apa yang dimiliki pengguna Anda, Anda mungkin perlu memperbarui semua tabel ini atau beberapa:

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;
mikew
sumber