Bagaimana cara memberikan izin akses jarak jauh ke server mysql untuk pengguna?

118

Jika saya lakukan SHOW GRANTSdi database mysql saya, saya dapatkan

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' 
    IDENTIFIED BY PASSWORD 'some_characters' 
    WITH GRANT OPTION

Jika saya tidak salah, root@localhostberarti pengguna hanya rootdapat mengakses server dari localhost. Bagaimana cara memberi tahu MySQL untuk memberikanroot izin untuk mengakses server mysql ini dari setiap mesin lain (dalam jaringan yang sama) juga?

Aufwind
sumber
6
Perubahan sederhana localhostuntuk %akan memberikan akses root ke jaringan publik. Jangan lupaflush privileges;
6
Menambahkan root @% membuat Anda menghadapi banyak risiko dan sebaiknya tidak dilakukan. Saya tahu ini adalah posting lama tetapi peringatan itu harus ada di sini. Akun root adalah akun pertama yang ditargetkan oleh penyerang, dan root @ '%' berarti pengguna root dapat terhubung ke akun MySQL Anda dari mana saja. Ada terlalu banyak hal untuk dibahas dalam komentar, tetapi Anda harus mencoba menghapus pengguna @ '%' sebanyak mungkin, dan pengguna yang dideklarasikan di dalamnya akan memiliki hak istimewa yang sangat terbatas. Apa pun yang terjadi, Anda sebaiknya tidak menambahkan root @ '%', dan aplikasi Anda juga tidak boleh mengharapkan akun tersebut ada.
Damon
Lihat juga Mengaktifkan koneksi remote MySQL
pengguna
Hai teman-teman, sebaiknya hapus string PASSWORD ke perintah ini ... ini menyebabkan kesalahan ... selesaikan dengan IDENTIFIED BY dan kemudian kata sandinya sendiri.
Mário de Sá Vera

Jawaban:

143

Ini memberikan akses root dengan kata sandi yang sama dari mesin mana pun di *.example.com:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%.example.com' 
    IDENTIFIED BY 'some_characters' 
    WITH GRANT OPTION;
FLUSH PRIVILEGES;

Jika resolusi nama tidak akan berhasil, Anda juga dapat memberikan akses melalui IP atau subnet:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.1.%'
    IDENTIFIED BY 'some_characters'  
    WITH GRANT OPTION;
FLUSH PRIVILEGES;

GRANTDokumen sintaks MySQL .

Michael Berkowski
sumber
15
Saya berasumsi ...TO 'root'@'%' IDENTIFIED...akan memberikan akses dari mana-mana?
Aufwind
3
Saya menjalankan perintah di mysql, tetapi SHOW GRANTSmasih menunjukkan hal yang sama (seperti dalam pertanyaan saya). Aku bahkan melakukannya FLUSH PRIVILGES. Apakah ada yang saya lewatkan?
Aufwind
@Aufwind Saya tidak akan mengecualikan Anda untuk membutuhkan hal lain selain FLUSH PRIVILEGES. Keluar dan masuk kembali, mulai ulang layanan mysqld jika Anda memiliki akses. Juga, pastikan bahwa skip networkingbaris tidak diaktifkan di my.cnfmeskipun itu tidak akan menjelaskan Anda SHOW GRANTSmasih tidak sama.
Michael Berkowski
@Aufwind Jika gagal, Anda mungkin perlu menanyakannya di ServerFault.com.
Michael Berkowski
10
Catatan itu IDENTIFIED BY PASSWORDdisertai dengan 41 digit angka heksadesimal berciri. Gunakan IDENTIFIED BY 'password'jika Anda ingin memasukkan kata sandi secara langsung.
Hujan
94

Mencoba:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Pa55w0rd' WITH GRANT OPTION;
moshe beeri
sumber
1
umm apa yang Pa55w0rdtampaknya bodoh, jangan bilang itu kata sandi yang ingin Anda buat. Untuk semua orang yang mencoba login mysql Anda?
SSpoke
23
Ini hanya biasa digunakan untuk memberikan placeholder untuk kata sandi, mengatakan "letakkan kata sandi yang baik untuk dibaca di tempat ini".
moshe beeri
2
Perintah ini dengan peringatan biasa bahwa Anda hanya ingin menggunakannya untuk aplikasi yang tidak mengutamakan keamanan, misalnya dev atau QA.
einnocent
jika tidak berfungsi di mac coba ubah 'root' @ '%' dengan 'root' @ 'localhost' atau / etc / hosts dari komputer yang Anda beri hak istimewa.
moshe beeri
2
Jangan lupa untuk menjalankan ini setelah:FLUSH PRIVILEGES;
dane
44

Anda perlu mengambil beberapa langkah untuk memastikan mysql terlebih dahulu dan kemudian pengguna root dapat diakses dari luar:

  1. Nonaktifkan skip-networkingdi my.cnf(yaitu: /etc/mysql/my.cnf)

  2. Periksa nilai bind-addressmasuk my.cnf, jika diatur ke 127.0.0.1, Anda dapat mengubahnya 0.0.0.0untuk mengizinkan akses dari semua IP atau ip apa pun yang ingin Anda sambungkan.

  3. Berikan akses jarak jauh pengguna root dari ip mana pun (atau tentukan ip Anda, bukan %)

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'
        IDENTIFIED BY 'your_root_password'
        WITH GRANT OPTION;
    FLUSH PRIVILEGES;`
  4. Mulai ulang layanan mysql:

    sudo service mysql restart
Khashayar
sumber
Anda juga perlu membuka port mysql 3306 dari firewall jika tidak, klien jarak jauh tidak akan terhubung
David Okwii
Hanya pemberitahuan singkat pada poin 2 dari @Kayar: 0.0.0.0 berarti alamat IPv4 apa pun. * berarti alamat APA PUN, baik itu IPv4 atau IPv6.
Gustavo Pinsard
34
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' 
    IDENTIFIED BY 'YOUR_PASS' 
    WITH GRANT OPTION;
FLUSH PRIVILEGES;  

*.* = DB.TABLE Anda dapat membatasi pengguna ke database tertentu dan tabel tertentu.

'root'@'%'Anda dapat mengubah root dengan pengguna mana pun yang Anda buat dan% mengizinkan semua IP. Anda dapat membatasinya dengan mengubah% .168.1.1 dll juga.


Jika itu tidak menyelesaikan, maka ubah juga my.cnf atau my.ini dan beri komentar pada baris ini

bind-address = 127.0.0.1ke #bind-address = 127.0.0.1
dan
skip-networkingke#skip-networking

  • Mulai ulang MySQL dan ulangi langkah di atas lagi.

Raspberry Pi, saya menemukan konfigurasi alamat-bind di bawah \etc\mysql\mariadb.conf.d\50-server.cnf

Wasim A.
sumber
2
Hanya jawaban yang menjelaskan bagian *.*dan 'user'@'address'. Terima kasih! :)
Philipp
Memberi ALL pada . mengundang peretas masuk
Rick James
itulah mengapa saya menjelaskan *. *
Wasim A.
8

Hibah SQL itu yang dibagikan orang lain berfungsi. Jika Anda masih tidak dapat mengakses database, mungkin Anda hanya memiliki batasan firewall untuk port tersebut. Itu tergantung pada jenis server Anda (dan semua router di antaranya) tentang cara membuka koneksi. Buka port TCP 3306 masuk, dan berikan aturan akses serupa untuk mesin eksternal (semua / subnet / IP tunggal / dll.).

pengguna171212
sumber
4

Buka /etc/mysql/mysql.conf.d/mysqld.cnffile dan beri komentar pada baris berikut:

#bind-address = 127.0.0.1
Vik2696
sumber
Bekerja pada Ubuntu 19.4
Ngô Văn Thao
3

Dalam kasus saya, saya mencoba untuk terhubung ke server mysql jarak jauh di cent OS. Setelah melalui banyak solusi (memberikan semua hak istimewa, menghapus pengikatan ip, mengaktifkan jaringan) masalah masih belum terpecahkan.

Ternyata, saat mencari berbagai solusi, saya menemukan iptables, yang membuat saya menyadari port mysql 3306 tidak menerima koneksi.

Berikut adalah catatan kecil tentang cara saya memeriksa dan menyelesaikan masalah ini.

  • Memeriksa apakah port menerima koneksi:
telnet (ip server mysql) [portNo]

-Menambahkan aturan tabel ip untuk memungkinkan koneksi di port:

iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT

-Tidak akan merekomendasikan ini untuk lingkungan produksi, tetapi jika iptables Anda tidak dikonfigurasi dengan benar, menambahkan aturan mungkin masih belum menyelesaikan masalah. Dalam hal berikut ini harus dilakukan:

layanan iptables berhenti

Semoga ini membantu.

Kushal
sumber
3

Dua langkah:

  1. siapkan pengguna dengan karakter pengganti:
    create user 'root'@'%' identified by 'some_characters'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY PASSWORD 'some_characters' WITH GRANT OPTION

  2. vim /etc/my.cnf
    tambahkan yang berikut ini:
    bind-address=0.0.0.0

restart server, Anda seharusnya tidak memiliki masalah saat menyambungkannya.

studio1057
sumber
Mengikuti, mendapatkan "ERROR 1827 (HY000): Hash sandi tidak memiliki format yang diharapkan. Periksa apakah algoritme sandi yang benar sedang digunakan dengan fungsi PASSWORD ()." Bisakah Anda menjelaskan kesalahan saya di sini?
LampShadesDrifter
2

Dengan mysql 8 dan versi yang lebih baru, Anda tidak dapat menambahkan pengguna dengan memberikan hak istimewa. artinya dengan kueri ini:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' 
    IDENTIFIED BY 'type-root-password-here' 
    WITH GRANT OPTION;
FLUSH PRIVILEGES;

mysql akan mengembalikan kesalahan ini:

ERROR 1064 (42000): Anda memiliki kesalahan dalam sintaks SQL; periksa manual yang sesuai dengan versi server MySQL Anda untuk sintaks yang benar untuk digunakan di dekat 'IDENTIFIED BY' kata sandi tertulis 'di baris 1

ini berarti Anda tidak memiliki pengguna root untuk% domain. jadi Anda harus memasukkan pengguna terlebih dahulu lalu memberikan hak istimewa seperti ini:

mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'your password';
Query OK, 0 rows affected (0.11 sec)

mysql> GRANT ALL ON *.* TO 'root'@'%';
Query OK, 0 rows affected (0.15 sec)

mysql> FLUSH PRIVILEGES;

Jangan lupa untuk mengganti kata sandi dengan kata sandi khusus Anda.

MhDG7
sumber
0

Ini berhasil untuk saya. Tapi ada masalah aneh yang bahkan aku coba dulu yang tidak terpengaruh. Saya memperbarui halaman phpmyadmin dan entah bagaimana berhasil.

Jika Anda membutuhkan akses ke local-xampp-mysql. Anda dapat pergi ke xampp-shell -> membuka command prompt.

Kemudian mysql -uroot -p --port = 3306 atau mysql -uroot -p (jika ada set kata sandi). Setelah itu Anda dapat memberikan akses tersebut dari halaman shell mysql (juga dapat bekerja dari localhost / phpmyadmin).

Hanya menambahkan ini jika seseorang menemukan topik ini dan mengalami masalah pemula.

icemanzzz.dll
sumber
0

Ubuntu 18.04

Instal dan pastikan mysqld kita berjalan ..

Masuk ke database dan atur pengguna root:

sudo mysql -u root
SELECT User,Host FROM mysql.user;
DROP USER 'root'@'localhost';
CREATE USER 'root'@'%' IDENTIFIED BY 'obamathelongleggedmacdaddy';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
exit;

Edit izin mysqld dan mulai ulang:

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

# edit the line to be this:
bind-address=0.0.0.0

sudo systemctl stop mysql
sudo systemctl start mysql

Dari komputer lain, uji .. Obvs port (3306) pada mesin mysqld harus mengizinkan koneksi dari mesin uji.

mysql -u root -p -h 123.456.789.666

Semua "keamanan" tambahan dari MySql tidak membantu keamanan sama sekali, itu hanya memperumit dan mengaburkan, sekarang sebenarnya lebih mudah untuk mengacaukannya daripada di masa lalu, di mana Anda hanya menggunakan kata sandi yang sangat panjang.

Peter Prographo
sumber