Harap dicatat apa Panduan Studi Sertifikasi MySQL 5.0
katakan dalam bulletpoints pada Halaman 498 Paragraf 6:
Di Unix, MySQL dilengkapi dengan skrip mysql_secure_installation yang dapat melakukan beberapa operasi terkait keamanan yang bermanfaat pada instalasi Anda. Script memiliki kemampuan sebagai berikut:
- Tetapkan kata sandi untuk akun root
- Hapus semua akun root yang dapat diakses dari jarak jauh.
- Hapus akun pengguna anonim. Ini meningkatkan keamanan karena mencegah kemungkinan siapa pun terhubung ke server MySQL sebagai root dari host jarak jauh. Hasilnya adalah siapa pun yang ingin terhubung sebagai root harus terlebih dahulu dapat masuk pada host server, yang memberikan penghalang tambahan terhadap serangan.
- Hapus database pengujian (Jika Anda menghapus akun anonim, Anda mungkin juga ingin menghapus database pengujian yang mereka akses).
Untuk menghilangkan entri yang buruk itu, jalankan ini:
DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test';
FLUSH PRIVILEGES;
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:
USE test
CREATE TABLE rolando_tb (a int);
INSERT INTO rolando_tb VALUES (1);
INSERT INTO rolando_tb SELECT a FROM rolando_tb;
INSERT INTO rolando_tb SELECT a FROM rolando_tb;
INSERT INTO rolando_tb SELECT a FROM rolando_tb;
INSERT INTO rolando_tb SELECT a FROM rolando_tb;
Jalankan masukkan 30 kali dan Anda mendapatkan tabel 7GB
- Bayangkan membuat beberapa tabel ini di database pengujian
- Bayangkan membuat Prosedur Disimpan dalam database uji
- Kemungkinan tidak terbatas selama test dan test_% ada di
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:
mysql> select user,host,db from mysql.db;
+------+------+---------+
| user | host | db |
+------+------+---------+
| | % | test |
| | % | test\_% |
+------+------+---------+
2 rows in set (0.09 sec)
Berdasarkan ini, basis data berikut dapat diakses sepenuhnya oleh pengguna anonim :
- uji
- test_db
- test_001
- test_1
- test_data
Meskipun basis data berikut tidak dapat diakses sepenuhnya oleh pengguna anonim:
- testdb
- test1
- testdata
- Test (
Test
berbeda dari test
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 bernama test
atau nama database yang 5 karakter pertamanya test_
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:
DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';
FLUSH PRIVILEGES;
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
mysql> select user,host,db from mysql.db;
+------+------+---------+
| user | host | db |
+------+------+---------+
| | % | test |
| | % | test\_% |
+------+------+---------+
2 rows in set (0.05 sec)
mysql>
Menurut ini, setiap anonim Joe dapat mencapai database ini.
Saya akan membuat database test_mysqldb
mysql> create database test_mysqldb;
Query OK, 1 row affected (0.00 sec)
mysql> use test_mysqldb
Database changed
mysql> show tables;
Empty set (0.00 sec)
mysql>
Mari kita buat pengguna vanilla polos bernama vanilla @ localhost (tanpa kata sandi)
mysql> CREATE USER vanilla@localhost;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW GRANTS FOR vanilla@localhost;
+---------------------------------------------+
| Grants for vanilla@localhost |
+---------------------------------------------+
| GRANT USAGE ON *.* TO 'vanilla'@'localhost' |
+---------------------------------------------+
1 row in set (0.00 sec)
mysql>
Selanjutnya, dari DOS Command Line, mari kita sambungkan ke skema mysql
C:\>mysql -uvanilla -Dmysql
ERROR 1044 (42000): Access denied for user 'vanilla'@'localhost' to database 'mysql'
C:\>
OK bagus. Itu yang saya harapkan.
Selanjutnya, dari Baris Perintah DOS, mari kita sambungkan ke skema test_mysqldb, buat tabel, dan muat dengan angka
C:\>mysql -uvanilla -Dtest_mysqldb
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.5.12-log MySQL Community Server (GPL)
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> CREATE TABLE rolando_tb (a bigint unsigned);
Query OK, 0 rows affected (0.06 sec)
mysql> INSERT INTO rolando_tb VALUES (1);
Query OK, 1 row affected (0.06 sec)
mysql> INSERT INTO rolando_tb SELECT * FROM rolando_tb;
Query OK, 1 row affected (0.06 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> INSERT INTO rolando_tb SELECT * FROM rolando_tb;
Query OK, 2 rows affected (0.08 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> INSERT INTO rolando_tb SELECT * FROM rolando_tb;
Query OK, 4 rows affected (0.06 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> INSERT INTO rolando_tb SELECT * FROM rolando_tb;
Query OK, 8 rows affected (0.06 sec)
Records: 8 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM rolando_tb;
+------+
| a |
+------+
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
+------+
16 rows in set (0.00 sec)
mysql> SELECT database();
+--------------+
| database() |
+--------------+
| test_mysqldb |
+--------------+
1 row in set (0.00 sec)
mysql>
Apakah kamu melihat itu? Seorang pengguna denganUSAGE
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:
DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';
FLUSH PRIVILEGES;
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:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.13-log MySQL Community Server (GPL)
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> select db,user,host from mysql.db where LEFT(db,4)='test';
+---------+------+------+
| db | user | host |
+---------+------+------+
| test | | % |
| test\_% | | % |
+---------+------+------+
2 rows in set (0.43 sec)
mysql> delete from mysql.db where LEFT(db,4)='test';
Query OK, 2 rows affected (0.04 sec)
mysql> select db,user,host from mysql.db2 where LEFT(db,4)='test';
Empty set (0.00 sec)
mysql>
Sama seperti pengumuman layanan publik, silakan jalankan
DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';
FLUSH PRIVILEGES;
atau jalankan mysql-secure-installation dan letakkan potensi bahaya ini di tempat tidur.
mysql_secure_installation
instalasi baru, yang menghapus pengguna anonim.