Đặc quyền mysql nào sau đây cho phép người dùng xóa cơ sở dữ liệu, bảng hoặc dạng xem?
MySQL có một hệ thống đặc quyền/bảo mật tiên tiến nhưng không chuẩn. Phần này mô tả cách nó hoạt động Show
Nguyên tắc bảo mật chungBất kỳ ai sử dụng MySQL trên máy tính kết nối Internet nên đọc phần này để tránh những lỗi bảo mật phổ biến nhất Khi thảo luận về bảo mật, chúng tôi nhấn mạnh sự cần thiết phải bảo vệ hoàn toàn toàn bộ máy chủ lưu trữ (không chỉ máy chủ MySQL) trước tất cả các loại tấn công hiện hành. nghe trộm, thay đổi, phát lại và từ chối dịch vụ. Chúng tôi không đề cập đến tất cả các khía cạnh về tính khả dụng và khả năng chịu lỗi ở đây MySQL sử dụng bảo mật dựa trên Danh sách điều khiển truy cập (ACL) cho tất cả các kết nối, truy vấn và các hoạt động khác mà người dùng có thể cố gắng thực hiện. Ngoài ra còn có một số hỗ trợ cho các kết nối được mã hóa SSL giữa máy khách và máy chủ MySQL. Nhiều khái niệm được thảo luận ở đây hoàn toàn không dành riêng cho MySQL; Khi chạy MySQL, hãy làm theo các nguyên tắc này bất cứ khi nào có thể
Cách làm cho MySQL an toàn trước crackersKhi bạn kết nối với máy chủ MySQL, thông thường bạn nên sử dụng mật khẩu. Mật khẩu không được truyền dưới dạng văn bản rõ ràng qua kết nối, tuy nhiên thuật toán mã hóa không mạnh lắm và với một số nỗ lực, kẻ tấn công thông minh có thể bẻ khóa mật khẩu nếu anh ta có thể đánh hơi được lưu lượng giữa máy khách và máy chủ. Nếu kết nối giữa máy khách và máy chủ đi qua một mạng không đáng tin cậy, bạn nên sử dụng đường hầm SSH để mã hóa giao tiếp Tất cả các thông tin khác được chuyển dưới dạng văn bản mà bất kỳ ai có thể xem kết nối đều có thể đọc được. Nếu lo ngại về điều này, bạn có thể sử dụng giao thức nén (trong MySQL Version 3. 22 trở lên) để khiến mọi thứ trở nên khó khăn hơn nhiều. Để làm cho mọi thứ an toàn hơn, bạn nên sử dụng ssh. Bạn có thể tìm thấy ứng dụng khách ssh mã nguồn mở tại http. //www. mở cửa. org/, và một ứng dụng khách ssh thương mại tại http. //www. ssh. com/. Với điều này, bạn có thể nhận được kết nối TCP/IP được mã hóa giữa máy chủ MySQL và máy khách MySQL Nếu bạn đang sử dụng MySQL 4. 0, bạn cũng có thể sử dụng hỗ trợ openssl nội bộ. Thấy Để đảm bảo an toàn cho hệ thống MySQL, bạn nên xem xét kỹ các đề xuất sau
Tùy chọn khởi động cho mysqld liên quan đến bảo mậtCác tùy chọn mysqld sau ảnh hưởng đến bảo mật --local-infile[=(0. 1)] Nếu một người sử dụng --local-infile=0, một người không thể sử dụng LOAD DATA LOCAL INFILE --safe-show-cơ sở dữ liệuVới tùy chọn này, SHOW DATABASES chỉ trả về những cơ sở dữ liệu mà người dùng có một số loại đặc quyền --safe-user-tạoNếu điều này được bật, người dùng không thể tạo người dùng mới bằng lệnh GRANT, nếu người dùng không có đặc quyền chèn cho mysql. bảng người dùng. Nếu bạn muốn cấp cho người dùng quyền truy cập để chỉ tạo người dùng mới với những đặc quyền mà người dùng đó có quyền cấp, bạn nên cấp cho người dùng đặc quyền sau ________số 8_______Điều này sẽ đảm bảo rằng người dùng không thể thay đổi trực tiếp bất kỳ cột đặc quyền nào mà phải sử dụng lệnh GRANT để cấp đặc quyền cho người dùng khác --skip-grant-bảngTùy chọn này khiến máy chủ hoàn toàn không sử dụng hệ thống đặc quyền. Điều này cho phép mọi người truy cập đầy đủ vào tất cả các cơ sở dữ liệu. (Bạn có thể yêu cầu máy chủ đang chạy bắt đầu sử dụng lại các bảng cấp bằng cách thực thi mysqladmin flush-privileges hoặc mysqladmin reload. ) --skip-tên-giải quyếtTên máy chủ không được giải quyết. Tất cả các giá trị cột Máy chủ trong bảng cấp phải là số IP hoặc localhost --skip-mạngKhông cho phép kết nối TCP/IP qua mạng. Tất cả các kết nối đến mysql phải được thực hiện thông qua ổ cắm Unix. Tùy chọn này không phù hợp với các hệ thống sử dụng MIT-pthread vì gói MIT-pthreads không hỗ trợ ổ cắm Unix --skip-show-cơ sở dữ liệuVới tùy chọn này, câu lệnh SHOW DATABASES không trả về bất kỳ thứ gì Vấn đề bảo mật với LOAD DATA LOCALTrong Mysql 3. 23. 49 và MySQL 4. 0. 2, chúng tôi đã thêm một số tùy chọn mới để xử lý các sự cố bảo mật có thể xảy ra khi tải dữ liệu cục bộ Có hai vấn đề có thể xảy ra khi hỗ trợ lệnh này Khi việc đọc tệp được bắt đầu từ máy chủ, về mặt lý thuyết, người ta có thể tạo một máy chủ MySQL được vá có thể đọc bất kỳ tệp nào trên máy khách mà người dùng hiện tại có quyền đọc, khi máy khách đưa ra truy vấn đối với bảng Trong môi trường web nơi máy khách đang kết nối từ máy chủ web, người dùng có thể sử dụng LOAD DATA LOCAL để đọc bất kỳ tệp nào mà quy trình máy chủ web có quyền truy cập đọc (giả sử người dùng có thể chạy bất kỳ lệnh nào đối với máy chủ SQL) Có hai bản sửa lỗi riêng cho việc này Nếu bạn không định cấu hình MySQL bằng --enable-local-infile, LOAD DATA LOCAL sẽ bị tắt bởi tất cả các máy khách, trừ khi mysql_options(. MYSQL_OPT_LOCAL_INFILE, 0) được gọi trong máy khách. Thấy Đối với máy khách dòng lệnh mysql, có thể bật LOAD DATA LOCAL bằng cách chỉ định tùy chọn --local-infile[=1] hoặc tắt với --local-infile=0 Theo mặc định, tất cả các máy khách và thư viện MySQL được biên dịch với --enable-local-infile, để tương thích với MySQL 3. 23. 48 trở về trước Người ta có thể vô hiệu hóa tất cả các lệnh LOAD DATA LOCAL trong máy chủ MySQL bằng cách bắt đầu mysqld với --local-infile=0 Trong trường hợp LOAD DATA INFILE bị tắt trong máy chủ hoặc máy khách, bạn sẽ nhận được thông báo lỗi (1148) The used command is not allowed with this MySQL version Hệ thống đặc quyền làm gìChức năng chính của hệ thống đặc quyền MySQL là xác thực người dùng kết nối từ một máy chủ nhất định và liên kết người dùng đó với các đặc quyền trên cơ sở dữ liệu như chọn, chèn, cập nhật và xóa Chức năng bổ sung bao gồm khả năng có người dùng ẩn danh và cấp đặc quyền cho các chức năng dành riêng cho MySQL, chẳng hạn như LOAD DATA INFILE và các hoạt động quản trị Hệ thống đặc quyền hoạt động như thế nàoHệ thống đặc quyền của MySQL đảm bảo rằng tất cả người dùng có thể làm chính xác những việc mà họ được phép làm. Khi bạn kết nối với máy chủ MySQL, danh tính của bạn được xác định bởi máy chủ mà bạn kết nối và tên người dùng bạn chỉ định. Hệ thống cấp đặc quyền theo danh tính của bạn và những gì bạn muốn làm MySQL xem xét cả tên máy chủ và tên người dùng của bạn để nhận dạng bạn vì có rất ít lý do để cho rằng tên người dùng đã cho thuộc về cùng một người ở mọi nơi trên Internet. Ví dụ: người dùng joe kết nối từ văn phòng. com không cần phải là cùng một người với người dùng joe kết nối từ nơi khác. com. MySQL xử lý việc này bằng cách cho phép bạn phân biệt người dùng trên các máy chủ khác nhau có cùng tên. bạn có thể cấp cho joe một bộ đặc quyền cho các kết nối từ văn phòng. com và một bộ đặc quyền khác cho các kết nối từ nơi khác. com Kiểm soát truy cập MySQL bao gồm hai giai đoạn
Máy chủ sử dụng các bảng người dùng, db và máy chủ trong cơ sở dữ liệu mysql ở cả hai giai đoạn kiểm soát truy cập. Các trường trong các bảng cấp này được hiển thị ở đây Tên bảng người sử dụng db chủ nhà trường phạm vi Chủ nhà Chủ nhà Chủ nhà Người sử dụng Db Db Mật khẩu Người sử dụng trường đặc quyền Select_priv Select_priv Select_priv Chèn_priv Chèn_priv Chèn_priv Update_priv Update_priv Update_priv Delete_priv Delete_priv Delete_priv Index_priv Index_priv Index_priv Alter_priv Alter_priv Alter_priv Tạo_priv Tạo_priv Tạo_priv Drop_priv Drop_priv Drop_priv Grant_priv Grant_priv Grant_priv References_priv Tải lại_priv Shutdown_priv Process_priv File_priv Đối với giai đoạn thứ hai của kiểm soát truy cập (xác minh yêu cầu), nếu yêu cầu liên quan đến bảng, máy chủ có thể tham khảo thêm các bảng table_priv và column_priv. Các trường trong các bảng này được hiển thị ở đây Tên bảng bảng_priv cột_priv trường phạm vi Chủ nhà Chủ nhà Db Db Người sử dụng Người sử dụng tên_bảng tên_bảng Tên cột dọc trường đặc quyền Table_priv Column_priv Column_priv Các lĩnh vực khác dấu thời gian dấu thời gian người cấp Mỗi bảng cấp chứa các trường phạm vi và trường đặc quyền Các trường phạm vi xác định phạm vi của từng mục nhập trong bảng—tức là ngữ cảnh mà mục nhập đó áp dụng. Ví dụ: một mục nhập bảng người dùng có các giá trị Máy chủ và Người dùng là 'thomas. lộc. gov' và 'bob' sẽ được sử dụng để xác thực các kết nối được thực hiện với máy chủ bởi bob từ máy chủ thomas. lộc. chính phủ. Tương tự, một mục nhập bảng db với các trường Máy chủ, Người dùng và Db của 'thomas. lộc. gov', 'bob' và 'reports' sẽ được sử dụng khi bob kết nối từ máy chủ thomas. lộc. gov để truy cập cơ sở dữ liệu báo cáo. Các bảng table_priv và cột_priv chứa các trường phạm vi cho biết bảng hoặc kết hợp bảng/cột mà mỗi mục áp dụng Đối với mục đích kiểm tra quyền truy cập, việc so sánh các giá trị Máy chủ không phân biệt chữ hoa chữ thường. Các giá trị Người dùng, Mật khẩu, Db và Tên_bảng phân biệt chữ hoa chữ thường. Các giá trị tên cột không phân biệt chữ hoa chữ thường trong Phiên bản MySQL 3. 22. 12 hoặc muộn hơn Các trường đặc quyền cho biết các đặc quyền được cấp bởi một mục trong bảng, nghĩa là những thao tác nào có thể được thực hiện. Máy chủ kết hợp thông tin trong các bảng cấp khác nhau để tạo thành một mô tả đầy đủ về các đặc quyền của người dùng. Các quy tắc được sử dụng để làm điều này được mô tả trong Các trường phạm vi là các chuỗi, được khai báo như minh họa ở đây; tên trường Loại ghi chú Chủ nhà CHAR(60) Người sử dụng CHAR(16) Mật khẩu CHAR(16) Db CHAR(64) (CHAR(60) cho các bảng table_priv và column_priv) tên_bảng CHAR(60) Tên cột dọc CHAR(60) Trong bảng người dùng, db và máy chủ, tất cả các trường đặc quyền được khai báo là ENUM('N','Y')—mỗi trường có thể có giá trị là 'N' hoặc 'Y' và giá trị mặc định là 'N' Trong các bảng table_priv và column_priv, các trường đặc quyền được khai báo là các trường SET Tên bảng tên trường Các phần tử tập hợp có thể bảng_priv Table_priv 'Chọn', 'Chèn', 'Cập nhật', 'Xóa', 'Tạo', 'Thả', 'Cấp', 'Tham khảo', 'Chỉ mục', 'Thay đổi' bảng_priv Column_priv 'Chọn', 'Chèn', 'Cập nhật', 'Tham khảo' cột_priv Column_priv 'Chọn', 'Chèn', 'Cập nhật', 'Tham khảo' Tóm lại, máy chủ sử dụng các bảng cấp như thế này
Lưu ý rằng các đặc quyền quản trị (tải lại, tắt máy, v.v. ) chỉ được chỉ định trong bảng người dùng. Điều này là do các hoạt động quản trị là các hoạt động trên chính máy chủ và không dành riêng cho cơ sở dữ liệu, vì vậy không có lý do gì để liệt kê các đặc quyền đó trong các bảng cấp phép khác. Trên thực tế, chỉ cần tham khảo bảng người dùng để xác định xem bạn có thể thực hiện thao tác quản trị hay không Đặc quyền tệp cũng chỉ được chỉ định trong bảng người dùng. Nó không phải là một đặc quyền quản trị như vậy, nhưng khả năng đọc hoặc ghi tệp của bạn trên máy chủ lưu trữ độc lập với cơ sở dữ liệu bạn đang truy cập Máy chủ mysqld đọc nội dung của các bảng cấp một lần khi nó khởi động. Các thay đổi đối với các bảng cấp có hiệu lực như được chỉ ra trong Khi bạn sửa đổi nội dung của các bảng cấp, bạn nên đảm bảo rằng những thay đổi của bạn sẽ thiết lập các đặc quyền theo cách bạn muốn. Để được trợ giúp trong việc chẩn đoán sự cố, hãy xem. Để được tư vấn về các vấn đề bảo mật, hãy xem Một công cụ chẩn đoán hữu ích là tập lệnh mysqlaccess mà Yves Carlier đã cung cấp cho bản phân phối MySQL. Gọi mysqlaccess với --help tùy chọn để tìm hiểu cách thức hoạt động của nó. Lưu ý rằng mysqlaccess chỉ kiểm tra quyền truy cập bằng bảng người dùng, db và máy chủ. Nó không kiểm tra các đặc quyền cấp bảng hoặc cấp cột Đặc quyền được cung cấp bởi MySQLThông tin về các đặc quyền của người dùng được lưu trữ trong các bảng user, db, host, tables_priv và column_priv trong cơ sở dữ liệu mysql (nghĩa là trong cơ sở dữ liệu có tên mysql). Máy chủ MySQL đọc nội dung của các bảng này khi nó khởi động và trong các trường hợp được nêu trong Các tên được sử dụng trong sách hướng dẫn này để chỉ các đặc quyền do MySQL cung cấp được hiển thị ở đây, cùng với tên cột của bảng được liên kết với từng đặc quyền trong các bảng cấp và ngữ cảnh áp dụng đặc quyền đó đặc quyền Cột Định nghĩa bài văn lựa chọn Select_priv những cái bàn chèn Chèn_priv những cái bàn cập nhật Update_priv những cái bàn xóa bỏ Delete_priv những cái bàn mục lục Index_priv những cái bàn thay đổi Alter_priv những cái bàn tạo nên Tạo_priv cơ sở dữ liệu, bảng hoặc chỉ mục làm rơi Drop_priv cơ sở dữ liệu hoặc bảng khoản trợ cấp Grant_priv cơ sở dữ liệu hoặc bảng người giới thiệu References_priv cơ sở dữ liệu hoặc bảng tải lại Tải lại_priv quản trị máy chủ tắt Shutdown_priv quản trị máy chủ tiến trình Process_priv quản trị máy chủ tập tin File_priv truy cập tập tin trên máy chủ Các đặc quyền chọn, chèn, cập nhật và xóa cho phép bạn thực hiện các thao tác trên các hàng trong các bảng hiện có trong cơ sở dữ liệu Các câu lệnh SELECT chỉ yêu cầu đặc quyền chọn nếu chúng thực sự truy xuất các hàng từ một bảng. Bạn có thể thực thi một số câu lệnh CHỌN ngay cả khi không có quyền truy cập vào bất kỳ cơ sở dữ liệu nào trên máy chủ. Ví dụ: bạn có thể sử dụng ứng dụng khách mysql như một máy tính đơn giản mysql> SELECT 1+1; mysql> SELECT PI( )*2; Đặc quyền chỉ mục cho phép bạn tạo hoặc xóa (xóa) chỉ mục Đặc quyền thay đổi cho phép bạn sử dụng ALTER TABLE Các đặc quyền tạo và loại bỏ cho phép bạn tạo cơ sở dữ liệu và bảng mới hoặc loại bỏ (xóa) cơ sở dữ liệu và bảng hiện có Lưu ý rằng nếu bạn cấp đặc quyền loại bỏ cơ sở dữ liệu mysql cho người dùng, người dùng đó có thể loại bỏ cơ sở dữ liệu lưu trữ các đặc quyền truy cập MySQL Đặc quyền cấp cho phép bạn cấp cho người dùng khác những đặc quyền mà bạn sở hữu Đặc quyền tệp cho phép bạn đọc và ghi tệp trên máy chủ bằng cách sử dụng LOAD DATA INFILE và SELECT. Câu lệnh INTO OUTFILE. Bất kỳ người dùng nào được cấp đặc quyền này đều có thể đọc hoặc ghi bất kỳ tệp nào mà máy chủ MySQL có thể đọc hoặc ghi Các đặc quyền còn lại được sử dụng cho các hoạt động quản trị, được thực hiện bằng chương trình mysqladmin. Bảng sau đây cho biết các lệnh mysqladmin nào mà mỗi đặc quyền quản trị cho phép bạn thực thi đặc quyền Các lệnh được phép cho chủ sở hữu đặc quyền tải lại tải lại, làm mới, đặc quyền tuôn ra, máy chủ lưu trữ, nhật ký tuôn ra và bảng tuôn ra tắt tắt tiến trình danh sách quy trình, giết Lệnh tải lại yêu cầu máy chủ đọc lại các bảng cấp. Lệnh làm mới xóa tất cả các bảng và mở và đóng các tệp nhật ký. flush-privileges là từ đồng nghĩa với tải lại. Các lệnh flush-* khác thực hiện các chức năng tương tự như làm mới nhưng bị giới hạn hơn về phạm vi và có thể thích hợp hơn trong một số trường hợp. Ví dụ: nếu bạn chỉ muốn xóa các tệp nhật ký, thì nhật ký xóa là lựa chọn tốt hơn so với làm mới Lệnh tắt máy tắt máy chủ Lệnh processlist hiển thị thông tin về các luồng đang thực thi bên trong máy chủ. Lệnh kill giết các luồng máy chủ. Bạn luôn có thể hiển thị hoặc hủy chuỗi của riêng mình, nhưng bạn cần có đặc quyền của quy trình để hiển thị hoặc hủy chuỗi do người dùng khác khởi tạo. Thấy Nói chung, tốt nhất là chỉ cấp đặc quyền cho những người dùng cần chúng, nhưng bạn nên đặc biệt thận trọng khi cấp một số đặc quyền nhất định
Có một số điều bạn không thể làm với hệ thống đặc quyền của MySQL
Kết nối với máy chủ MySQLCác chương trình máy khách MySQL thường yêu cầu bạn chỉ định các tham số kết nối khi bạn muốn truy cập máy chủ MySQL. máy chủ bạn muốn kết nối, tên người dùng và mật khẩu của bạn. Ví dụ: ứng dụng khách mysql có thể được bắt đầu như thế này (các đối số tùy chọn được đặt giữa [mysqld] user=mysql1 và [mysqld] user=mysql2) shell> mysql [-h host_name] [-u user_name] [-pyour_pass] Các dạng thay thế của các tùy chọn -h, -u và -p là --host=host_name, --user=user_name và --password=your_pass. Lưu ý rằng không có khoảng cách giữa -p hoặc --password= và mật khẩu theo sau nó Ghi chú. Chỉ định mật khẩu trên dòng lệnh không an toàn. Sau đó, bất kỳ người dùng nào trên hệ thống của bạn có thể tìm ra mật khẩu của bạn bằng cách nhập một lệnh như. ps auxww. Thấy mysql sử dụng các giá trị mặc định cho các tham số kết nối bị thiếu trong dòng lệnh
Do đó, đối với người dùng Unix joe, các lệnh sau là tương đương shell> mysql -h localhost -u joe shell> mysql -h localhost shell> mysql -u joe shell> mysql Các máy khách MySQL khác hoạt động tương tự Trên các hệ thống Unix, bạn có thể chỉ định các giá trị mặc định khác nhau sẽ được sử dụng khi tạo kết nối để bạn không cần nhập chúng trên dòng lệnh mỗi khi gọi một chương trình máy khách. Điều này có thể được thực hiện theo một số cách
Kiểm soát truy cập, Giai đoạn 1. Xác minh kết nốiKhi bạn cố gắng kết nối với máy chủ MySQL, máy chủ sẽ chấp nhận hoặc từ chối kết nối dựa trên danh tính của bạn và liệu bạn có thể xác minh danh tính của mình bằng cách cung cấp đúng mật khẩu hay không. Nếu không, máy chủ từ chối hoàn toàn quyền truy cập của bạn. Nếu không, máy chủ chấp nhận kết nối, sau đó chuyển sang Giai đoạn 2 và chờ yêu cầu Danh tính của bạn dựa trên hai mẩu thông tin
Kiểm tra danh tính được thực hiện bằng ba trường phạm vi bảng người dùng (Máy chủ, Người dùng và Mật khẩu). Máy chủ chỉ chấp nhận kết nối nếu mục nhập trong bảng người dùng khớp với tên máy chủ và tên người dùng của bạn và bạn cung cấp đúng mật khẩu Các giá trị trong trường phạm vi bảng người dùng có thể được chỉ định như sau
Giá trị mật khẩu không trống đại diện cho mật khẩu được mã hóa. MySQL không lưu trữ mật khẩu ở dạng văn bản gốc cho bất kỳ ai xem. Thay vào đó, mật khẩu được cung cấp bởi người dùng đang cố gắng kết nối được mã hóa (sử dụng hàm MẬT KHẨU()). Sau đó, mật khẩu được mã hóa sẽ được sử dụng khi máy khách/máy chủ đang kiểm tra xem mật khẩu có đúng không. (Điều này được thực hiện mà không cần mật khẩu được mã hóa đi qua kết nối. ) Lưu ý rằng theo quan điểm của MySQL, mật khẩu được mã hóa là mật khẩu THỰC, vì vậy bạn không nên cấp cho bất kỳ ai quyền truy cập vào mật khẩu đó. Đặc biệt, không cấp cho người dùng bình thường quyền truy cập đọc vào các bảng trong cơ sở dữ liệu mysql Các ví dụ sau đây cho thấy cách kết hợp các giá trị Máy chủ và Người dùng khác nhau trong các mục nhập của bảng người dùng áp dụng cho các kết nối đến Giá trị máy chủ Giá trị người dùng Các kết nối phù hợp với mục nhập 'thomas. lộc. chính phủ' 'fred' fred, kết nối từ thomas. lộc. chính phủ 'thomas. lộc. chính phủ' " Bất kỳ người dùng nào, kết nối từ thomas. lộc. chính phủ '%' 'fred' fred, kết nối từ bất kỳ máy chủ nào '%' " Bất kỳ người dùng nào, kết nối từ bất kỳ máy chủ nào '%. lộc. chính phủ' 'fred' fred, kết nối từ bất kỳ máy chủ nào trong loc. tên miền gov 'x. y. %' 'fred' fred, kết nối từ x. y. lưới, x. y. com,x. y. giáo dục, v.v. (điều này có thể không hữu ích) '144. 155. 166. 177' 'fred' fred, kết nối từ máy chủ với địa chỉ IP 144. 155. 166. 177 '144. 155. 166. %' 'fred' fred, kết nối từ bất kỳ máy chủ nào trong 144. 155. 166 mạng con lớp C '144. 155. 166. 0/255. 255. 255. 0' 'fred' Giống như ví dụ trước Bởi vì bạn có thể sử dụng các giá trị ký tự đại diện IP trong trường Máy chủ (ví dụ: '144. 155. 166. %' để khớp với mọi máy chủ trên mạng con), có khả năng ai đó có thể cố khai thác khả năng này bằng cách đặt tên cho máy chủ 144. 155. 166. một vài nơi. com. Để ngăn chặn những nỗ lực như vậy, MySQL không cho phép khớp trên tên máy chủ bắt đầu bằng chữ số và dấu chấm. Do đó, nếu bạn có tên máy chủ giống như 1. 2. foo. com, tên của nó sẽ không bao giờ trùng với cột Host của các bảng cấp. Chỉ một số IP mới có thể khớp với giá trị ký tự đại diện IP Một kết nối đến có thể được khớp với nhiều mục nhập trong bảng người dùng. Ví dụ, một kết nối từ thomas. lộc. gov của fred sẽ được khớp với một số mục được hiển thị trong bảng trước. Làm cách nào để máy chủ chọn mục nhập nào sẽ sử dụng nếu có nhiều mục phù hợp? . Mục phù hợp đầu tiên là mục được sử dụng sắp xếp bảng người dùng hoạt động như sau. Giả sử bảng người dùng trông như thế này shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings2 Khi máy chủ đọc trong bảng, nó sẽ sắp xếp các mục nhập có giá trị Máy chủ cụ thể nhất trước tiên ('%' trong cột Máy chủ có nghĩa là “bất kỳ máy chủ nào” và ít cụ thể nhất). Các mục nhập có cùng giá trị Máy chủ lưu trữ được sắp xếp với giá trị Người dùng cụ thể nhất trước (giá trị Người dùng trống có nghĩa là “bất kỳ người dùng nào” và ít cụ thể nhất). Bảng người dùng được sắp xếp kết quả trông như thế này shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings3 Khi thử kết nối, máy chủ sẽ xem qua các mục được sắp xếp và sử dụng kết quả khớp đầu tiên được tìm thấy. Đối với kết nối từ máy chủ cục bộ của jeffrey, các mục nhập có 'localhost' trong cột Máy chủ sẽ khớp trước. Trong số đó, mục có tên người dùng trống khớp với cả tên máy chủ và tên người dùng đang kết nối. (Mục nhập '%'/'jeffrey' cũng sẽ khớp, nhưng nó không phải là mục khớp đầu tiên trong bảng. ) Đây là một ví dụ khác. Giả sử bảng người dùng trông như thế này shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings4 Bảng được sắp xếp trông như thế này shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings5 Một kết nối từ thomas. lộc. gov của jeffrey phù hợp với mục nhập đầu tiên, trong khi kết nối từ whitehouse. gov của jeffrey được khớp với thứ hai Một quan niệm sai lầm phổ biến là nghĩ rằng đối với một tên người dùng nhất định, tất cả các mục nhập có tên rõ ràng của người dùng đó sẽ được sử dụng trước tiên khi máy chủ cố gắng tìm kết quả phù hợp cho kết nối. Đơn giản là nó sai. Ví dụ trước minh họa điều này, trong đó một kết nối từ thomas. lộc. gov của jeffrey được so khớp lần đầu tiên không phải bởi mục nhập chứa 'jeffrey' làm giá trị trường Người dùng, mà bởi mục nhập không có tên người dùng Nếu bạn gặp sự cố khi kết nối với máy chủ, hãy in bảng người dùng ra và sắp xếp bằng tay để xem vị trí khớp đầu tiên được thực hiện Kiểm soát truy cập, Giai đoạn 2. Yêu cầu xác minhSau khi bạn thiết lập kết nối, máy chủ sẽ chuyển sang Giai đoạn 2. Đối với mỗi yêu cầu xuất hiện trên kết nối, máy chủ sẽ kiểm tra xem bạn có đủ đặc quyền để thực hiện yêu cầu đó hay không, dựa trên loại thao tác bạn muốn thực hiện. Đây là nơi các trường đặc quyền trong bảng cấp phát huy tác dụng. Các đặc quyền này có thể đến từ bất kỳ bảng người dùng, db, máy chủ, bảng_priv hoặc cột_priv nào. Các bảng cấp được thao tác bằng các lệnh GRANT và REVOKE. Thấy. (Bạn có thể thấy hữu ích khi tham khảo, liệt kê các trường có trong mỗi bảng cấp. ) Bảng người dùng cấp các đặc quyền được chỉ định cho bạn trên cơ sở toàn cầu và áp dụng bất kể cơ sở dữ liệu hiện tại là gì. Ví dụ: nếu bảng người dùng cấp cho bạn đặc quyền xóa, bạn có thể xóa các hàng khỏi bất kỳ cơ sở dữ liệu nào trên máy chủ lưu trữ. Nói cách khác, đặc quyền bảng người dùng là đặc quyền siêu người dùng. Sẽ là khôn ngoan khi chỉ cấp các đặc quyền trong bảng người dùng cho những người siêu người dùng như quản trị viên máy chủ hoặc cơ sở dữ liệu. Đối với những người dùng khác, bạn nên đặt các đặc quyền trong bảng người dùng thành 'N' và chỉ cấp các đặc quyền trên cơ sở dành riêng cho cơ sở dữ liệu, sử dụng bảng db và máy chủ Các bảng db và máy chủ cấp các đặc quyền dành riêng cho cơ sở dữ liệu. Các giá trị trong các trường phạm vi có thể được chỉ định như sau
Các bảng db và Host được đọc và sắp xếp khi máy chủ khởi động (đồng thời nó đọc bảng người dùng). Bảng db được sắp xếp trên các trường phạm vi Máy chủ, Db và Người dùng và bảng máy chủ được sắp xếp trên các trường phạm vi Máy chủ và Db. Cũng giống như bảng người dùng, việc sắp xếp sẽ đặt các giá trị cụ thể nhất lên trước và các giá trị cụ thể nhất vào cuối cùng và khi máy chủ tìm kiếm các mục khớp, nó sẽ sử dụng kết quả khớp đầu tiên mà nó tìm thấy Các bảng table_priv và column_priv cấp các đặc quyền dành riêng cho bảng và cột. Các giá trị trong các trường phạm vi có thể được chỉ định như sau
Các bảng table_priv và column_priv được sắp xếp trên các trường Host, Db và User. Điều này tương tự như sắp xếp bảng db, mặc dù việc sắp xếp đơn giản hơn vì chỉ trường Máy chủ mới có thể chứa ký tự đại diện Quá trình xác minh yêu cầu được mô tả tiếp theo. (Nếu bạn đã quen với mã nguồn kiểm tra quyền truy cập, bạn sẽ nhận thấy rằng mô tả ở đây hơi khác so với thuật toán được sử dụng trong mã. Mô tả tương đương với những gì mã thực sự làm; . ) For administrative requests (shutdown, reload, etc. ), máy chủ chỉ kiểm tra mục nhập của bảng người dùng vì đó là bảng duy nhất chỉ định các đặc quyền quản trị. Quyền truy cập được cấp nếu mục nhập cho phép thao tác được yêu cầu và bị từ chối nếu không. Ví dụ: nếu bạn muốn thực hiện tắt mysqladmin nhưng mục nhập bảng người dùng của bạn không cấp đặc quyền tắt cho bạn, quyền truy cập sẽ bị từ chối mà không cần kiểm tra bảng db hoặc máy chủ. (Chúng không chứa cột Shutdown_priv nên không cần làm như vậy. ) Đối với các yêu cầu liên quan đến cơ sở dữ liệu (chèn, cập nhật, v.v. ), trước tiên, máy chủ sẽ kiểm tra các đặc quyền toàn cầu (siêu người dùng) của người dùng bằng cách tìm trong mục nhập của bảng người dùng. Nếu mục nhập cho phép thao tác được yêu cầu, quyền truy cập sẽ được cấp. Nếu các đặc quyền chung trong bảng người dùng không đủ, máy chủ sẽ xác định các đặc quyền dành riêng cho cơ sở dữ liệu của người dùng bằng cách kiểm tra các bảng db và máy chủ
Sau khi xác định các đặc quyền dành riêng cho cơ sở dữ liệu được cấp bởi các mục trong bảng db và máy chủ, máy chủ sẽ thêm chúng vào các đặc quyền chung được cấp bởi bảng người dùng. Nếu kết quả cho phép thao tác được yêu cầu, quyền truy cập được cấp. Mặt khác, máy chủ sẽ kiểm tra các đặc quyền của bảng và cột của người dùng trong các bảng table_priv và column_priv và thêm chúng vào các đặc quyền của người dùng. Quyền truy cập được phép hoặc bị từ chối dựa trên kết quả Được thể hiện bằng thuật ngữ boolean, mô tả trước đây về cách tính các đặc quyền của người dùng có thể được tóm tắt như sau shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings6 Có thể không rõ tại sao, nếu các đặc quyền nhập cảnh của người dùng chung ban đầu được phát hiện là không đủ cho thao tác được yêu cầu, thì máy chủ sẽ thêm các đặc quyền đó vào các đặc quyền dành riêng cho cơ sở dữ liệu, bảng- và cột cụ thể sau đó. Lý do là một yêu cầu có thể yêu cầu nhiều hơn một loại đặc quyền. Ví dụ, nếu bạn thực hiện lệnh INSERT. SELECT, bạn cần có cả quyền chèn và quyền chọn. Các đặc quyền của bạn có thể sao cho mục nhập bảng người dùng cấp một đặc quyền và mục nhập bảng db cấp đặc quyền kia. Trong trường hợp này, bạn có các đặc quyền cần thiết để thực hiện yêu cầu, nhưng máy chủ không thể tự nhận biết điều đó từ một trong hai bảng; Bảng máy chủ có thể được sử dụng để duy trì danh sách các máy chủ an toàn Tại TcX, bảng máy chủ chứa danh sách tất cả các máy trong mạng cục bộ. Chúng được cấp tất cả các đặc quyền Bạn cũng có thể sử dụng bảng máy chủ để chỉ ra các máy chủ không an toàn. Giả sử bạn có một máy công khai. của bạn. domain that is located in a public area that you do not consider secure. Bạn có thể cho phép truy cập vào tất cả các máy chủ trên mạng của mình ngoại trừ máy đó bằng cách sử dụng các mục trong bảng máy chủ như thế này shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings7 Đương nhiên, bạn phải luôn kiểm tra các mục nhập của mình trong bảng cấp (ví dụ: sử dụng mysqlaccess) để đảm bảo rằng các đặc quyền truy cập của bạn thực sự được thiết lập theo cách bạn nghĩ. Nguyên nhân của lỗi truy cập bị từ chốiNếu bạn gặp phải lỗi Truy cập bị từ chối khi cố gắng kết nối với máy chủ MySQL, danh sách sau đây cho biết một số hành động bạn có thể thực hiện để khắc phục sự cố
|