Bảng mysql.db được sử dụng để làm gì?


7

Liên quan đến vấn đề MySQL của tôi

Tôi có một người dùng được cấp USAGE trong mysql.user, nhưng trong mysql.db người dùng này có Chọn, Chèn, Cập nhật, Xóa. Do đó, người dùng có thể truy vấn thành công cơ sở dữ liệu.

Tôi không thể tìm thấy bất kỳ thông tin nào về cách thức hoạt động của mysql.db này, nó có giống như một số quyền được lưu trong bộ nhớ cache không? Một mysqld sẽ khởi động lại nó?

mysql> show grants for user@'xx.xx.xx.%';
+-------------------------------------------------------------------------------------------------------------------------------+ 
| Grants for user@xx.xx.xx.%                                      |
+-------------------------------------------------------------------------------------------------------------------------------+ 
| GRANT USAGE ON *.* TO 'user'@'xx.xx.xx.%' IDENTIFIED BY PASSWORD 'xxx' REQUIRE SSL |



 mysql> select host,db,user, select_priv,update_priv,delete_priv  from
 mysql.db where  user='user'; 
 | host         | db   | user    | select_priv | update_priv |  delete_priv | 
 | xx.xx.xx.1   | myDB | user    | Y           | Y           | Y

Câu trả lời:


6

Từ các tài liệu , mysql.dblà bảng xử lý GRANTS dành riêng cho cơ sở dữ liệu. Điều đó có nghĩa là, nếu bạn chỉ định rõ ràng một cơ sở dữ liệu trong GRANTlệnh của mình , nó sẽ hiển thị trong bảng này:

GRANT SELECT, INSERT ON foo.* TO `bar`@`localhost`;

Vì vậy, người dùng bar@localhostsẽ có CHỌN và CHERTN được đánh dấu là 'Y' trong mysql.dbbảng.

Để xóa các mục khỏi bảng này, tương tự, bạn cần chỉ định cơ sở dữ liệu:

REVOKE SELECT, INSERT ON foo.* FROM `bar`@`localhost`;

Phát hành một REVOKE INSERT ON *.*tuyên bố (tất cả các cơ sở dữ liệu) sẽ không ảnh hưởng đến bảng này.

Ngoài ra, một DROP USERtuyên bố sẽ dọn sạch tất cả các mục trong các mysql.*bảng khác nhau liên quan đến xác thực người dùng, chẳng hạn như mysql.db.


Vì vậy, điều đó có nghĩa là nếu tôi cấp cho người dùng trên *. *, Mysql.db sẽ hiển thị cho tôi những khoản tài trợ đó cho mỗi cơ sở dữ liệu? Có nghĩa là một khoản trợ cấp chọn, cập nhật, xóa trên *. * Đã được thực hiện trong quá khứ nhưng bị thu hồi?
Bastien974

Nếu bạn làm một GRANT x ON *.*, nó không nên cập nhật bảng mysql.db ... bảng chỉ được cập nhật nếu bạn đề cập cụ thể đến cơ sở dữ liệu trong câu lệnh GRANT.
Derek Downey

Vì vậy, cách duy nhất cấp cho nhiều cơ sở dữ liệu là trong mysql.db là khi nó được cấp rõ ràng cho từng cơ sở dữ liệu. Sau đó, sau khi thu hồi *. *, Tôi sẽ thấy USAGE trong mysql.user NHƯNG vẫn có quyền cho phép cơ sở dữ liệu cụ thể trong mysql.db?
Bastien974

@ Bastien974 Có. Bạn có thể xóa chúng khỏi mysql.dbbằng cách phát hành nhiều câu lệnh REVOKE trên mỗi cơ sở dữ liệu. *
Derek Downey

2

Nó không chính xác là một bộ đệm, mà là kho lưu trữ vật lý bên trong hệ thống của bạn. Quyền là một thứ được lưu trữ trong đó. Bạn cũng sẽ tìm thấy các bảng chứa thông tin về các thủ tục, chức năng và sự kiện được lưu trữ.

Nếu bạn đã ghi nhật ký hoặc cấu hình truy vấn được kích hoạt và định cấu hình theo một cách nhất định, bạn cũng sẽ tìm thấy thông tin đó trong các bảng db mysql.

Nếu câu hỏi của bạn là về việc người dùng có thể truy vấn các bảng db mysql, hãy tránh . tài trợ. Thay vào đó, cung cấp các perm thích hợp cho db cụ thể. * Hoặc db.tablename.


2

Tôi có một biện pháp phòng ngừa tuyệt vời mà bạn phải thực hiện cho mysql.db của mình

Chạy truy vấn này, xin vui lòng:

SELECT COUNT(1) test_db_count FROM mysql.db WHERE SUBSTR(db,4) = 'test';

Nếu bạn nhận được test_db_count= 2, hãy loại bỏ chúng ngay lập tức !!!

Đây là lý do: Người dùng ẩn danh có quyền truy cập vào bất kỳ cơ sở dữ liệu nào có 4 chữ cái đầu tiên test. Bạn có thể thực hiện nhiều thứ chuyên sâu CRUD trong cơ sở dữ liệu thử nghiệm. Bạn cũng có thể muốn đổi tên cơ sở dữ liệu thử nghiệm thành một cái gì đó hoàn toàn khác. Vui lòng đọc các liên kết này bởi vì tôi đã giải quyết vấn đề này trước đây trong DBA StackExchange.

Để xác nhận sự cần thiết phải thực hiện việc này, vui lòng lưu ý Hướng dẫn nghiên cứu chứng chỉ MySQL 5.0 nói gì về các điểm chính của nó:

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;
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.