Đặ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

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

Bấ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ể

  • Đừng bao giờ cấp cho bất kỳ ai (ngoại trừ người dùng root mysql) quyền truy cập vào bảng người dùng trong cơ sở dữ liệu mysql. Điều này rất quan trọng. Mật khẩu được mã hóa là mật khẩu thực trong MySQL. Bất kỳ ai biết mật khẩu được liệt kê trong bảng người dùng và có quyền truy cập vào máy chủ được liệt kê cho tài khoản đều có thể dễ dàng đăng nhập với tư cách người dùng đó

  • Tìm hiểu hệ thống đặc quyền truy cập MySQL. Các lệnh GRANT và REVOKE được sử dụng để kiểm soát quyền truy cập vào MySQL. Không cấp nhiều đặc quyền hơn mức cần thiết. Không bao giờ cấp đặc quyền cho tất cả các máy chủ

    Danh mục

    • Hãy thử root mysql -u. Nếu bạn có thể kết nối thành công với máy chủ mà không bị hỏi mật khẩu, bạn có vấn đề. Bất kỳ ai cũng có thể kết nối với máy chủ MySQL của bạn với tư cách là người dùng root MySQL với đầy đủ đặc quyền. Xem lại hướng dẫn cài đặt MySQL, đặc biệt chú ý đến mục đặt mật khẩu gốc

    • Sử dụng lệnh SHOW GRANTS và kiểm tra xem ai có quyền truy cập vào những gì. Xóa những đặc quyền không cần thiết bằng lệnh REVOKE

  • Không giữ bất kỳ mật khẩu văn bản thuần túy nào trong cơ sở dữ liệu của bạn. Khi máy tính của bạn bị xâm nhập, kẻ xâm nhập có thể lấy toàn bộ danh sách mật khẩu và sử dụng chúng. Thay vào đó, hãy sử dụng MD5( ) hoặc hàm băm một chiều khác

  • Không chọn mật khẩu từ từ điển. Có những chương trình đặc biệt để phá vỡ chúng. Ngay cả những mật khẩu như “xfish98” cũng rất tệ. Tốt hơn nhiều là “duag98” chứa cùng một từ “fish” nhưng gõ một phím sang trái trên bàn phím QWERTY tiêu chuẩn. Một phương pháp khác là sử dụng “Mhall” được lấy từ các ký tự đầu tiên của mỗi từ trong câu “Mary had a little lamb. ” Cái này dễ nhớ dễ gõ nhưng khó đoán với người không biết

  • Đầu tư vào tường lửa. Điều này bảo vệ bạn khỏi ít nhất 50% tất cả các loại khai thác trong bất kỳ phần mềm nào. Đặt MySQL phía sau tường lửa hoặc trong khu phi quân sự (DMZ)

    Danh mục

    • Cố gắng quét các cổng của bạn từ Internet bằng một công cụ như nmap. MySQL sử dụng cổng 3306 theo mặc định. Cổng này sẽ không thể truy cập được từ các máy chủ không đáng tin cậy. Một cách đơn giản khác để kiểm tra xem cổng MySQL của bạn có mở hay không là thử lệnh sau từ một số máy từ xa, trong đó server_host là tên máy chủ của máy chủ MySQL của bạn

      shell> telnet server_host 3306

      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. Nếu telnet chỉ bị treo hoặc kết nối bị từ chối, mọi thứ đều ổn;

  • Không tin tưởng bất kỳ dữ liệu nào được nhập bởi người dùng của bạn. Họ 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

    Cũng nhớ kiểm tra dữ liệu số. Một sai lầm phổ biến là chỉ bảo vệ các chuỗi. Đôi khi mọi người nghĩ rằng nếu cơ sở dữ liệu chỉ chứa dữ liệu có sẵn công khai thì nó không cần được bảo vệ. Điều này là không đúng. Ít nhất các cuộc tấn công kiểu từ chối dịch vụ có thể được thực hiện trên các cơ sở dữ liệu như vậy. Cách đơn giản nhất để bảo vệ khỏi kiểu tấn công này là sử dụng dấu nháy đơn xung quanh các hằng số. CHỌN * TỪ bảng WHERE ID='234' thay vì CHỌN * TỪ bảng WHERE ID=234. MySQL tự động chuyển đổi chuỗi này thành một số và loại bỏ tất cả các ký hiệu không phải là số khỏi nó

    Danh mục

    • Tất cả các ứng dụng web

      • Cố gắng nhậ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 bất kỳ URL động nào bằng cách thêm %22 (“), %23 (

        shell> mysql -u root mysql
        mysql> UPDATE user SET Password=PASSWORD('new_password')
            ->             WHERE user='root';
        mysql> FLUSH PRIVILEGES;
        7) và %27 (') vào URL

      • Cố gắng sửa đổi các kiểu dữ liệu trong URL động từ kiểu số sang kiểu ký tự có chứa các ký tự từ các ví dụ trước. Ứng dụng của bạn phải an toàn trước 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 các 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 hoặc ứng dụng của bạn sẽ phát sinh 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 dữ liệu trước khi chuyển chúng đến MySQL

      • Cân nhắc để ứng dụng của bạn kết nối với cơ sở dữ liệu bằng tên người dùng khác với tên người dùng bạn sử dụng cho mục đích quản trị. Không cung cấp cho các ứng dụng của bạn bất kỳ đặc quyền truy cập nào nhiều hơn mức chúng cần

    • Người dùng PHP

      • Kiểm tra chức năng addlashes(). Kể từ PHP 4. 0. 3, có sẵn hàm mysql_escape_string( ) dựa trên hàm cùng tên trong MySQL C API

    • Người dùng MySQL C API

      • Kiểm tra lệnh gọi API mysql_real_escape_string( )

    • Người dùng MySQL++

      • Kiểm tra công cụ sửa đổi thoát và trích dẫn cho các luồng truy vấn

    • Người dùng Perl DBI

      • Kiểm tra phương thức quote() hoặc sử dụng trình giữ chỗ

    • Người dùng Java JDBC

      • Sử dụng một đối tượng PreparedStatement và trình giữ chỗ

  • Không truyền dữ liệu đơn giản (không được mã hóa) qua Internet. Dữ liệu đó có thể truy cập được đối với tất cả những người có thời gian và khả năng chặn nó và sử dụng nó cho mục đích riêng của họ. Thay vào đó, hãy sử dụng một 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ộ kể từ Phiên bản 4. 0. 0. Chuyển tiếp cổng SSH có thể được sử dụng để tạo đường hầm được mã hóa (và nén) cho giao tiếp

  • Tìm hiểu cách sử dụng tiện ích tcpdump và chuỗi. Đối với hầu hết các trường hợp, bạn có thể kiểm tra xem các luồng dữ liệu MySQL có được mã hóa hay không bằng cách đưa ra một lệnh như sau

    shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings

    (Đ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. ) Cảnh báo. Nếu bạn không thấy dữ liệu, điều này không phải lúc nào cũng có nghĩa là dữ liệu được mã hóa. Nếu cần bảo mật cao, bạn nên tham khảo ý kiến ​​của chuyên gia bảo mật

Cách làm cho MySQL an toàn trước crackers

Khi 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

  • Sử dụng mật khẩu cho tất cả người dùng MySQL. Hãy nhớ rằng bất kỳ ai cũng có thể đăng nhập với tư cách bất kỳ người nào khác đơn giản như mysql -u other_user db_name nếu other_user không có mật khẩu. Hành vi phổ biến với các ứng dụng máy khách/máy chủ là máy khách có thể chỉ định bất kỳ tên người dùng nào. Bạn có thể thay đổi mật khẩu của tất cả người dùng bằng cách chỉnh sửa tập lệnh mysql_install_db trước khi chạy nó hoặc chỉ mật khẩu cho người dùng root MySQL như thế này

    shell> mysql -u root mysql
    mysql> UPDATE user SET Password=PASSWORD('new_password')
        ->             WHERE user='root';
    mysql> FLUSH PRIVILEGES;
  • Không chạy daemon MySQL với tư cách là người dùng gốc Unix. Điều này rất nguy hiểm vì bất kỳ người dùng nào có đặc quyền tệp sẽ có thể tạo tệp với quyền root (ví dụ: ~root/. bashrc). Để ngăn chặn điều này, mysqld sẽ từ chối chạy với quyền root trừ khi nó được chỉ định trực tiếp bằng tùy chọn --user=root

    Thay vào đó, mysqld có thể được chạy như một người dùng bình thường không có đặc quyền. Bạn cũng có thể tạo một mysql người dùng Unix mới để làm cho mọi thứ trở nên an toàn hơn. Nếu bạn chạy mysqld với tư cách là một người dùng Unix khác, bạn không cần thay đổi tên người dùng gốc trong bảng người dùng, vì tên người dùng MySQL không liên quan gì đến tên người dùng Unix. Để bắt đầu mysqld với tư cách là một người dùng Unix khác, hãy thêm một dòng người dùng chỉ định tên người dùng vào nhóm [mysqld] của tệp tùy chọn

    shell> mysql -u root mysql
    mysql> UPDATE user SET Password=PASSWORD('new_password')
        ->             WHERE user='root';
    mysql> FLUSH PRIVILEGES;
    8 hoặc tệp tùy chọn
    shell> mysql -u root mysql
    mysql> UPDATE user SET Password=PASSWORD('new_password')
        ->             WHERE user='root';
    mysql> FLUSH PRIVILEGES;
    9 trong thư mục dữ liệu của máy chủ. Ví dụ

    [mysqld]
    user=mysql

    Điều này sẽ khiến máy chủ khởi động với tư cách là người dùng được chỉ định cho dù bạn khởi động thủ công hay bằng cách sử dụng safe_mysqld hoặc mysql. người phục vụ. Để biết thêm chi tiết, xem

  • Không hỗ trợ liên kết tượng trưng tới bảng (điều này có thể bị vô hiệu hóa với tùy chọn --skip-symlink). Điều này đặc biệt quan trọng nếu bạn chạy mysqld với quyền root, vì bất kỳ ai có quyền ghi vào thư mục dữ liệu mysqld đều có thể xóa bất kỳ tệp nào trong hệ thống. Thấy

  • Kiểm tra xem người dùng Unix mà mysqld chạy có phải là người dùng duy nhất có đặc quyền đọc/ghi trong thư mục cơ sở dữ liệu không

  • Không trao đặc quyền quy trình cho tất cả người dùng. Đầu ra của danh sách quy trình mysqladmin hiển thị văn bản của các truy vấn hiện đang thực thi, do đó, bất kỳ người dùng nào được phép thực thi lệnh đó đều có thể xem liệu người dùng khác có đưa ra truy vấn CẬP NHẬT người dùng SET password=PASSWORD('not_secure') hay không

    mysqld dự trữ một kết nối bổ sung cho người dùng có đặc quyền xử lý để người dùng root MySQL có thể đăng nhập và kiểm tra mọi thứ ngay cả khi tất cả các kết nối thông thường đang được sử dụng

  • Không cấp đặc quyền tệp cho tất cả người dùng. Bất kỳ người dùng nào có đặc quyền này đều có thể ghi tệp ở bất kỳ đâu trong hệ thống tệp với các đặc quyền của daemon mysqld. Để làm cho điều này an toàn hơn một chút, tất cả các tệp được tạo bằng CHỌN. INTO OUTFILE có thể đọc được cho mọi người và bạn không thể ghi đè lên các tệp hiện có

    Đặc quyền tệp cũng có thể được sử dụng để đọc bất kỳ tệp nào mà người dùng Unix có thể truy cập mà máy chủ chạy dưới dạng. Ví dụ, điều này có thể bị lạm dụng bằng cách sử dụng LOAD DATA để tải

    [mysqld]
    user=mysql
    0 vào một bảng, sau đó có thể đọc bảng này bằng SELECT

  • Nếu bạn không tin tưởng DNS của mình, bạn nên sử dụng số IP thay vì tên máy chủ trong bảng cấp. Trong mọi trường hợp, bạn nên hết sức cẩn thận khi tạo các mục trong bảng cấp bằng cách sử dụng các giá trị tên máy chủ có chứa các ký tự đại diện

  • Nếu bạn muốn hạn chế số lượng kết nối cho một người dùng, bạn có thể thực hiện việc này bằng cách đặt biến max_user_connections trong mysqld

Tùy chọn khởi động cho mysqld liên quan đến bảo mật

Cá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ệu

Vớ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ạo

Nế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ảng

Tù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ết

Tê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ạng

Khô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ệu

Vớ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 LOCAL

Trong 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ào

Hệ 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

  • Giai đoạn 1. Máy chủ kiểm tra xem bạn có được phép kết nối không

  • giai đoạn 2. Giả sử bạn có thể kết nối, máy chủ sẽ kiểm tra từng yêu cầu bạn đưa ra để xem liệu bạn có đủ đặc quyền để thực hiện yêu cầu đó hay không. Ví dụ: nếu bạn cố gắng chọn các hàng từ một bảng trong cơ sở dữ liệu hoặc xóa một bảng khỏi cơ sở dữ liệu, thì máy chủ sẽ đảm bảo rằng bạn có đặc quyền chọn đối với bảng hoặc đặc quyền loại bỏ đối với cơ sở dữ liệu

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

  • Các trường phạm vi bảng người dùng xác định xem có cho phép hoặc từ chối các kết nối đến hay không. Đối với các kết nối được phép, mọi đặc quyền được cấp trong bảng người dùng cho biết đặc quyền toàn cầu (siêu người dùng) của người dùng. Các đặc quyền này áp dụng cho tất cả các cơ sở dữ liệu trên máy chủ

  • Các bảng db và máy chủ được sử dụng cùng nhau

    • Các trường phạm vi bảng db xác định người dùng nào có thể truy cập cơ sở dữ liệu nào từ máy chủ nào. Các trường đặc quyền xác định hoạt động nào được phép

    • Bảng máy chủ được sử dụng như một phần mở rộng của bảng db khi bạn muốn một mục nhập bảng db nhất định áp dụng cho một số máy chủ. Ví dụ: nếu bạn muốn người dùng có thể sử dụng cơ sở dữ liệu từ một số máy chủ trong mạng của mình, hãy để trống giá trị Máy chủ trong mục nhập bảng db của người dùng, sau đó điền vào bảng máy chủ một mục nhập cho từng máy chủ đó. Cơ chế này được mô tả chi tiết hơn trong

  • Các bảng table_priv và column_priv tương tự như bảng db, nhưng chi tiết hơn. chúng áp dụng ở cấp độ bảng và cột thay vì ở cấp độ cơ sở dữ liệu

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 MySQL

Thô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 quyền cấp cho phép người dùng tặng đặc quyền của họ cho người dùng khác. Hai người dùng có các đặc quyền khác nhau và có đặc quyền cấp có thể kết hợp các đặc quyền

  • Đặc quyền thay đổi có thể được sử dụng để lật đổ hệ thống đặc quyền bằng cách đổi tên các bảng

  • Đặc quyền tệp có thể bị lạm dụng để đọc bất kỳ tệp nào có thể đọc được trên thế giới trên máy chủ vào bảng cơ sở dữ liệu, sau đó có thể truy cập nội dung của tệp đó bằng cách sử dụng CHỌN. Điều này bao gồm nội dung của tất cả các cơ sở dữ liệu được lưu trữ bởi máy chủ

  • Đặc quyền tắt máy có thể bị lạm dụng để từ chối hoàn toàn dịch vụ cho những người dùng khác, bằng cách chấm dứt máy chủ

  • Đặc quyền quy trình có thể được sử dụng để xem văn bản thuần túy của các truy vấn hiện đang thực hiện, bao gồm các truy vấn đặt hoặc thay đổi mật khẩu

  • Đặc quyền trên cơ sở dữ liệu mysql có thể được sử dụng để thay đổi mật khẩu và thông tin đặc quyền truy cập khác. (Mật khẩu được lưu trữ mã hóa, vì vậy người dùng độc hại không thể chỉ cần đọc chúng để biết mật khẩu văn bản thuần túy. ) Nếu họ có thể truy cập mysql. cột mật khẩu người dùng, họ có thể sử dụng nó để đăng nhập vào máy chủ MySQL cho người dùng nhất định. (Với đủ đặc quyền, cùng một người dùng có thể thay thế mật khẩu bằng một mật khẩu khác. )

Có một số điều bạn không thể làm với hệ thống đặc quyền của MySQL

  • Bạn không thể chỉ định rõ ràng rằng một người dùng nhất định sẽ bị từ chối truy cập. Nghĩa là, bạn không thể so khớp người dùng một cách rõ ràng và sau đó từ chối kết nối

  • Bạn không thể chỉ định rằng người dùng có đặc quyền tạo hoặc xóa bảng trong cơ sở dữ liệu nhưng không được tạo hoặc xóa chính cơ sở dữ liệu đó

Kết nối với máy chủ MySQL

Cá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=mysql
1 và
[mysqld]
user=mysql
2)

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

  • Tên máy chủ mặc định là localhost

  • Tên người dùng mặc định là tên đăng nhập Unix của bạn

  • Không có mật khẩu nào được cung cấp nếu -p bị thiếu

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

  • Bạn có thể chỉ định các tham số kết nối trong phần [máy khách] của tệp cấu hình

    [mysqld]
    user=mysql
    3 trong thư mục chính của bạn. Phần có liên quan của tệp có thể trông như thế này

    [client]
    host=host_name
    user=user_name
    password=your_pass

    Thấy

  • Bạn có thể chỉ định các tham số kết nối bằng các biến môi trường. Máy chủ có thể được chỉ định cho mysql bằng MYSQL_HOST. Tên người dùng MySQL có thể được chỉ định bằng USER (cái này chỉ dành cho Windows). Mật khẩu có thể được chỉ định bằng MYSQL_PWD (nhưng điều này không an toàn; xem phần tiếp theo). Xem Phụ lục E

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

  • Máy chủ mà bạn kết nối từ đó

  • Tên người dùng MySQL của bạn

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áy chủ lưu trữ có thể là tên máy chủ hoặc số IP hoặc 'localhost' để biểu thị máy chủ lưu trữ cục bộ

  • Bạn có thể sử dụng các ký tự đại diện

    [mysqld]
    user=mysql
    4 và
    [mysqld]
    user=mysql
    5 trong trường Máy chủ

  • Giá trị Máy chủ '%' khớp với bất kỳ tên máy chủ nào

  • Giá trị Máy chủ lưu trữ trống có nghĩa là đặc quyền phải được thêm vào với mục nhập trong bảng máy chủ phù hợp với tên máy chủ đã cho. Bạn có thể tìm thêm thông tin về điều này trong chương tiếp theo

  • Kể từ phiên bản MySQL 3. 23, đối với các giá trị Máy chủ được chỉ định là số IP, bạn có thể chỉ định mặt nạ mạng cho biết số bit địa chỉ sẽ sử dụng cho số mạng. Ví dụ

    shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings
    0

    Điều này sẽ cho phép mọi người kết nối từ một IP trong đó điều sau là đúng

    shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings
    1

    Trong ví dụ trước, tất cả IP. s trong khoảng thời gian 192. 58. 197. 0 - 192. 58. 197. 255 có thể kết nối với máy chủ MySQL

  • Các ký tự đại diện không được phép trong trường Người dùng nhưng bạn có thể chỉ định một giá trị trống khớp với bất kỳ tên nào. Nếu mục nhập bảng người dùng khớp với kết nối đến có tên người dùng trống, người dùng được coi là người dùng ẩn danh (người dùng không có tên), thay vì tên mà khách hàng thực sự chỉ định. Điều này có nghĩa là tên người dùng trống được sử dụng cho tất cả các lần truy cập tiếp theo để kiểm tra thời lượng của kết nối (nghĩa là trong Giai đoạn 2)

  • Trường Mật khẩu có thể để trống. Điều này không có nghĩa là bất kỳ mật khẩu nào cũng khớp. Nó có nghĩa là người dùng phải kết nối mà không chỉ định mật khẩu

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 | strings
2

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 | strings
3

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 | strings
4

Bảng được sắp xếp trông như thế này

shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings
5

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 minh

Sau 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 ký tự đại diện

    [mysqld]
    user=mysql
    4 và
    [mysqld]
    user=mysql
    5 có thể được sử dụng trong các trường Máy chủ và Db của một trong hai bảng

  • Giá trị máy chủ '%' trong bảng db có nghĩa là “bất kỳ máy chủ nào. ” Giá trị Máy chủ trống trong bảng db có nghĩa là “tham khảo bảng máy chủ để biết thêm thông tin. ”

  • '%' hoặc giá trị Máy chủ trống trong bảng máy chủ có nghĩa là “bất kỳ máy chủ nào. ”

  • Giá trị '%' hoặc Db trống trong một trong hai bảng có nghĩa là “bất kỳ cơ sở dữ liệu nào. ”

  • Giá trị Người dùng trống trong một trong hai bảng khớp với người dùng ẩn danh

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 ký tự đại diện

    [mysqld]
    user=mysql
    4 và
    [mysqld]
    user=mysql
    5 có thể được sử dụng trong trường Máy chủ của một trong hai bảng

  • '%' hoặc giá trị Máy chủ trống trong một trong hai bảng có nghĩa là “bất kỳ máy chủ nào. ”

  • Các trường Db, Table_name và Column_name không được chứa ký tự đại diện hoặc để trống trong một trong hai bảng

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ủ

  1. Máy chủ tìm trong bảng db để tìm sự trùng khớp trên các trường Máy chủ, Db và Người dùng. Các trường Máy chủ và Người dùng được khớp với tên máy chủ và tên người dùng MySQL của người dùng kết nối. Trường Db khớp với cơ sở dữ liệu mà người dùng muốn truy cập. Nếu không có mục nào cho Máy chủ và Người dùng, quyền truy cập sẽ bị từ chối

  2. Nếu có một mục trong bảng db phù hợp và trường Máy chủ của nó không trống, thì mục đó 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

  3. Nếu trường Máy chủ của mục nhập bảng db phù hợp trống, điều đó có nghĩa là bảng máy chủ liệt kê những máy chủ nào sẽ được phép truy cập vào cơ sở dữ liệu. Trong trường hợp này, một tra cứu sâu hơn được thực hiện trong bảng máy chủ để tìm kết quả khớp trên các trường Máy chủ và Db. Nếu không có mục nào trong bảng máy chủ phù hợp, quyền truy cập bị từ chối. Nếu có sự trùng khớp, các đặc quyền dành riêng cho cơ sở dữ liệu của người dùng được tính là giao điểm (không phải giao điểm. ) của các đặc quyền trong các mục trong bảng db và máy chủ—nghĩa là các đặc quyền là 'Y' trong cả hai mục. (Bằng cách này, bạn có thể cấp các đặc quyền chung trong mục nhập bảng db và sau đó hạn chế có chọn lọc chúng trên cơ sở từng máy chủ bằng cách sử dụng các mục nhập bảng 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 | strings
6

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 | strings
7

Đươ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ối

Nế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ố

  • After installing MySQL, did you run the mysql_install_db script to set up the initial grant table contents? If not, do so. Thấy. Kiểm tra các đặc quyền ban đầu bằng cách thực hiện lệnh này

    shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings
    8

    Máy chủ sẽ cho phép bạn kết nối mà không gặp lỗi. Bạn cũng nên đảm bảo rằng bạn có một tệp

    mysql> GRANT INSERT(user) ON mysql.user TO 'user'@'hostname';
    0 trong thư mục cơ sở dữ liệu MySQL. Ordinarily, this is
    mysql> GRANT INSERT(user) ON mysql.user TO 'user'@'hostname';
    1, where PATH is the pathname to the MySQL installation root

  • 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> tcpdump -l -i eth0 -w - src or dst port 3306 | strings
    9

    Máy chủ sẽ cho phép bạn kết nối vì người dùng root MySQL không có mật khẩu ban đầu. Đó cũng là một rủi ro bảo mật, vì vậy, đặt mật khẩu gốc là điều bạn nên làm trong khi thiết lập những người dùng MySQL khác của mình

    Nếu bạn cố gắng kết nối với quyền root và gặp lỗi này

    shell> mysql -u root mysql
    mysql> UPDATE user SET Password=PASSWORD('new_password')
        ->             WHERE user='root';
    mysql> FLUSH PRIVILEGES;
    0

    điều này có nghĩa là bạn không có mục nhập nào trong bảng người dùng với giá trị cột Người dùng là 'root' và mysqld không thể phân giải tên máy chủ cho ứng dụng khách của bạn. In this case, you must restart the server with the --skip-grant-tables option and edit your

    mysql> GRANT INSERT(user) ON mysql.user TO 'user'@'hostname';
    2 or
    mysql> GRANT INSERT(user) ON mysql.user TO 'user'@'hostname';
    3 file to add an entry for your host

  • Nếu bạn gặp lỗi như sau

    shell> mysql -u root mysql
    mysql> UPDATE user SET Password=PASSWORD('new_password')
        ->             WHERE user='root';
    mysql> FLUSH PRIVILEGES;
    1

    nó có nghĩa là bạn đang sử dụng một mật khẩu sai. Thấy

    Nếu bạn quên mật khẩu root, bạn có thể khởi động lại mysqld bằng --skip-grant-tables để thay đổi mật khẩu. Bạn có thể tìm hiểu thêm về tùy chọn này sau trong phần này

    Nếu bạn gặp lỗi trước đó ngay cả khi bạn chưa chỉ định mật khẩu, thì bạn đã nhập sai mật khẩu trong một số ứng dụng của tôi. tập tin ini. Thấy. Bạn có thể tránh sử dụng các tệp tùy chọn với tùy chọn --no-defaults, như sau

    shell> mysql -u root mysql
    mysql> UPDATE user SET Password=PASSWORD('new_password')
        ->             WHERE user='root';
    mysql> FLUSH PRIVILEGES;
    2
  • Nếu bạn đã cập nhật cài đặt MySQL hiện có từ phiên bản cũ hơn Phiên bản 3. 22. 11 đến Phiên bản 3. 22. 11 trở lên, bạn đã chạy tập lệnh mysql_fix_privilege_tables chưa? . Cấu trúc của các bảng cấp đã thay đổi với MySQL Phiên bản 3. 22. 11 khi câu lệnh GRANT có chức năng

  • Nếu các đặc quyền của bạn dường như đã thay đổi vào giữa phiên, thì có thể một siêu người dùng đã thay đổi chúng. Việc tải lại các bảng cấp sẽ ảnh hưởng đến các kết nối máy khách mới, nhưng nó cũng ảnh hưởng đến các kết nối hiện có như được chỉ ra trong

  • Nếu bạn không thể làm cho mật khẩu của mình hoạt động, hãy nhớ rằng bạn phải sử dụng hàm PASSWORD( ) nếu bạn đặt mật khẩu bằng các câu lệnh INSERT, UPDATE hoặc SET PASSWORD. Hàm PASSWORD( ) không cần thiết nếu bạn chỉ định mật khẩu bằng GRANT. INDENTIFIED BY statement or the mysqladmin password command. Thấy

  • 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. Tuy nhiên, kết nối tới máy chủ cục bộ không hoạt động nếu bạn đang chạy trên hệ thống sử dụng MIT-pthread (kết nối máy chủ cục bộ được tạo bằng cách sử dụng ổ cắm Unix, không được hỗ trợ bởi MIT-pthreads). Để tránh sự cố này trên các hệ thống như vậy, bạn nên sử dụng tùy chọn --host để đặt tên rõ ràng cho máy chủ lưu trữ. Điều này sẽ tạo kết nối TCP/IP với máy chủ mysqld. Trong trường hợp này, bạn phải có tên máy chủ thực của mình trong các mục trong bảng người dùng trên máy chủ lưu trữ. (Điều này đúng ngay cả khi bạn đang chạy chương trình máy khách trên cùng máy chủ với máy chủ. )

  • 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 db_name, bạn có thể gặp sự cố với bảng người dùng. Kiểm tra điều này bằng cách thực thi mysql -u root mysql và đưa ra câu lệnh SQL này

    shell> mysql -u root mysql
    mysql> UPDATE user SET Password=PASSWORD('new_password')
        ->             WHERE user='root';
    mysql> FLUSH PRIVILEGES;
    3

    Kết quả phải bao gồm một mục có cột Máy chủ và Người dùng khớp với tên máy chủ của máy tính và tên người dùng MySQL của bạn

  • Thông báo lỗi Truy cập bị từ chối sẽ cho bạn biết bạn đang cố đăng nhập với tư cách ai, máy chủ mà bạn đang cố kết nối và liệu bạn có đang sử dụng mật khẩu hay không. Thông thường, bạn nên có một mục nhập trong bảng người dùng khớp chính xác với tên máy chủ và tên người dùng được cung cấp trong thông báo lỗi. Ví dụ: nếu bạn nhận được thông báo lỗi có nội dung Sử dụng mật khẩu. KHÔNG, điều này có nghĩa là bạn đã cố đăng nhập mà không cần mật khẩu

  • Nếu bạn gặp lỗi sau khi kết nối từ một máy chủ khác với máy chủ MySQL đang chạy, thì không có hàng nào trong bảng người dùng khớp với máy chủ đó

    shell> mysql -u root mysql
    mysql> UPDATE user SET Password=PASSWORD('new_password')
        ->             WHERE user='root';
    mysql> FLUSH PRIVILEGES;
    4

    Bạn có thể khắc phục điều này bằng cách sử dụng công cụ dòng lệnh mysql (trên máy chủ lưu trữ. ) để thêm một hàng vào bảng người dùng, db hoặc máy chủ cho tổ hợp người dùng/tên máy chủ mà bạn đang cố gắng kết nối và sau đó thực thi các đặc quyền tuôn ra của mysqladmin. Nếu bạn không chạy MySQL Phiên bản 3. 22 và bạn không biết số IP hoặc tên máy chủ của máy mà bạn đang kết nối, bạn nên đặt một mục có '%' làm giá trị cột Máy chủ trong bảng người dùng và khởi động lại mysqld bằng tùy chọn --log trên . Sau khi thử kết nối từ máy khách, thông tin trong nhật ký MySQL sẽ cho biết bạn đã thực sự kết nối như thế nào. (Sau đó thay thế '%' trong mục nhập bảng người dùng bằng tên máy chủ thực tế hiển thị trong nhật ký. Nếu không, bạn sẽ có một hệ thống không an toàn. )

    Một lý do khác cho lỗi này trên Linux là bạn đang sử dụng phiên bản MySQL nhị phân được biên dịch bằng phiên bản glibc khác với phiên bản bạn đang sử dụng. Trong trường hợp này, bạn nên nâng cấp hệ điều hành/glibc của mình hoặc tải xuống phiên bản MySQL nguồn và tự biên dịch phiên bản này. RPM nguồn thường không đáng kể để biên dịch và cài đặt, vì vậy đây không phải là vấn đề lớn

  • Nếu bạn nhận được thông báo lỗi không hiển thị tên máy chủ hoặc tên máy chủ là một IP, ngay cả khi bạn cố gắng kết nối với tên máy chủ

    shell> mysql -u root mysql
    mysql> UPDATE user SET Password=PASSWORD('new_password')
        ->             WHERE user='root';
    mysql> FLUSH PRIVILEGES;
    5

    điều này có nghĩa là MySQL đã gặp một số lỗi khi cố gắng phân giải IP thành tên máy chủ. Trong trường hợp này, bạn có thể thực thi mysqladmin flush-hosts để đặt lại bộ đệm DNS bên trong. Thấy

    Một số giải pháp lâu dài là

    • Cố gắng tìm ra vấn đề với máy chủ DNS của bạn và khắc phục điều này

    • Chỉ định IP thay vì tên máy chủ trong bảng đặc quyền của MySQL

    • Bắt đầu mysqld với --skip-name-resolve

    • Bắt đầu mysqld với --skip-host-cache

    • Kết nối với máy chủ cục bộ nếu bạn đang chạy máy chủ và máy khách trên cùng một máy

    • Đặt tên máy khách vào /etc/hosts

  • Nếu kiểm tra gốc mysql -u hoạt động nhưng kết quả kiểm tra gốc mysql -h your_hostname -u trong Access bị từ chối, bạn có thể không có tên chính xác cho máy chủ của mình trong bảng người dùng. Một vấn đề phổ biến ở đây là giá trị Máy chủ lưu trữ trong mục nhập bảng người dùng chỉ định một tên máy chủ không đủ tiêu chuẩn, nhưng các quy trình phân giải tên của hệ thống của bạn lại trả về một tên miền đủ điều kiện (hoặc ngược lại). Ví dụ: nếu bạn có một mục nhập với máy chủ 'tcx' trong bảng người dùng, nhưng DNS của bạn cho MySQL biết rằng tên máy chủ của bạn là 'tcx. mạng con. se', mục nhập sẽ không hoạt động. Hãy thử thêm một mục vào bảng người dùng chứa số IP của máy chủ của bạn làm giá trị cột Máy chủ. (Ngoài ra, bạn có thể thêm một mục nhập vào bảng người dùng với giá trị Máy chủ chứa ký tự đại diện---ví dụ: 'tcx. %'. Tuy nhiên, việc sử dụng tên máy chủ kết thúc bằng

    [mysqld]
    user=mysql
    4 là không an toàn và không được khuyến nghị. )

  • Nếu kiểm tra mysql -u user_name hoạt động nhưng mysql -u user_name other_db_name không hoạt động, bạn không có mục nhập cho other_db_name được liệt kê trong bảng db

  • Nếu mysql -u user_name db_name hoạt động khi được thực thi trên máy chủ, nhưng mysql -u host_name -u user_name db_name không hoạt động khi được thực thi trên máy khách khác, thì bạn không có máy khách được liệt kê trong bảng người dùng hoặc db

  • Nếu bạn không thể hiểu tại sao bạn bị Từ chối truy cập, hãy xóa khỏi bảng người dùng tất cả các mục nhập có giá trị Máy chủ chứa ký tự đại diện (các mục nhập chứa

    [mysqld]
    user=mysql
    4 hoặc
    [mysqld]
    user=mysql
    5). Một lỗi rất phổ biến là chèn một mục nhập mới với Host='%' và User='some user', nghĩ rằng điều này sẽ cho phép bạn chỉ định localhost để kết nối từ cùng một máy. Lý do điều này không hoạt động là vì các đặc quyền mặc định bao gồm một mục có Host='localhost' và User=". Bởi vì mục nhập đó có giá trị Máy chủ lưu trữ 'localhost' cụ thể hơn '%', nên giá trị này được ưu tiên sử dụng cho mục nhập mới khi kết nối từ localhost. Quy trình đúng là chèn mục nhập thứ hai với Host='localhost' và User='some_user' hoặc xóa mục nhập với Host='localhost' và User="

  • Nếu bạn gặp lỗi sau, bạn có thể gặp sự cố với bảng db hoặc máy chủ

    shell> mysql -u root mysql
    mysql> UPDATE user SET Password=PASSWORD('new_password')
        ->             WHERE user='root';
    mysql> FLUSH PRIVILEGES;
    6

    Nếu mục được chọn từ bảng db có giá trị trống trong cột Máy chủ, hãy đảm bảo có một hoặc nhiều mục tương ứng trong bảng máy chủ chỉ định máy chủ mà mục nhập bảng db áp dụng cho

    Nếu bạn gặp lỗi khi sử dụng các lệnh SQL CHỌN. INTO OUTFILE hoặc LOAD DATA INFILE, mục nhập của bạn trong bảng người dùng có thể không được bật đặc quyền tệp

  • Hãy nhớ rằng các chương trình máy khách sẽ sử dụng các tham số kết nối được chỉ định trong tệp cấu hình hoặc biến môi trường. Xem Phụ lục E. Nếu một máy khách dường như đang gửi sai tham số kết nối mặc định khi bạn không chỉ định chúng trên dòng lệnh, hãy kiểm tra môi trường của bạn và tệp

    [mysqld]
    user=mysql
    3 trong thư mục chính của bạn. Bạn cũng có thể kiểm tra các tệp cấu hình MySQL trên toàn hệ thống, mặc dù ít có khả năng các tham số kết nối máy khách sẽ được chỉ định ở đó. Thấy. Nếu bạn bị Từ chối truy cập khi chạy ứng dụng khách mà không có bất kỳ tùy chọn nào, hãy đảm bảo rằng bạn chưa chỉ định mật khẩu cũ trong bất kỳ tệp tùy chọn nào của mình. Thấy

  • Nếu bạn trực tiếp thực hiện các thay đổi đối với các bảng cấp (sử dụng câu lệnh INSERT hoặc UPDATE) và các thay đổi của bạn dường như bị bỏ qua, hãy nhớ rằng bạn phải đưa ra câu lệnh FLUSH PRIVILEGES hoặc thực thi lệnh flush-privileges mysqladmin để khiến máy chủ đọc lại . Nếu không, các thay đổi của bạn sẽ không có hiệu lực cho đến lần khởi động lại máy chủ tiếp theo. Hãy nhớ rằng sau khi bạn đặt mật khẩu gốc bằng lệnh CẬP NHẬT, bạn sẽ không cần chỉ định mật khẩu đó cho đến khi xóa đặc quyền vì máy chủ sẽ không biết bạn đã thay đổi mật khẩu

  • Nếu bạn gặp sự cố truy cập với chương trình Perl, PHP, Python hoặc ODBC, hãy thử kết nối với máy chủ bằng mysql -u user_name db_name hoặc mysql -u user_name -pyour_pass db_name. Nếu bạn có thể kết nối bằng ứng dụng khách mysql, thì có vấn đề với chương trình của bạn chứ không phải với các đặc quyền truy cập. (Lưu ý rằng không có khoảng cách giữa -p và mật khẩu; bạn cũng có thể sử dụng cú pháp --password=your_pass để chỉ định mật khẩu. Nếu bạn chỉ sử dụng tùy chọn -p, MySQL sẽ nhắc bạn nhập mật khẩu. )

  • Để thử nghiệm, hãy khởi động mysqld daemon với tùy chọn --skip-grant-tables. Sau đó, bạn có thể thay đổi các bảng cấp MySQL và sử dụng tập lệnh mysqlaccess để kiểm tra xem các sửa đổi của bạn có hiệu quả mong muốn hay không. Khi bạn hài lòng với những thay đổi của mình, hãy thực thi mysqladmin flush-privileges để báo cho máy chủ mysqld bắt đầu sử dụng các bảng cấp mới. Ghi chú. tải lại các bảng cấp sẽ ghi đè tùy chọn --skip-grant-tables. Điều này cho phép bạn yêu cầu máy chủ bắt đầu sử dụng lại các bảng cấp phép mà không cần gỡ xuống và khởi động lại nó

  • Nếu mọi thứ khác không thành công, hãy khởi động trình nền mysqld với tùy chọn gỡ lỗi (ví dụ: --debug=d,General,query). Điều này sẽ in thông tin máy chủ và người dùng về các kết nối đã thử, cũng như thông tin về từng lệnh được ban hành. Thấy

  • Nếu bạn có bất kỳ vấn đề nào khác với các bảng cấp MySQL và cảm thấy bạn phải đăng vấn đề lên danh sách gửi thư, hãy luôn cung cấp kết xuất các bảng cấp MySQL. Bạn có thể kết xuất các bảng bằng lệnh mysqldump mysql. Như mọi khi, hãy đăng sự cố của bạn bằng cách sử dụng tập lệnh mysqlbug. Thấy. Trong một số trường hợp, bạn có thể cần phải khởi động lại mysqld với --skip-grant-tables để chạy mysqldump

    Lệnh MySQL nào cho phép người dùng xóa bảng hoặc cơ sở dữ liệu?

    “Dropping a table” trong MySQL đề cập đến lệnh SQL cho phép bạn xóa một bảng trong cơ sở dữ liệu

    Thu hồi đặc quyền của MySQL là gì?

    REVOKE xóa đặc quyền, nhưng không xóa hàng khỏi mysql. bảng hệ thống người dùng . Để xóa hoàn toàn tài khoản người dùng, hãy sử dụng DROP USER.

    Lệnh nào sau đây có thể được sử dụng để xóa chế độ xem khỏi MySQL?

    Lệnh DROP VIEW xóa chế độ xem.

    Cái nào sau đây được sử dụng để xóa toàn bộ cơ sở dữ liệu MySQL?

    Lệnh DROP DATABASE được sử dụng để xóa cơ sở dữ liệu SQL hiện có.