MySQL: Tại sao lại có các mục nhập thử nghiệm của Wikipedia trong mysql.db?


37

Gần đây, tôi đã đăng một câu trả lời cho một câu hỏi về mysql.db .

Sau đó, tôi đã nghĩ rằng tôi nên hỏi mọi người câu hỏi này:

Tôi đã nhận thấy trong nhiều năm rằng khi cài đặt MySQL 5.0+, mysql.dbcó hai mục nhập cho phép cơ sở dữ liệu kiểm tra được truy cập bởi người dùng ẩn danh.

Bạn có thể thấy nó bằng cách chạy truy vấn này:

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)

Các mục này mysql.dbcó nguy cơ bảo mật không và nếu có, tại sao chúng được thêm theo mặc định vào bản cài đặt mới?

CẬP NHẬT 2013-06-14 10:13 EDT

Sáng nay có ai đó đánh giá thấp câu hỏi của tôi, điều mà tôi thực sự không hiểu. Trong sự kiện này, đây là lý do tại sao tôi dành thời gian để phản bác:

Tôi đã cài đặt MySQL 5.6.12 cho một khách hàng trong tuần này trong Staging Cluster của họ. Tôi quyết định kiểm tra xem liệu đây có còn là vấn đề đang diễn ra không:

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>

Đoán xem cái gì? Đây vẫn là một vấn đề ngay cả cho đến ngày nay !!!

MORAL CỦA CÂU CHUYỆN: Vui lòng kiểm tra mysql.dbngay lập tức sau khi cài đặt và xóa thông tin đăng nhập ẩn danh và xóa các mục kiểm tra này khỏi mysql.dbkhông chậm trễ.


8
+1 để đưa vấn đề này ra ánh sáng. Tôi chưa bao giờ nhận thấy nó trước đây, nhưng tôi luôn chạy mysql_secure_installationtrên một bản cài đặt mới, loại bỏ những người dùng ẩn danh.
Derek Downey

Câu trả lời:


30

Xin lưu ý Hướng dẫn học chứng chỉ MySQL 5.0

nhập mô tả hình ảnh ở đây

nói trong các gạch đầu dòng của nó trên Trang 498 Đoạn 6:

Trên Unix, MySQL đi kèm với tập lệnh mysql_secure_installation có thể thực hiện một số hoạt động liên quan đến bảo mật hữu ích trong quá trình cài đặt của bạn. Kịch bản có các khả năng sau:

  • Đặt mật khẩu cho tài khoản root
  • Xóa mọi tài khoản root có thể truy cập từ xa.
  • Xóa tài khoản người dùng ẩn danh. Điều này cải thiện bảo mật vì nó ngăn chặn khả năng bất kỳ ai kết nối với máy chủ MySQL là root từ máy chủ từ xa. Kết quả là bất kỳ ai muốn kết nối với quyền root trước tiên phải có thể đăng nhập vào máy chủ, điều này cung cấp thêm một rào cản chống lại sự tấn công.
  • Xóa cơ sở dữ liệu kiểm tra (Nếu bạn xóa tài khoản ẩn danh, bạn cũng có thể muốn xóa cơ sở dữ liệu kiểm tra mà họ có quyền truy cập).

Để loại bỏ những mục xấu đó, hãy chạy nó:

DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test';
FLUSH PRIVILEGES;

Như @DTest đã đề cập trong bình luận của anh ấy cho câu hỏi, bạn cũng có thể chạy mysql_secure_installation này cho bạn.

Nếu một người dùng ẩn danh có thể đăng nhập vào MySQL từ xa, một cuộc tấn công đĩa đơn giản có thể được khởi chạy để làm tổn hại đến việc cài đặt mysql. Đây là một ví dụ:

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;

Chạy chèn 30 lần và bạn nhận được bảng 7 GB

  • Hãy tưởng tượng việc tạo một vài trong số các bảng này trong cơ sở dữ liệu thử nghiệm
  • Hãy tưởng tượng việc tạo một Thủ tục lưu trữ trong cơ sở dữ liệu thử nghiệm
  • Khả năng là vô tận miễn là test và test_% tồn tại trong mysql.db

Mức độ nghiêm trọng của việc bảo mật cài đặt mysql chưa được MySQL AB ghi lại đầy đủ và tôi không nghĩ rằng Oracle quan tâm đến việc này ngày hôm nay.

CẬP NHẬT 2012 / 02-18 16:45 EDT

Nó được đề xuất bởi nhận xét của @ atxdba rằng chỉ cần chạy 'DROP DATABASE test;' nên là phương pháp ưa thích hơn là chạm vào mysql.db. Bỏ cơ sở dữ liệu có tên testchỉ đơn giản là loại bỏ cơ sở dữ liệu mở một ống dẫn đến lỗ hổng bảo mật tiềm năng.

Xin lưu ý truy vấn này:

mysql> select user,host,db from mysql.db;
+------+------+---------+
| user | host | db      |
+------+------+---------+
|      | %    | test    |
|      | %    | test\_% |
+------+------+---------+
2 rows in set (0.09 sec)

Dựa trên điều này, các cơ sở dữ liệu sau đây có thể được truy cập đầy đủ bởi người dùng ẩn danh :

  • kiểm tra
  • test_db
  • kiểm tra_001
  • kiểm tra_1
  • test_data

Mặc dù các cơ sở dữ liệu sau đây không thể được truy cập đầy đủ bởi người dùng ẩn danh:

  • testdb
  • kiểm tra1
  • kiểm tra
  • Kiểm tra ( Testkhác với testtrong các hệ thống dựa trên Linux, nhưng vẫn còn vấn đề đối với MySQL chạy trong Windows)

Bạn sẽ phải nhớ quy tắc tinh tế này dựa trên mysql.dbbảng. Nếu bạn không nhớ điều này, việc tạo cơ sở dữ liệu thử nghiệm có tên testhoặc tên cơ sở dữ liệu có 5 ký tự đầu tiên test_sẽ mở lại cùng một loại lỗ hổng bảo mật.

Cách an toàn nhất xung quanh việc phải nhớ những điều này là chạy các dòng này sau khi cài đặt ban đầu:

DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';
FLUSH PRIVILEGES;

sau đó bất kỳ cơ sở dữ liệu với bất kỳ tên nào cũng có thể có một thiết lập xác thực phù hợp. Bạn vẫn có thể chạy hai dòng này bất cứ lúc nào.

CẬP NHẬT 2012/02/24 15:20 EDT

Để công khai chứng minh sự nguy hiểm của việc có người dùng ẩn danh mysql.db, tôi muốn tạo một người dùng chỉ có đặc quyền sử dụng.

Tôi sẽ sử dụng MySQL 5.5.12 trên máy tính để bàn của mình

Đầu tiên, hãy nhìn vào mysql.db

mysql> select user,host,db from mysql.db;
+------+------+---------+
| user | host | db      |
+------+------+---------+
|      | %    | test    |
|      | %    | test\_% |
+------+------+---------+
2 rows in set (0.05 sec)


mysql>

Theo đó, bất kỳ Joe ẩn danh nào cũng có thể tiếp cận các cơ sở dữ liệu này.

Tôi sẽ tạo một cơ sở dữ liệu 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>

Hãy tạo một người dùng vanilla đơn giản gọi là vanilla @ localhost (không có mật khẩu)

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>

Tiếp theo, từ Dòng lệnh DOS, hãy kết nối với lược đồ mysql

C:\>mysql -uvanilla -Dmysql
ERROR 1044 (42000): Access denied for user 'vanilla'@'localhost' to database 'mysql'

C:\>

Tuyệt. Đó là những gì tôi mong đợi.

Tiếp theo, từ Dòng lệnh DOS, hãy kết nối với lược đồ test_mysqldb, tạo một bảng và tải nó với các số

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>

Bạn có thấy điều đó không? Người dùng cóUSAGEđặc quyền có thể tạo bảng trong cơ sở dữ liệu thử nghiệm và điền vào bảng với dữ liệu. Đây là một mối nguy hiểm rõ ràng và hiện tại . Đây là lý do tại sao tôi thực sự khuyên bạn nên xóa các mục kiểm tra đó khỏi mysql.db để ngăn người dùng ẩn danh truy cập cơ sở dữ liệu kiểm tra hoặc truy cập cơ sở dữ liệu kiểm tra mới được tạo (thông qua việc tạo thư mục con theo mặc địnhdatadir).

Xin nhắc lại, đây là cách bạn thực hiện:

DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';
FLUSH PRIVILEGES;

CẬP NHẬT 2013-09-14 20:05 EDT

Để chứng minh rằng DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';thực sự hoạt động, tôi đã chạy nó trên MySQL 5.6.13 ngày hôm nay:

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>

Giống như một thông báo dịch vụ công cộng, vui lòng chạy

DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';
FLUSH PRIVILEGES;

hoặc chỉ cần chạy mysql-safe-install và đặt mối nguy hiểm tiềm tàng này lên giường.


Không bỏ kiểm tra cơ sở dữ liệu; ưa thích hơn fidgeting trực tiếp với mysqldb? Xóa mục nhập khỏi bảng db sẽ không xóa thư mục db kiểm tra thực tế. Nếu không có gì khác có vẻ như giữ nhà tốt hơn
atxdba

1
Tôi đã phải làm một DELETE from mysql.db WHERE Db LIKE 'test%';lưu ý rằng việc viết hoa của tên trường có vấn đề. Vì vậy, nếu tên trường của bạn là Dbkhông db , truy vấn trên sẽ không hoạt động.
Avery
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.