Bagaimana cara memberikan akses jarak jauh ke MySQL untuk seluruh subnet?

93

Saya dapat dengan mudah memberikan akses ke satu IP menggunakan kode ini:

$ mysql -u root -p
Enter password:    
mysql> use mysql    
mysql> GRANT ALL ON *.* to root@'192.168.1.4' IDENTIFIED BY 'your-root-password';     
mysql> FLUSH PRIVILEGES;

Tetapi saya harus mengizinkan seluruh subnet 192.168.1. * Untuk mengakses database dari jarak jauh.

Bagaimana saya bisa melakukan itu?

skystar7
sumber

Jawaban:

100

EDIT: Pertimbangkan untuk melihat dan meningkatkan jawaban Malvineous di halaman ini. Netmask adalah solusi yang jauh lebih elegan.


Cukup gunakan tanda persen sebagai karakter pengganti di alamat IP.

Dari http://dev.mysql.com/doc/refman/5.1/en/grant.html

Anda dapat menentukan karakter pengganti di nama host. Misalnya, user_name@'%.example.com'berlaku user_nameuntuk semua host di example.comdomain, dan user_name@'192.168.1.%'berlaku user_nameuntuk semua host di 192.168.1subnet kelas C.

p0lar_bear
sumber
6
Saya baru saja melakukannya seperti ini, tetapi, katakanlah, apa yang membuatnya tidak berlaku untuk: user_name@'192.168.1.my-hacked-rnds.killing.mysql.com '???? sekarang saya akan melanjutkan, karena ini adalah MySQL, saya rasa saya tidak ingin tahu jawabannya.
Florian Heigl
+ Florian, menurut saya ini lebih baik hanya dengan menggunakan '%' karena ini menambah lapisan keamanan yang harus diatasi, tapi saya pikir Anda membuat poin yang baik tentang kelemahannya. Saya pasti melengkapi konfigurasi ini dengan cara lain, seperti mengunci server database di subnet terpisah yang dapat saya kontrol aksesnya melalui firewall untuk meniadakan kekhawatiran Anda, antara lain.
Yosia
22
Contoh seperti '192.168.1.my-hacked-rnds.killing.mysql.com' 'secara khusus ditujukan di dev.mysql.com/doc/refman/5.5/en/account-names.html : Untuk menggagalkan upaya tersebut, MySQL melarang pencocokan pada nama host yang dimulai dengan angka dan titik. ... Nilai karakter pengganti IP hanya dapat cocok dengan alamat IP, bukan nama host.
Stefan Lasiewski
118

Ini Sepertinya Anda juga dapat menggunakan netmask , misalnya

GRANT ... TO 'user'@'192.168.0.0/255.255.255.0' IDENTIFIED BY ...
Malvineous
sumber
7
Ini harus menjadi jawaban yang diterima karena ini adalah satu-satunya jawaban teknis yang benar. Didukung setidaknya sejak 5.5: dev.mysql.com/doc/refman/5.5/en/account-names.html
lifeofguenter
6
Jangan mencoba menggunakan notasi CIDR seperti "172.16.0.0/16", ini tidak berhasil. Selalu gunakan netmask lengkap.
Oliver R.
Tampaknya Anda harus menggunakan alamat IP pertama dalam rentang tersebut; Menggunakan misalnya 192.168.0.34/255.255.255.0 akan gagal!
Sander
@SanderBackus: 192.160.0.34/255.255.255.0sama dengan 192.168.0.34/24yang tidak terlalu masuk akal ( /24artinya angka terakhir bisa dari 0 hingga 255, mengabaikan nilai 34 Anda). Apakah ini berfungsi jika Anda menggunakan mask yang valid untuk IP, seperti 192.168.0.34/255.255.255.252?
Malvineous
@Alvineous Itu maksud saya. Jika Anda menggunakan 192.160.0.34/255.255.255.0 mysql tidak mengizinkan 192.160.0.34. Saya bermaksud mengizinkan full / 24 (ya saya menggunakan netmask penuh, seperti yang didokumentasikan), tetapi ternyata Jika Anda harus menggunakan 192.160.0.0/255.255.255.0 untuk memungkinkan jangkauan penuh.
Sander
28

Anda hanya akan menggunakan '%' sebagai wildcard Anda seperti ini:

GRANT ALL ON *.* to root@'192.168.1.%' IDENTIFIED BY 'your-root-password';
Mike Brant
sumber
12
mysql> GRANT ALL ON *.* to root@'192.168.1.%' IDENTIFIED BY 'your-root-password';  

Karakter wildcard adalah "%" bukan "*"

David Allen
sumber
5

Sekadar catatan tentang keanehan yang saya hadapi:
Pertimbangkan:

db server:  192.168.0.101
web server: 192.168.0.102

Jika Anda memiliki pengguna yang didefinisikan di mysql.user sebagai 'user'@'192.168.0.102'dengan password1 dan lainnya 'user'@'192.168.0.%'dengan password2,

kemudian,

jika Anda mencoba menyambung ke server db dari server web sebagai 'pengguna' dengan sandi2,

ini akan menghasilkan kesalahan 'Akses ditolak' karena 'user'@'192.168.0.102'otentikasi IP tunggal digunakan melalui 'user'@'192.168.0.%'otentikasi wildcard .

situs80443
sumber
2
Saya tidak yakin ini adalah jawaban atas pertanyaan tersebut. Jika tidak memberikan jawaban langsung untuk pertanyaan asli, itu harus diposting sebagai komentar.
Kmeixner
13
Kmeixner, Anda berharap dia menulis begitu banyak komentar? Terapkan akal sehat dan berhenti menjadi robot. Komunitas ini untuk membantu para pengembang agar tidak mempersulit hidup mereka.
pengguna1735921
0

setelah Anda menghubungkan server dan Anda ingin terhubung ke host Anda, Anda harus melakukan langkah-langkah di bawah ini:

  1. tulis mysql untuk membuka mysql
  2. menulis ;GRANT ALL ON . to root@'write_your_ip_addres' IDENTIFIED BY 'write_password_to_connect'
  3. tekan control dan X untuk keluar dari mysql
  4. menulis nano /etc/mysql/my.cnf
  5. tulis # sebelum bind-address = 127.0.0.1 di folder my.cnf
  6. # bind-address = 127.0.0.1
  7. simpan folder my.cnf dengan control + X
  8. menulis service mysql restart
  9. Anda dapat terhubung melalui navicat di host Anda
murat delen
sumber
0

Termotivasi oleh jawaban @Malvineaus, saya mencobanya sendiri dan memperhatikan bahwa itu tidak berhasil untuk saya.

Anda dapat menentukan subnet mask dengan '192.168.1.%' Atau '192.168.1.0/255.255.255.0' tetapi subnet harus selalu pada oktet lengkap. lihat https://mariadb.com/kb/en/create-user/#host-name-component . Akibatnya fungsionalitas antara satu cara spesifikasi dan cara lainnya adalah sama.

Misalnya '192.168.1.0/255.255.255.128' tidak akan berfungsi karena tidak berada pada batas oktet lengkap.

Patric
sumber