Xin lưu ý Hướng dẫn học chứng chỉ MySQL 5.0
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 test
chỉ đơ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 (
Test
khác với test
trong 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.db
bả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 test
hoặ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.
mysql_secure_installation
trên một bản cài đặt mới, loại bỏ những người dùng ẩn danh.