Baru-baru ini, saya memposting jawaban untuk pertanyaan tentang mysql.db .
Kemudian, saya berpikir saya harus bertanya kepada semua orang pertanyaan ini:
Saya telah memperhatikan selama bertahun-tahun bahwa pada saat instalasi MySQL 5.0+, mysql.db
diisi dengan dua entri yang memungkinkan database uji untuk diakses oleh pengguna anonim.
Anda dapat melihatnya dengan menjalankan kueri ini:
mysql> select * from mysql.db where SUBSTR(db,1,4) = 'test'\G
*************************** 1. row ***************************
Host: %
Db: test
User:
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Grant_priv: N
References_priv: Y
Index_priv: Y
Alter_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: N
Execute_priv: N
*************************** 2. row ***************************
Host: %
Db: test\_%
User:
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Grant_priv: N
References_priv: Y
Index_priv: Y
Alter_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: N
Execute_priv: N
2 rows in set (0.00 sec)
Apakah entri ini dalam mysql.db
risiko keamanan, dan jika demikian, mengapa mereka ditambahkan secara default ke instalasi baru?
UPDATE 2013-06-14 10:13 EDT
Pagi ini seseorang menjatuhkan pertanyaan saya, yang saya benar-benar tidak mengerti. Mengingat peristiwa ini, inilah mengapa saya meluangkan waktu untuk membuat bantahan:
Saya menginstal MySQL 5.6.12 untuk klien minggu ini di Staging Cluster mereka. Saya memutuskan untuk memeriksa apakah ini masih merupakan masalah yang sedang berlangsung:
mysql> select version();
+------------+
| version() |
+------------+
| 5.6.12-log |
+------------+
1 row in set (0.00 sec)
mysql> select db,user,host from mysql.db where LEFT(db,4)='test';
+---------+------+------+
| db | user | host |
+---------+------+------+
| test | | % |
| test\_% | | % |
+---------+------+------+
2 rows in set (0.10 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2013-06-14 10:10:13 |
+---------------------+
1 row in set (0.00 sec)
mysql>
Tebak apa? Ini masih menjadi masalah bahkan hingga hari ini !!!
MORAL OF THE STORY: Silakan periksa Anda mysql.db
segera setelah instalasi dan hapus login anonim dan hapus entri tes ini dari mysql.db
tanpa penundaan.
mysql_secure_installation
instalasi baru, yang menghapus pengguna anonim.Jawaban:
Harap dicatat apa Panduan Studi Sertifikasi MySQL 5.0
katakan dalam bulletpoints pada Halaman 498 Paragraf 6:
Untuk menghilangkan entri yang buruk itu, jalankan ini:
Seperti @DTest disebutkan dalam komentarnya untuk pertanyaan, Anda juga dapat menjalankan mysql_secure_installation untuk ini untuk Anda.
Jika pengguna anonim dapat login ke MySQL dari jarak jauh, serangan disk dapat diluncurkan untuk merusak instalasi mysql. Berikut ini sebuah contoh:
Jalankan masukkan 30 kali dan Anda mendapatkan tabel 7GB
mysql.db
Seriusnya pengamanan instalasi mysql belum sepenuhnya didokumentasikan oleh MySQL AB, dan saya pikir Oracle tidak tertarik untuk melakukannya hari ini.
UPDATE 2012-02-18 16:45 EDT
Disarankan oleh komentar @ atxdba bahwa hanya menjalankan 'DROP DATABASE test;' harus menjadi metode yang disukai daripada menyentuh mysql.db. Menjatuhkan nama database
test
hanya menghapus database yang membuka saluran ke lubang keamanan potensial.Harap perhatikan permintaan ini:
Berdasarkan ini, basis data berikut dapat diakses sepenuhnya oleh pengguna anonim :
Meskipun basis data berikut tidak dapat diakses sepenuhnya oleh pengguna anonim:
Test
berbeda daritest
sistem berbasis Linux, tetapi masih masalah untuk MySQL yang berjalan di Windows)Anda harus mengingat aturan halus ini berdasarkan pada
mysql.db
tabel. Jika Anda tidak ingat ini, membuat database uji bernamatest
atau nama database yang 5 karakter pertamanyatest_
akan membuka kembali jenis lubang keamanan yang sama.Cara paling aman untuk mengingat hal-hal ini adalah dengan menjalankan baris-baris ini setelah instalasi awal:
maka basis data apa pun dengan nama apa pun dapat memiliki pengaturan otentikasi yang tepat. Anda masih dapat menjalankan dua baris ini kapan saja.
UPDATE 2012-02-24 15:20 EDT
Untuk secara terbuka menunjukkan bahaya memiliki pengguna anonim
mysql.db
, saya ingin membuat pengguna yang hanya memiliki hak penggunaan.Saya akan menggunakan MySQL 5.5.12 di Desktop saya
Pertama, lihat mysql.db
Menurut ini, setiap anonim Joe dapat mencapai database ini.
Saya akan membuat database test_mysqldb
Mari kita buat pengguna vanilla polos bernama vanilla @ localhost (tanpa kata sandi)
Selanjutnya, dari DOS Command Line, mari kita sambungkan ke skema mysql
OK bagus. Itu yang saya harapkan.
Selanjutnya, dari Baris Perintah DOS, mari kita sambungkan ke skema test_mysqldb, buat tabel, dan muat dengan angka
Apakah kamu melihat itu? Seorang pengguna dengan
USAGE
hak istimewa dapat membuat tabel dalam database uji dan mengisinya dengan data. Ini bahaya yang jelas dan sekarang . Inilah sebabnya saya sangat menyarankan untuk menghapus entri tes tersebut dari mysql.db untuk mencegah pengguna anonim dari mencapai basis data pengujian atau mengakses basis data pengujian yang baru dibuat (melalui membuat subfolder di bawah defaultdatadir
).Sebagai pengingat, ini adalah bagaimana Anda melakukannya:
UPDATE 2013-09-14 20:05 EDT
Untuk menunjukkan bahwa
DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';
sebenarnya berfungsi, saya menjalankan ini di MySQL 5.6.13 hari ini:Sama seperti pengumuman layanan publik, silakan jalankan
atau jalankan mysql-secure-installation dan letakkan potensi bahaya ini di tempat tidur.
sumber
DELETE from mysql.db WHERE Db LIKE 'test%';
Note bahwa kapitalisasi nama bidang itu penting. Jadi, jika nama bidang Anda adalahDb
dan tidakdb
, kueri di atas tidak akan berfungsi.