Làm cứng Mysql

Theo trang web chính thức của MySQL, MySQL là “hệ thống quản lý cơ sở dữ liệu quan hệ nguồn mở [RDBMS]”

  • Mã hóa kết nối
  • Giới hạn lỗi kết nối
  • Vô hiệu hóa LOAD DATA LOCAL INFILE
  • Tắt HIỂN THỊ CƠ SỞ DỮ LIỆU
  • Kịch bản cứng
  • Ràng buộc giao diện
  • Tăng cường đặc quyền
  • Đổi tên người dùng gốc
  • Người giới thiệu

Mã hóa kết nối¶

Theo mặc định, các kết nối MySQL không được mã hóa và mọi thứ truyền qua mạng ở dạng văn bản mở. Nếu bạn đang sử dụng MySQL qua mạng, bạn nên sử dụng mã hóa, hãy tham khảo tài liệu về MySQL để hiểu cách định cấu hình cơ chế mã hóa

Giới hạn lỗi kết nối¶

Nên áp dụng lệnh cấm máy chủ đối với khách hàng có nhiều lần xác thực không thành công. Như đã nêu trong tài liệu MySQL

Nếu có nhiều hơn số lượng kết nối bị gián đoạn này từ một máy chủ, máy chủ đó sẽ bị chặn khỏi các kết nối tiếp theo. Bạn có thể bỏ chặn các máy chủ bị chặn bằng câu lệnh FLUSH HOSTS. Nếu một kết nối được thiết lập thành công trong vòng ít hơn max_connect_errors lần thử sau khi kết nối trước đó bị gián đoạn, số lỗi cho máy chủ sẽ bị xóa thành 0. Tuy nhiên, khi một máy chủ bị chặn, câu lệnh FLUSH HOSTS là cách duy nhất để bỏ chặn nó

Chỉnh sửa tập tin cấu hình của tôi. cnf và đặt max_connect_errors

max_connect_errors = 3

Tắt LOAD DATA LOCAL INFILE¶

Lệnh LOAD DATA LOCAL INFILE cho phép người dùng hoặc kẻ tấn công đọc các tệp cục bộ và thậm chí truy cập các tệp khác trên hệ điều hành. Nó cũng là một lệnh phổ biến được sử dụng bởi những kẻ tấn công khai thác bằng các phương pháp như SQL injection. Bạn nên tắt lệnh, chỉnh sửa tệp cấu hình của tôi. cnf và đặt local-infile

local-infile=0

Tắt SHOW DATABASES¶

SHOW DATABASES là một lệnh được người dùng hoặc kẻ tấn công sử dụng để liệt kê tất cả các cơ sở dữ liệu có sẵn. Việc loại bỏ khả năng thu thập thông tin của những kẻ tấn công từ xa là rất quan trọng đối với một thế trận bảo mật an toàn. Bạn nên tắt lệnh, chỉnh sửa tệp cấu hình của tôi. cnf và thêm cơ sở dữ liệu bỏ qua vào phần [mysqld]

[mysqld]
skip-show-database

Kịch bản gia cố¶

MySQL đi kèm với một tập lệnh cứng để kiểm tra bảo mật máy chủ cơ sở dữ liệu và xóa một số cài đặt mặc định. Bạn có thể chạy nó bằng lệnh

mysql_secure_installation

Nó sẽ hỏi bạn về mức độ cứng mong muốn của bạn thông qua một số câu hỏi

Ràng buộc giao diện¶

Nếu bạn không cần truy cập cơ sở dữ liệu của mình từ một máy khác, bạn chỉ nên liên kết dịch vụ MySQL trên máy chủ cục bộ, hãy chỉnh sửa tệp cấu hình của tôi. cnf và đặt địa chỉ liên kết

bind-address = 127.0.0.1

Bạn cũng có thể tắt kết nối mạng nếu không sử dụng tùy chọn bỏ qua kết nối mạng

Tăng cường đặc quyền¶

Bạn nên quản lý cẩn thận người dùng và đặc quyền, bạn nên tuân theo ít nhất những phương pháp hay nhất này

  • Mỗi ứng dụng sử dụng MySQL phải có người dùng riêng chỉ có các đặc quyền hạn chế và chỉ có quyền truy cập vào cơ sở dữ liệu mà nó cần để chạy
  • Không bao giờ sử dụng TẤT CẢ ĐẾN
  • Không bao giờ sử dụng % cho tên máy chủ
  • Quyền của người dùng ứng dụng nên hạn chế nhất có thể
  • Chỉ cho phép siêu đặc quyền đối với tài khoản dba và localhost
  • Không bao giờ cấp cho người dùng các đặc quyền toàn cầu, ngoại trừ quyền root, người dùng sao lưu, người dùng giám sát, người dùng sao chép
  • Thận trọng hơn khi cấp đặc quyền SUPER hoặc FILE. SUPER có thể sửa đổi cấu hình thời gian chạy và trở thành người dùng khác, FILE cho phép đọc hoặc ghi tệp theo quy trình của MySQL

Đổi tên người dùng gốc¶

Nên đổi tên đăng nhập root. Nếu kẻ tấn công đang cố truy cập thông tin đăng nhập MySQL gốc, họ sẽ cần thực hiện thêm bước tìm tên người dùng

Bảo mật cơ sở dữ liệu đòi hỏi phải cho phép hoặc không cho phép hành động của người dùng trên cơ sở dữ liệu và các đối tượng bên trong nó. Khi bạn tạo một ứng dụng cơ sở dữ liệu, chính sách bảo mật là bước đầu tiên. Chính sách bảo mật ứng dụng là danh sách các yêu cầu và quy tắc bảo mật ứng dụng quy định quyền truy cập của người dùng vào các đối tượng cơ sở dữ liệu. Chương này thảo luận về các khía cạnh của bảo mật ứng dụng và các tính năng của Cơ sở dữ liệu MySQL bao gồm các chủ đề sau

nội dung

  • Các vấn đề bảo mật chung của MySQL
  • Hệ thống đặc quyền truy cập MySQL
  • Quản lý tài khoản người dùng MySQL

Các vấn đề bảo mật chung của MySQL

Nguyên tắc bảo mật

  • Ngoại trừ tài khoản root MySQL không cho phép bất kỳ ai truy cập bảng người dùng trong cơ sở dữ liệu MySQL
  • Sử dụng các câu lệnh GRANT và REVOKE để kiểm soát quyền truy cập vào MySQL. Không cấp đặc quyền không cần thiết và không bao giờ cấp đặc quyền cho tất cả các máy chủ
  • Không bao giờ lưu trữ mật khẩu văn bản đơn giản trong cơ sở dữ liệu của bạn. Lưu trữ giá trị băm bằng các hàm  SHA2[], SHA1[], MD5[] hoặc hàm băm khác theo một cách khác. Cố gắng sử dụng một mật khẩu phức tạp
  • Hãy thử sử dụng tường lửa và đặt MySQL phía sau tường lửa
  • 3306 là cổng người dùng mặc định của MySQL và cổng này không thể truy cập được từ các máy chủ không đáng tin cậy. Bạn có thể quét các cổng từ Internet bằng một công cụ như nmap. Từ một máy từ xa, bạn có thể kiểm tra xem cổng có đang mở hay không bằng lệnh này. vỏ> máy chủ telnet_host 3306. Nếu telnet bị treo hoặc kết nối bị từ chối, cổng bị chặn. Nếu bạn nhận được một kết nối và một số ký tự rác, thì cổng đó đang mở và nên được đóng trên tường lửa hoặc bộ định tuyến của bạn, trừ khi bạn thực sự có lý do chính đáng để tiếp tục mở cổng
  • Một số ứng dụng truy cập cơ sở dữ liệu MySQL cho mục đích khác. Không bao giờ tin tưởng những dữ liệu đầu vào này do người dùng nhập và phải xác thực hợp lệ trước khi truy cập cơ sở dữ liệu
  • Không truyền dữ liệu không được mã hóa qua Internet. Sử dụng giao thức được mã hóa như SSL [MySQL hỗ trợ kết nối SSL nội bộ] hoặc SSH
  • Sử dụng tiện ích tcpdump và chuỗi. Bằng cách ban hành lệnh này shell> tcpdump -l -i eth0 -w - src hoặc dst port 3306. chuỗi, bạn có thể kiểm tra xem các luồng dữ liệu MySQL không được mã hóa hay không

Giữ mật khẩu an toàn

  • Hướng dẫn người dùng cuối về bảo mật mật khẩu
    • Sử dụng tùy chọn -p hoặc --password trên dòng lệnh không có giá trị mật khẩu được chỉ định. Đây là lệnh

      shell> mysql -u user_id -p database_name
      Nhập mật khẩu. ***********
      Khi bạn nhập mật khẩu, nó sẽ không hiển thị.

    • Lưu trữ mật khẩu của bạn trong một tệp tùy chọn. Ví dụ Unix, bạn có thể liệt kê mật khẩu của mình trong phần [client] của. của tôi. cnf trong thư mục chính của bạn và để giữ an toàn cho mật khẩu, hãy đặt chế độ truy cập tệp thành 400 hoặc 600
  • Hướng dẫn của quản trị viên về bảo mật mật khẩu. MySQL lưu trữ mật khẩu cho tài khoản người dùng trong mysql. bảng người dùng. Do đó, bảng này không nên được truy cập bởi bất kỳ tài khoản phi quản trị nào. Mật khẩu tài khoản người dùng phải đặt lại theo thời gian
  • Mật khẩu và ghi nhật ký. Mật khẩu có thể được viết dưới dạng văn bản thuần túy trong các câu lệnh SQL, chẳng hạn như CREATE USER, GRANT và SET PASSWORD hoặc các câu lệnh gọi hàm PASSWORD[]. Nếu những câu lệnh này được máy chủ MySQL ghi lại như đã viết, thì những mật khẩu đó sẽ có sẵn cho bất kỳ ai có quyền truy cập vào nhật ký. Bắt đầu với MySQL 5. 6. 3, ghi nhật ký câu lệnh được sửa đổi để mật khẩu không xuất hiện ở dạng văn bản thuần túy cho các câu lệnh sau.
    CREATE USER .. IDENTIFIED BY ...GRANT .. IDENTIFIED BY ...SET PASSWORD ...SLAVE START .. PASSWORD = ..  [as of 5.6.4]CREATE SERVER .. OPTIONS[.. PASSWORD ...] [as of 5.6.9]ALTER SERVER .. OPTIONS[.. PASSWORD ...]  [as of 5.6.9]
    
    Mật khẩu trong các câu lệnh đó được viết lại để không xuất hiện theo nghĩa đen trong văn bản câu lệnh, đối với nhật ký truy vấn chung, nhật ký truy vấn chậm và nhật ký nhị phân. Viết lại không áp dụng cho các báo cáo khác
  • Băm mật khẩu trong MySQL. MySQL liệt kê các tài khoản người dùng trong bảng người dùng của cơ sở dữ liệu MySQL. Mỗi tài khoản MySQL có thể được chỉ định một mật khẩu, mặc dù bảng người dùng không lưu trữ phiên bản rõ ràng của mật khẩu, nhưng một giá trị băm được tính toán từ nó
  • Ý nghĩa của các thay đổi băm mật khẩu trong MySQL 4. 1 cho Chương trình ứng dụng. Nâng cấp lên MySQL phiên bản 4. 1 trở lên có thể gây ra sự cố tương thích cho các ứng dụng sử dụng PASSWORD[] để tạo mật khẩu cho mục đích riêng của chúng. Các ứng dụng thực sự không nên làm điều này, vì PASSWORD[] chỉ nên được sử dụng để quản lý mật khẩu cho tài khoản MySQL
  • Plugin validate_password [có sẵn kể từ MySQL 5. 6. 6] có thể được sử dụng để kiểm tra mật khẩu và cải thiện bảo mật

Làm cho MySQL an toàn trước những kẻ tấn công

Để đảm bảo an toàn cho hệ thống MySQL, bạn nên duy trì các đề xuất sau

  • Yêu cầu tất cả tài khoản MySQL phải có mật khẩu
  • Đảm bảo rằng tài khoản người dùng Unix duy nhất có đặc quyền đọc hoặc ghi trong thư mục cơ sở dữ liệu là tài khoản được sử dụng để chạy mysqld
  • Không bao giờ chạy máy chủ MySQL với tư cách là người dùng gốc Unix
  • Không cấp đặc quyền FILE cho người dùng không phải quản trị viên
  • Không cho phép sử dụng liên kết tượng trưng đến bảng
  • Các chương trình và chế độ xem được lưu trữ phải được viết bằng các nguyên tắc bảo mật
  • Nếu bạn không tin tưởng DNS của mình, bạn nên sử dụng địa chỉ IP thay vì tên máy chủ trong bảng cấp
  • Nếu bạn muốn hạn chế số lượng kết nối được phép cho một tài khoản, bạn có thể làm như vậy bằng cách đặt biến max_user_connections trong mysqld

Các tùy chọn và biến mysqld liên quan đến bảo mật

Bảng sau đây hiển thị các tùy chọn mysqld và các biến hệ thống ảnh hưởng đến bảo mật

TênMô tảCmd-LineTệp tùy chọnSystem VarVar Phạm viDynamic

cho phép-đáng ngờ-udfs

 

Tùy chọn này kiểm soát xem có thể tải các chức năng do người dùng xác định chỉ có ký hiệu xxx cho chức năng chính hay không. Theo mặc định,CóCó   automatic_sp_privilegesKhi biến này có giá trị là 1 [mặc định], máy chủ sẽ tự động cấp các đặc quyền THỰC HIỆN và THAY ĐỔI QUY TRÌNH cho người tạo quy trình được lưu trữ, nếu người dùng chưa thể thực thi và thay đổi hoặc hủy quy trình. [Đặc quyền ALTER ROUTINE là bắt buộc để bỏ thói quen. ] Máy chủ cũng tự động loại bỏ các đặc quyền đó khỏi người tạo khi thói quen bị loại bỏ. Nếu automatic_sp_privileges bằng 0, máy chủ không tự động thêm hoặc loại bỏ các đặc quyền này. YesGlobalYeschrootĐặt máy chủ mysqld trong môi trường đóng trong khi khởi động bằng cách sử dụng lệnh gọi hệ thống chroot[]. CóCó   des-key-fileĐọc các khóa DES mặc định từ tệp này. Các phím này được sử dụng bởi các hàm DES_ENCRYPT[] và DES_DECRYPT[]. Có Có   local_infileLiệu LOCAL có được hỗ trợ cho câu lệnh LOAD DATA INFILE hay không. Nếu biến này bị tắt, khách hàng không thể sử dụng LOCAL trong các câu lệnh LOAD DATA. YesGlobalYesold_passwordsBiến này xác định loại băm mật khẩu được thực hiện bởi hàm PASSWORD[] và các câu lệnh như CREATE USER và GRANT. YesBothYessafe-user-createNếu tùy chọn này được bật, người dùng không thể tạo người dùng MySQL mới bằng cách sử dụng câu lệnh GRANT trừ khi người dùng có đặc quyền INSERT cho mysql. bảng người dùng hoặc bất kỳ cột nào trong bảng. IYesYes   secure-authTùy chọn này khiến máy chủ chặn các kết nối của ứng dụng khách cố gắng sử dụng các tài khoản có mật khẩu được lưu trữ trong phiên bản cũ [trước 4. 1] định dạng. Sử dụng nó để ngăn chặn tất cả việc sử dụng mật khẩu sử dụng định dạng cũ [và do đó giao tiếp qua mạng không an toàn]. Có Có Toàn cầu Có- Biến. safe_authNếu biến này được bật, máy chủ sẽ chặn kết nối của các máy khách cố gắng sử dụng các tài khoản có mật khẩu được lưu trữ trong phiên bản cũ [trước 4. 1] định dạng. YesGlobalYessecure-file-privTheo mặc định, biến này trống. Nếu được đặt thành tên của một thư mục, nó sẽ hạn chế tác dụng của hàm LOAD_FILE[] và LOAD DATA và SELECT. Các câu lệnh INTO OUTFILE chỉ hoạt động với các tệp trong thư mục đó. Có Có Toàn cầu Không- Biến. safe_file_priv   YesGlobalNoskip-grant-tablesTùy chọn này khiến máy chủ khởi động mà hoàn toàn không sử dụng hệ thống đặc quyền, cho phép bất kỳ ai có quyền truy cập vào máy chủ truy cập không hạn chế vào tất cả cơ sở dữ liệu. Có Có   skip-name-resolveTất cả tương tác với mysqld phải được thực hiện bằng cách sử dụng đường dẫn có tên hoặc bộ nhớ dùng chung [trên Windows] hoặc tệp ổ cắm Unix [trên Unix]. Tùy chọn này rất được khuyến nghị cho các hệ thống chỉ cho phép máy khách cục bộ. Có Có Toàn cầu Không- Biến. skip_name_resolve   CóGlobalNoskip-networkingTất cả tương tác với mysqld phải được thực hiện bằng cách sử dụng các đường dẫn có tên hoặc bộ nhớ dùng chung [trên Windows] hoặc tệp ổ cắm Unix [trên Unix]. Tùy chọn này rất được khuyến nghị cho các hệ thống chỉ cho phép máy khách cục bộ. Có Có Toàn cầu Không- Biến. skip_networking   YesGlobalNoskip-show-databaseTùy chọn này đặt biến hệ thống skip_show_database kiểm soát ai được phép sử dụng câu lệnh SHOW DATABASES. Có Có Toàn cầu Không- Biến. skip_show_database   CóGlobalKhông


Cách chạy MySQL với tư cách người dùng bình thường

  • Trên Windows, bạn có thể chạy máy chủ dưới dạng dịch vụ Windows bằng tài khoản người dùng thông thường
  • Trên Unix, máy chủ MySQL mysqld có thể được khởi động và chạy bởi bất kỳ người dùng nào. Tuy nhiên, bạn nên tránh chạy máy chủ với tư cách là người dùng gốc Unix vì lý do bảo mật

Vấn đề bảo mật với LOAD DATA LOCAL

Có hai vấn đề bảo mật tiềm ẩn khi hỗ trợ phiên bản ĐỊA PHƯƠNG của câu lệnh LOAD DATA

  • Việc chuyển tệp từ máy chủ của máy khách sang máy chủ của máy chủ được bắt đầu bởi máy chủ MySQL. Về lý thuyết, một máy chủ được vá lỗi có thể được xây dựng để yêu cầu chương trình máy khách chuyển một tệp do máy chủ chọn thay vì tệp do máy khách đặt tên trong câu lệnh LOAD DATA. Một máy chủ như vậy có thể truy cập bất kỳ tệp nào trên máy khách mà người dùng máy khách có quyền đọc
  • 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 đọc [giả sử rằng người dùng có thể chạy bất kỳ lệnh nào đối với máy chủ SQL]. Trong môi trường này, máy khách đối với máy chủ MySQL thực sự là máy chủ Web, không phải chương trình từ xa được chạy bởi người dùng kết nối với máy chủ Web

Nguyên tắc bảo mật lập trình máy khách

Các ứng dụng truy cập MySQL không nên tin cậy bất kỳ dữ liệu nào do người dùng nhập vào, những người này có thể cố đánh lừa mã của bạn bằng cách nhập các chuỗi ký tự đặc biệt hoặc ký tự thoát trong biểu mẫu Web, URL hoặc bất kỳ ứng dụng nào bạn đã tạo. Đảm bảo rằng ứng dụng của bạn vẫn an toàn nếu người dùng nhập nội dung nào đó như "; DROP DATABASE mysql;". Đây là một ví dụ cực đoan, nhưng rò rỉ bảo mật lớn và mất dữ liệu có thể xảy ra do tin tặc sử dụng các kỹ thuật tương tự nếu bạn không chuẩn bị cho chúng. Xem hướng dẫn sau

  • Bật chế độ SQL nghiêm ngặt để yêu cầu máy chủ hạn chế hơn về những giá trị dữ liệu mà nó chấp nhận
  • Cố gắng nhập dấu ngoặc đơn và dấu ngoặc kép [“'” và “"”] vào tất cả các biểu mẫu Web của bạn. Nếu bạn gặp bất kỳ loại lỗi MySQL nào, hãy điều tra vấn đề ngay lập tức
  • Cố gắng sửa đổi các URL động bằng cách thêm %22 [“"”], %23 [“#”] và %27 [“'”] vào chúng
  • Cố gắng sửa đổi các loại dữ liệu trong URL động từ loại số sang loại ký tự bằng cách sử dụng các ký tự được hiển thị trong các ví dụ trước. Ứng dụng của bạn phải an toàn trước những cuộc tấn công này và các cuộc tấn công tương tự
  • Cố gắng nhập ký tự, dấu cách và ký hiệu đặc biệt thay vì nhập số vào các trường số. Ứng dụng của bạn nên xóa chúng trước khi chuyển chúng tới MySQL nếu không sẽ tạo ra lỗi. Chuyển các giá trị không được kiểm tra cho MySQL là rất nguy hiểm
  • Kiểm tra kích thước của dữ liệu trước khi chuyển nó tới MySQL
  • Không cấp cho ứng dụng của bạn bất kỳ đặc quyền truy cập nào mà chúng không cần

Hệ thống đặc quyền truy cập MySQL

Đặc quyền được cung cấp bởi MySQL

MySQL cung cấp các đặc quyền áp dụng trong các ngữ cảnh khác nhau và ở các cấp độ hoạt động khác nhau

  • Đặc quyền quản trị cho phép người dùng quản lý hoạt động của máy chủ MySQL. Các đặc quyền này là toàn cầu vì chúng không dành riêng cho một cơ sở dữ liệu cụ thể
  • Đặc quyền cơ sở dữ liệu áp dụng cho cơ sở dữ liệu và cho tất cả các đối tượng trong đó. Các đặc quyền này có thể được cấp cho các cơ sở dữ liệu cụ thể hoặc trên toàn cầu để chúng áp dụng cho tất cả các cơ sở dữ liệu
  • Các đặc quyền cho các đối tượng cơ sở dữ liệu như bảng, chỉ mục, dạng xem và các thủ tục được lưu trữ có thể được cấp cho các đối tượng cụ thể trong cơ sở dữ liệu, cho tất cả các đối tượng thuộc một loại nhất định trong cơ sở dữ liệu [ví dụ: tất cả các bảng trong cơ sở dữ liệu] hoặc toàn cầu cho tất cả

Các đặc quyền được phép đối với GRANT và REVOKE

PrivilegeColumnContextCREATECreate_privdatabases, tables, or indexesDROPDrop_privdatabases, tables, or viewsGRANT OPTIONGrant_privdatabases, tables, or stored routinesLOCK TABLESLock_tables_privdatabasesREFERENCESReferences_privdatabases or tablesEVENTEvent_privdatabasesALTERAlter_privtablesDELETEDelete_privtablesINDEXIndex_privtablesINSERTInsert_privtables or columnsSELECTSelect_privtables or columnsUPDATEUpdate_privtables or columnsCREATE TEMPORARY TABLESCreate_tmp_table_privtablesTRIGGERTrigger_privtablesCREATE VIEWCreate_view_privviewsSHOW VIEWShow_view_privviewsALTER ROUTINEAlter_routine_privstored routinesCREATE ROUTINECreate_routine_privstored routinesEXECUTEExecute_privstored routinesFILEFile_privfile access on server hostCREATE TABLESPACECreate_tablespace_privserver administrationCREATE USERCreate_user_privserver administrationPROCESSProcess_privserver administrationPROXYsee proxies_priv tableserver administrationRELOADReload_privserver administrationREPLICATION CLIENTRepl_cli

Bảng cấp hệ thống đặc quyền

Thông thường, bạn thao tác gián tiếp với nội dung của các bảng cấp trong cơ sở dữ liệu mysql bằng cách sử dụng các câu lệnh như GRANT và REVOKE để thiết lập tài khoản và kiểm soát các đặc quyền có sẵn cho từng tài khoản.

Các bảng cơ sở dữ liệu mysql này chứa thông tin cấp

  • người dùng. Chứa tài khoản người dùng, đặc quyền toàn cầu và các cột không có đặc quyền khác
  • db. Chứa các đặc quyền cấp cơ sở dữ liệu
  • chủ nhà. lỗi thời. Các bản cài đặt MySQL mới không còn tạo bảng này kể từ MySQL 5. 6. 7
  • bảng_priv. Chứa các đặc quyền cấp bảng
  • cột_priv. Chứa các đặc quyền cấp cột
  • procs_priv. Chứa thủ tục được lưu trữ và đặc quyền chức năng
  • proxy_priv. Chứa các đặc quyền của người dùng proxy

Chỉ định tên tài khoản

Tên tài khoản MySQL bao gồm tên người dùng và tên máy chủ. Điều này cho phép tạo tài khoản cho người dùng có cùng tên có thể kết nối từ các máy chủ khác nhau. Phần này mô tả cách viết tên tài khoản, bao gồm các giá trị đặc biệt và quy tắc ký tự đại diện. Trong các câu lệnh SQL như TẠO NGƯỜI DÙNG, CẤP và ĐẶT MẬT KHẨU, hãy viết tên tài khoản theo các quy tắc sau

  • Cú pháp cho tên tài khoản là 'user_name'@'host_name'
  • Tên tài khoản chỉ bao gồm tên người dùng tương đương với 'user_name'@'%'. Ví dụ, 'me' tương đương với 'me'@'%'
  • Tên người dùng và tên máy chủ không cần được trích dẫn nếu chúng hợp pháp dưới dạng số nhận dạng không được trích dẫn. Dấu ngoặc kép là cần thiết để chỉ định chuỗi user_name chứa các ký tự đặc biệt [chẳng hạn như “-”] hoặc chuỗi host_name chứa các ký tự đặc biệt hoặc ký tự đại diện [chẳng hạn như “%”]; . com'
  • Trích dẫn tên người dùng và tên máy chủ dưới dạng định danh hoặc dưới dạng chuỗi, sử dụng dấu gạch ngược [“`”], dấu ngoặc kép [“'”] hoặc dấu ngoặc kép [“””]
  • Phần tên người dùng và tên máy chủ, nếu được trích dẫn, phải được trích dẫn riêng. Tức là viết 'tôi'@'localhost', không phải '[email được bảo vệ]';
  • Tham chiếu đến hàm CURRENT_USER hoặc CURRENT_USER[] tương đương với việc chỉ định tên người dùng và tên máy chủ của máy khách hiện tại theo nghĩa đen

Kiểm soát truy cập, Giai đoạn 1. Xác minh kết nối

Khi 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. Mặt khác, 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

  • Máy khách mà bạn kết nối từ đó
  • Tên người dùng MySQL của bạn

Kiểm soát truy cập, Giai đoạn 2. Xác minh kết nối

Sau khi bạn thiết lập kết nối, máy chủ sẽ chuyển sang Giai đoạn 2 của kiểm soát truy cập. Đối với mỗi yêu cầu mà bạn đưa ra thông qua kết nối đó, máy chủ sẽ xác định thao tác bạn muốn thực hiện, sau đó kiểm tra xem bạn có đủ đặc quyền để thực hiện hay không. Đây là nơi các cột đặ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, bảng_priv, cột_priv hoặc procs_priv nào

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 mặc định 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ỳ bảng nào trong bất kỳ cơ sở dữ liệu nào trên máy chủ lưu trữ. Sẽ là khôn ngoan khi chỉ cấp đặc quyền trong bảng người dùng cho những người cần chúng, chẳng hạn như quản trị viên cơ sở dữ liệu

Bảng db cấp các đặc quyền dành riêng cho cơ sở dữ liệu. Các giá trị trong các cột phạm vi của bảng này có thể có các dạng sau

  • Giá trị Người dùng trống khớp với người dùng ẩn danh. Một giá trị không trống phù hợp theo nghĩa đen;
  • Các ký tự đại diện “%” và “_” có thể được sử dụng trong cột Host và Db. Chúng có cùng ý nghĩa như đối với các thao tác so khớp mẫu được thực hiện với toán tử LIKE. Nếu bạn muốn sử dụng một trong hai ký tự theo nghĩa đen khi cấp đặc quyền, bạn phải thoát ký tự đó bằng dấu gạch chéo ngược. Ví dụ: để bao gồm ký tự gạch dưới [“_”] như một phần của tên cơ sở dữ liệu, hãy chỉ định ký tự đó là “\_” trong câu lệnh GRANT
  • Giá trị '%' hoặc máy chủ trống có nghĩa là "bất kỳ máy chủ nào. "
  • Giá trị '%' hoặc Db trống có nghĩa là "bất kỳ cơ sở dữ liệu nào. "

Khi các thay đổi về đặc quyền có hiệu lực

Khi mysqld bắt đầu, nó sẽ đọc tất cả nội dung của bảng cấp vào bộ nhớ. Các bảng trong bộ nhớ trở nên hiệu quả để kiểm soát truy cập vào thời điểm đó. Nếu bạn sửa đổi các bảng cấp một cách gián tiếp bằng cách sử dụng các câu lệnh quản lý tài khoản như GRANT, REVOKE, SET PASSWORD hoặc RENAME USER, thì máy chủ sẽ nhận thấy những thay đổi này và tải lại các bảng cấp vào bộ nhớ ngay lập tức

Nguyên nhân gây ra lỗi bị từ chối truy cập

Nếu bạn gặp sự cố khi cố gắng kết nối với máy chủ MySQL, các mục sau đây mô tả một số hành động bạn có thể thực hiện để khắc phục sự cố

  • Đảm bảo rằng máy chủ đang chạy. Nếu không, khách hàng không thể kết nối với nó
  • Có thể máy chủ đang chạy, nhưng bạn đang cố kết nối bằng cổng TCP/IP, đường ống có tên hoặc tệp ổ cắm Unix khác với cổng mà máy chủ đang lắng nghe. Để tìm ra vị trí của tệp ổ cắm, bạn có thể sử dụng lệnh này.
     shell> netstat -ln | grep mysql
  • Đảm bảo rằng máy chủ chưa được định cấu hình để bỏ qua các kết nối mạng hoặc [nếu bạn đang cố kết nối từ xa] rằng máy chủ chưa được định cấu hình để chỉ nghe cục bộ trên các giao diện mạng của nó
  • Kiểm tra để đảm bảo rằng không có tường lửa chặn quyền truy cập vào MySQL
  • Các bảng cấp phải được thiết lập đúng cách để máy chủ có thể sử dụng chúng để kiểm soát truy cập
  • Sau khi cài đặt mới, bạn nên kết nối với máy chủ và thiết lập người dùng của mình cũng như quyền truy cập của họ.
    shell> mysql -u root mysql 
  • Nếu bạn đã cập nhật cài đặt MySQL hiện có lên phiên bản mới hơn, hãy chạy tập lệnh mysql_upgrade
  • Nếu một chương trình máy khách nhận được thông báo lỗi "Máy khách không hỗ trợ giao thức xác thực do máy chủ yêu cầu; xem xét nâng cấp máy khách MySQL" thì điều đó có nghĩa là máy chủ mong đợi mật khẩu ở định dạng mới hơn so với định dạng mà máy khách có thể tạo ra
  • Nếu một chương trình máy khách dường như đang gửi các tham số kết nối mặc định không chính xác khi bạn chưa chỉ định chúng trên dòng lệnh, hãy kiểm tra mọi tệp tùy chọn hiện hành và môi trường của bạn
  • Nếu bạn nhận được thông báo lỗi "Quyền truy cập bị từ chối đối với người dùng 'root'@'localhost' [sử dụng mật khẩu. CÓ]", điều đó có nghĩa là bạn đang sử dụng mật khẩu gốc không chính xác
  • Nếu bạn thay đổi mật khẩu bằng cách sử dụng SET PASSWORD, INSERT hoặc UPDATE, bạn phải mã hóa mật khẩu bằng hàm PASSWORD[]. Nếu bạn không sử dụng PASSWORD[] cho những câu lệnh này, mật khẩu sẽ không hoạt động
  • localhost là từ đồng nghĩa với tên máy chủ cục bộ của bạn và cũng là máy chủ mặc định mà máy khách cố gắng kết nối nếu bạn chỉ định rõ ràng không có máy chủ nào
  • Thông báo lỗi Truy cập bị từ chối cho bạn biết bạn đang cố gắng đăng nhập với tư cách là ai, máy chủ lưu trữ máy khách mà bạn đang cố gắng kết nối và liệu bạn có đang sử dụng mật khẩu hay không
  • Nếu bạn gặp lỗi Truy cập bị từ chối khi cố gắng kết nối với cơ sở dữ liệu bằng mysql -u user_name, bạn có thể gặp sự cố với bảng người dùng
  • Nếu bạn nhận được thông báo lỗi "Máy chủ. không được phép kết nối với máy chủ MySQL này", khi bạn cố gắng kết nối từ một máy chủ khác với máy chủ MySQL đang chạy, điều đó có nghĩa là không có hàng nào trong bảng người dùng có giá trị Máy chủ phù hợp với máy khách
  • Nếu bạn chỉ định tên máy chủ khi cố gắng kết nối, nhưng nhận được thông báo lỗi trong đó tên máy chủ không được hiển thị hoặc là địa chỉ IP, điều đó có nghĩa là máy chủ MySQL đã gặp lỗi khi cố gắng phân giải địa chỉ IP của máy khách thành tên

Quản lý tài khoản người dùng MySQL

Tên người dùng và mật khẩu

MySQL lưu trữ các tài khoản trong bảng người dùng của cơ sở dữ liệu mysql. Tài khoản được xác định theo tên người dùng và máy khách hoặc máy chủ mà người dùng có thể kết nối với máy chủ từ đó. Tài khoản cũng có thể có mật khẩu

Thêm và xóa tài khoản người dùng

Bạn có thể tạo tài khoản MySQL theo hai cách

  • Bằng cách sử dụng các câu lệnh dành cho việc tạo tài khoản, chẳng hạn như TẠO NGƯỜI DÙNG hoặc CẤP. Các câu lệnh này khiến máy chủ thực hiện các sửa đổi thích hợp đối với các bảng cấp
  • Bằng cách thao tác trực tiếp với các bảng cấp phép của MySQL bằng các câu lệnh như INSERT, UPDATE hoặc DELETE

Để xóa tài khoản, hãy sử dụng câu lệnh DROP USER,

Đặt giới hạn tài nguyên tài khoản

Trong MySQL5. 6, bạn có thể giới hạn việc sử dụng các tài nguyên máy chủ sau cho từng tài khoản

  • Số lượng truy vấn mà tài khoản có thể đưa ra mỗi giờ
  • Số lượng cập nhật mà tài khoản có thể phát hành mỗi giờ
  • Số lần tài khoản có thể kết nối với máy chủ mỗi giờ
  • Số lượng kết nối đồng thời đến máy chủ của một tài khoản

Gán mật khẩu tài khoản

Thông tin đăng nhập cần thiết cho các máy khách kết nối với máy chủ MySQL có thể bao gồm mật khẩu. Trong MySQL5. 6, khách hàng cũng có thể xác thực bằng plugin

Để chỉ định mật khẩu khi bạn tạo tài khoản mới với CREATE USER, hãy bao gồm mệnh đề IDENTIFIED BY

________số 8

Để gán hoặc thay đổi mật khẩu cho một tài khoản hiện có, một cách là đưa ra câu lệnh SET PASSWORD

Làm cách nào để bảo mật cơ sở dữ liệu MySQL?

Các phương pháp hay nhất về bảo mật MySQL .
Xóa tài khoản mặc định, ánh xạ cổng và các cài đặt khác. .
Hạn chế truy cập từ xa. .
Chỉ cấp cho người dùng những đặc quyền họ cần. .
Sử dụng tài khoản không root. .
Giữ cho máy chủ an toàn về mặt vật lý. .
Hãy chắc chắn rằng bạn tiếp tục kiểm tra và giám sát thích hợp. .
Đánh giá bảo mật cơ sở dữ liệu của bạn thường xuyên

Cơ sở dữ liệu MySQL có thể được mã hóa không?

MySQL Enterprise TDE cho phép mã hóa dữ liệu lưu trữ bằng cách mã hóa các tệp vật lý của cơ sở dữ liệu . Dữ liệu được mã hóa tự động, theo thời gian thực, trước khi ghi vào bộ nhớ và được giải mã khi đọc từ bộ nhớ.

Làm cách nào để bảo mật một cổng trong MySQL?

Thay vào đó, hãy sử dụng giao thức được mã hóa như SSL hoặc SSH . MySQL hỗ trợ các kết nối SSL nội bộ. Một kỹ thuật khác là sử dụng tính năng chuyển tiếp cổng SSH để tạo đường hầm được mã hóa [và nén] cho giao tiếp. Điều này hoạt động trong Linux và sẽ hoạt động với các sửa đổi nhỏ trong các hệ thống khác.

Làm cách nào để kích hoạt bảo mật trong MySQL?

Sử dụng Trình cài đặt MySQL Bảo mật .
đặt mật khẩu cho tài khoản root
xóa tài khoản root có thể truy cập từ bên ngoài máy chủ lưu trữ cục bộ
xóa tài khoản người dùng ẩn danh
xóa cơ sở dữ liệu thử nghiệm, theo mặc định, người dùng ẩn danh có thể truy cập

Chủ Đề