MySql: Cấp các tùy chọn chỉ đọc?


97

Tôi có một người dùng, người mà tôi muốn cấp tất cả quyền ĐỌC trên giản đồ db.

Một cách là:

GRANT SELECT, SHOW_VIEW  ON test.* TO 'readuser'@'%';

Có cách nào để nhóm tất cả các thao tác đọc trong quyền không?


Đặc quyền là SHOW VIEW, không SHOW_VIEW, nhưng bạn không cần phải cấp quyền này cho người dùng trừ khi bạn muốn họ có thể SHOW CREATE VIEWxem ... họ có thể chọn từ các chế độ xem với SELECTđặc quyền duy nhất . Bạn có nghĩa là gì khi "nhóm tất cả các hoạt động đọc trong cấp"?
Michael - sqlbot

Nếu có bất kỳ đặc quyền duy nhất nào là viết tắt của TẤT CẢ các hoạt động ĐỌC trên cơ sở dữ liệu. Tôi hiểu rằng họ đang cung cấp quyền truy cập chi tiết, nhưng một bản tóm tắt cấp cao thuận tiện sẽ giúp ích cho chúng tôi.
Ajeet Ganga

Câu trả lời:


161

Nếu có bất kỳ đặc quyền duy nhất nào là viết tắt của TẤT CẢ các hoạt động ĐỌC trên cơ sở dữ liệu.

Nó phụ thuộc vào cách bạn định nghĩa "tất cả đã đọc".

"Đọc" từ các bảng và chế độ xem là SELECTđặc quyền. Nếu đó là những gì bạn có nghĩa là "tất cả đã đọc" thì có:

GRANT SELECT ON *.* TO 'username'@'host_or_wildcard' IDENTIFIED BY 'password';

Tuy nhiên, nghe có vẻ như ý bạn là khả năng "nhìn thấy" mọi thứ, "nhìn nhưng không chạm". Vì vậy, đây là những kiểu đọc khác mà bạn nghĩ đến:

"Đọc" định nghĩa của các khung nhìn là một SHOW VIEWđặc ân.

"Đọc" danh sách các truy vấn hiện đang thực hiện của người dùng khác là PROCESSđặc quyền.

"Đọc" trạng thái sao chép hiện tại là một REPLICATION CLIENTđặc quyền.

Lưu ý rằng bất kỳ hoặc tất cả những điều này có thể tiết lộ nhiều thông tin hơn bạn định tiết lộ, tùy thuộc vào bản chất của người dùng được đề cập.

Nếu đó là bài đọc bạn muốn thực hiện, bạn có thể kết hợp bất kỳ quyền nào trong số đó (hoặc bất kỳ đặc quyền nào khác ) trong một GRANTcâu lệnh duy nhất .

GRANT SELECT, SHOW VIEW, PROCESS, REPLICATION CLIENT ON *.* TO ...

Tuy nhiên, không có đặc quyền duy nhất nào cấp cho một số tập hợp con các đặc quyền khác, đó là những gì có vẻ như bạn đang yêu cầu.

Nếu bạn đang thực hiện mọi việc theo cách thủ công và đang tìm cách dễ dàng hơn để thực hiện việc này mà không cần nhớ chính xác khoản trợ cấp mà bạn thường cấp cho một nhóm người dùng nhất định, bạn có thể tra cứu báo cáo để tạo lại các khoản trợ cấp của người dùng tương đương và thay đổi nó xung quanh để tạo người dùng mới với các đặc quyền tương tự:

mysql> SHOW GRANTS FOR 'not_leet'@'localhost';
+------------------------------------------------------------------------------------------------------------------------------------+
| Grants for not_leet@localhost                                                                                                      |
+------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, REPLICATION CLIENT ON *.* TO 'not_leet'@'localhost' IDENTIFIED BY PASSWORD '*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' |
+------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Thay đổi 'not_leet' và 'localhost' để phù hợp với người dùng mới mà bạn muốn thêm, cùng với mật khẩu, sẽ dẫn đến một GRANTcâu lệnh có thể sử dụng lại để tạo người dùng mới.

Ngoài ra, nếu bạn muốn một thao tác duy nhất để thiết lập và cấp tập hợp đặc quyền giới hạn cho người dùng và có thể xóa bất kỳ đặc quyền nào không được kế thừa, điều đó có thể được thực hiện bằng cách tạo một thủ tục được lưu trữ đóng gói mọi thứ bạn muốn làm. Trong phần nội dung của thủ tục, bạn sẽ xây dựng GRANTcâu lệnh bằng SQL động và / hoặc thao tác trực tiếp với chính các bảng cấp.

Trong câu hỏi gần đây về Quản trị viên cơ sở dữ liệu , người đăng muốn khả năng cho người dùng không có đặc quyền sửa đổi người dùng khác, điều này tất nhiên không phải là điều bình thường có thể làm được - người dùng có thể sửa đổi người dùng khác, theo định nghĩa, thì không. một người dùng không có đặc quyền - tuy nhiên - các thủ tục được lưu trữ đã cung cấp một giải pháp tốt trong trường hợp đó, vì chúng chạy với ngữ cảnh bảo mật của DEFINERngười dùng của họ , cho phép bất kỳ ai có EXECUTEđặc quyền trên quy trình tạm thời giả định các đặc quyền đã được nâng cấp để cho phép họ làm những việc cụ thể thủ tục hoàn thành.


1
Cảm ơn. Ngoài câu trả lời tuyệt vời, tôi cũng thích mật khẩu của bạn. :)
Ajeet Ganga

2
Cần lưu ý: PROCESS và REPLICATION CLIENT là các loại đặc quyền "toàn cầu", vì vậy cú pháp sẽ không thành công khi được định nghĩa bằng loại trừ "per database". CẤP QUY TRÌNH TRÊN mydb. * Sẽ không hợp lệ, nhưng CẤP QUY TRÌNH BẬT *. * Sẽ được.
Bee Kay

CẤP CHỌN TRÊN db_name. * ĐỂ 'demo' @ '%' VỚI LỰA CHỌN CẤP;
Musa

16
GRANT SELECT ON *.* TO 'user'@'localhost' IDENTIFIED BY 'password';

Điều này sẽ tạo một người dùng có SELECTđặc quyền cho tất cả cơ sở dữ liệu bao gồm cả Chế độ xem.


9

Các quyền khác nhau mà bạn có thể cấp cho người dùng là

ALL PRIVILEGES- This would allow a MySQL user all access to a designated database (or if no database is selected, across the system)
CREATE- allows them to create new tables or databases
DROP- allows them to them to delete tables or databases
DELETE- allows them to delete rows from tables
INSERT- allows them to insert rows into tables
SELECT- allows them to use the Select command to read through databases
UPDATE- allow them to update table rows
GRANT OPTION- allows them to grant or remove other users' privileges

Để cung cấp cho một người dùng cụ thể quyền, bạn có thể sử dụng khung này:

GRANT [type of permission] ON [database name].[table name] TO ‘[username]’@'localhost’;

Tôi tìm thấy này bài viết rất hữu ích


3

Hướng dẫn từng bước tôi tìm thấy ở đây .

Để tạo tài khoản người dùng cơ sở dữ liệu chỉ đọc cho MySQL

Tại lời nhắc UNIX, hãy chạy chương trình dòng lệnh MySQL và đăng nhập với tư cách quản trị viên bằng cách nhập lệnh sau:

mysql -u root -p

Nhập mật khẩu cho tài khoản gốc. Tại dấu nhắc mysql, hãy thực hiện một trong các bước sau:

Để cấp cho người dùng quyền truy cập vào cơ sở dữ liệu từ bất kỳ máy chủ nào, hãy nhập lệnh sau:

grant select on database_name.* to 'read-only_user_name'@'%' identified by 'password';

Nếu bộ sưu tập sẽ được cài đặt trên cùng một máy chủ với cơ sở dữ liệu, hãy nhập lệnh sau:

grant select on database_name.* to 'read-only_user_name' identified by 'password';

Lệnh này chỉ cấp cho người dùng quyền truy cập chỉ đọc vào cơ sở dữ liệu từ máy chủ cục bộ. Nếu bạn biết tên máy chủ hoặc địa chỉ IP của máy chủ mà bộ thu thập sẽ được cài đặt, hãy nhập lệnh sau:

grant select on database_name.* to 'read-only_user_name'@'host_name or IP_address' identified by 'password';

Tên máy chủ phải có thể phân giải được bằng DNS hoặc bằng tệp máy chủ cục bộ. Tại dấu nhắc mysql, nhập lệnh sau:

flush privileges;

quit.

Sau đây là danh sách các lệnh mẫu và thông báo xác nhận:

mysql> grant select on dbname.* to 'readonlyuser'@'%' identified 
by 'pogo$23';
Query OK, 0 rows affected (0.11 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> quit

3

Ngay cả người dùng đã có câu trả lời và @Michael - sqlbot đã bao gồm hầu hết các điểm rất tốt trong bài đăng của mình nhưng thiếu một điểm, vì vậy chỉ cố gắng che đi.

Nếu bạn muốn cung cấp quyền đọc cho một người dùng đơn giản (Không phải loại quản trị viên) -

GRANT SELECT, EXECUTE ON DB_NAME.* TO 'user'@'localhost' IDENTIFIED BY 'PASSWORD';

Lưu ý: Ở đây cần có EXECUTE để người dùng có thể đọc dữ liệu nếu có một thủ tục được lưu trữ tạo ra một báo cáo (có một vài câu lệnh select).

Thay thế localhost bằng IP cụ thể mà từ đó người dùng sẽ kết nối với DB.

Quyền Đọc Bổ sung là-

  • HIỂN THỊ CHẾ ĐỘ XEM: Nếu bạn muốn hiển thị lược đồ chế độ xem.
  • KHÁCH HÀNG THAY THẾ: Nếu người dùng cần kiểm tra trạng thái nhân bản / nô lệ. Nhưng cần phải cấp quyền trên tất cả DB.
  • TIẾN TRÌNH: Nếu người dùng cần kiểm tra tiến trình đang chạy. Sẽ chỉ hoạt động với tất cả DB.

0

Nếu bạn muốn dạng xem chỉ được đọc sau khi cấp quyền đọc, bạn có thể sử dụng ALGORITHM = TEMPTABLE trong định nghĩa dạng xem DDL.


0

Lưu ý đối với MySQL 8 thì khác

Bạn cần thực hiện theo hai bước:

CREATE USER 'readonly_user'@'localhost' IDENTIFIED BY 'some_strong_password';
GRANT SELECT, SHOW VIEW ON *.* TO 'readonly_user'@'localhost';
flush privileges;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.