Grant MySql- BÀI 2: Thiết Lập Quyền Trong MySql

    Bài viết này là bài viết tiếp theo trong seri bài viết ngắn về cách phân quyền trong cơ sở dữ liệu mysql. Có thể bạn cần bỏ chút thời gian để đọc qua bài viết đầu tiên trong series này để biết cách tạo 1 user trước khi đi vào phần chính trong bài viết này (Xem chi tiết cách tạo user tại đây). Ok nếu bạn đã biêt cách tạo user rồi thì giờ chúng ta sẽ tiên hành thiết lập phân quyền hạn cho các user mà bạn vừa tạo. Bài viết được đề cập qua các vấn đề chính sau đây
  1. Những điều cần biết trước khi phân quyền
  2. Làm việc với lệnh phân quyền
  3. Một số mẹo thủ thuật

1. Những điều cần biết trước khi phân quyền

- Thiết lập truy cập từ xa: Giống như các cơ sở dữ liệu khác thì mặc định MySql cũng tắt chế độ authenticate từ xa. Vì vậy bạn phải tiến hành bật chế độ authen từ xa bằng cách: Truy câp vào file mysqld.cnf theo đường dẫn /etc/mysql/mysql.conf.d/mysqld.cnf (chỗ này dùng nano hay vim edit là tùy bạn nhé). Tìm tới dòng bind-address và thay thế value bằng một địa chỉ ip mạng chỉ định. Bạn cũng có thể thay giá trị là 0.0.0.0 để có thể accept toàn bộ các ip. Cú pháp của nó trông giống như thế này: 
          bind-address = xxx.xxx.xxx.xxx  (thay xxx.xxx.xxx.xxx bằng ip chỉ định) hoặc   bind-address = 0.0.0.0
- Nên sử dụng tài khoản root để đăng nhập vào bash mysql làm việc: Mặc định khi cài đặt mysql đã cung cấp cho chúng ta một tài khoản root và mật khẩu là emtpy, bạn có thể sử dụng tài khoản này để truy cập dòng lệnh bash mysql. Nếu vô tinh đặt mật khẩu account root, đừng quá lo lắng vì bạn có thể khôi phục nó (chi tiết xem thêm tại đây)
- Accept cổng truy cập MySql với tưởng lửa (csf hoặc iptable): có thể bạn cần phải cấu hình tưởng lửa để cho phép mở port của MySql. Trong trường hợp này chỉ cần add cho iptable port cần mở hoặc csf (trình quản lý iptable).
Privileges: nhóm các quyền hỗ trợ trong mysql. Đây là phần rất quan trọng, bạn cần biết mysql cung cấp cho ta những quyền gì và mục đích của từng quyền này. Bạn cần hiểu rõ ý nghĩa của các nhóm quyền này để việc phân cấp quyền truy cập cho tài khoản thuận lợi, bảo mật và toàn vẹn thông tin, tránh được nhiều rủi ro nhất có thể. Các option của privilege cung cấp khá nhiều. Bạn có thể xem thêm từ trang chủ mysql hoặc tham khảo thêm option Privilege mà mình liệt kê ở dưới cuối bài viết.
- Data Privileges: Lạ quá search cái này thử trên trang chủ coi sao. Không thấy kết quả rồi ahihi vì nó là do mình bịa ra mà. Cái này bạn có hiểu theo nghĩa là các phần dữ liệu được ban các quyền hành. Có thể kể đến như:
  • Global Privileges (Phạm vi- toàn cục): Quyền được cấp toàn bộ các thiết lập trong mysql
  • Database Privileges (Phạm vi- Database): Quyền được cấp cho Database chỉ định
  • Table Privileges (Phạm vi- Table): Quyền được cấp cho Bảng chỉ định
  • Column Privileges (Phạm vi- Column): Quyên được cấp cho Cột chỉ định
  • Store Routine Privileges (Phạm vi- Global, Database): Quyền được cấp cho các Thủ tụcHàm chỉ định (Store Procedure or Function)
  • Proxy User Privileges: Quyền được cấp cho 1 ip chỉ định
Chú ý:
  • Sau các thiết lập file cấu bạn lên khởi động lại mysql để đảm bảo thiết lập được áp dụng: sudo service mysql restart
  • Sau các thiết lập quyền bằng dòng lệnh bạn lên chạy lại lệnh sau để apply các thay đổi đó: FLUSH PRIVILEGES

2. Làm việc với lệnh phân quyền

a) Lệnh tạo quyền
- Đây là cú pháp tổng quan về cách tạo quyền:
       GRANT [PRIVILIGES ] [OPTION_PRIVILEGES] ON [OPTION_DATA_PRIVILEGES] TO 'USER'@'HOST' [AUTH_OPTION];
Trong đó PRIVILIGES: từ khoa có thể có hoặc không, đây là ủy quyền cao
  • OPTION_PRIVILEGES: là các nhóm quyền đã đề cập ở trên.
  • OPTION_DATA_PRIVILEGES: nhóm các tùy chọn data privileges đã đề cập ở trên
  • 'USER'@'HOST': tên tài khoản cấp quyền + (host hoặc ip) được cấp phát quyền. Phần này mình đã đề cập rõ từ bài viết trước.
  • AUTH_OPTION: cung cấp tùy chọn xác thực. (xem thêm tại bài viết trước của mình)
Chú ý: Với 1 user bạn có thể lặp lại thao tác thiết lập nhiều lần, nghĩa là với 1 user bạn có thể bổ xung thêm nhiều quyền khác nhau cho nó.
Dưới đây là ví dụ cho từng nhóm quyền + kết hợp nhóm tùy chọn data privileges
Nhóm global:
  • GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost': thiết lập full quyền cho user có tên admin trên host: localhost. Do để là '*' đồng nghĩa với việc có thể thao tác trên toàn bộ các database
  • GRANT  ALL PRIVILEGES ON *.* TO 'admin'@'%': thiết lập full quyền cho user = 'admin' tuy nhiên user này còn có khả năng truy cập ở mọi các ip khác (do host là %)
Nhóm database chỉ định:
- GRANT ALL PRIVILEGES ON  mydb.* TO 'admin2'@'%' IDENTIFIED by 'mypassword': cấp phát quyền all cho thằng admin2 nhưng chỉ trong phạm vi CSDL: mydb. Thiết lập cho thằng này nhiều lần phát
  • GRANT ALL PRIVILEGES ON  mydb2.* TO 'admin2'@'%' ....: cho thằng admin2 thêm full quyền trên CSDL: mydb2
  • GRANT SELECT, INSERT, UPDATE ON  mydb3.* TO 'admin2'@'%' ....: cho thằng admin2 thêm quyền thêm, sửa, lấy dữ liệu từ CSDL: mydb
Nhóm table chỉ định:
  • GRANT ALL PRIVILEGES  ON mydb.mytbl TO 'admin3'@'%': Cấp cho thằng admin3 full quyền truy cập bảng mytb trong CSDL: mydb. (có cải bảng cũng full quyền, nghe ghê vãi 🤣)
  • GRANT SELECT, INSERT ON mydb.mytbl2 TO 'admin3'@'%'; cấp thêm cho thằng admin3 quyền select và insert trong bảng mytb2 và CSDL: mydb
Nhóm column chỉ định
  • GRANT SELECT (col1), INSERT (col1,col2) ON mydb.mytbl TO 'admin3'@'admin4'; cho thằng admin4 được phép lấy dữ liệu trong CSDL: mydb, bảng: mytbl và cột col1 và chỉ được thêm trong col1 và col2 (Trặt quá trời 🙄)
  • GRANT SELECT (col1), INSERT (col1,col2) ON mydb.mytbl2 TO 'admin3'@'admin4'; thằng admin4 giờ được cấp thêm quyền như trên nhưng trên cả bảng mytbl2 nữa
Nhóm Stored Routine Privileges
GRANT CREATE ROUTINE ON mydb.* TO 'admin5'@'somehost'; Khởi tạo quyền stored routine cho thằng admin5
  • GRANT EXECUTE ON PROCEDURE mydb.myproc TO 'admin5'@'admin5'; cho thằng admin5 được phép sử dụng thủ tục myproc..
Chú ý: Mỗi khi bạn thêm PRIVILIGES ở mỗi lần tạo quyền () thì có nghĩa là quyền đó được cập ở mức cao nhất
b) Truy vấn hiển thị quyền
  • show grants: hiển thị tất cả các quyền được cấp cho db đang truy cập
  • show grants for 'user_name'@'host_name'; hiển thị tất cả các quyền được cài đặt cho tài khoản có user = user_name và host = host_name
  • select user(); xem thông tin của tất cả các user ứng với db đang truy cập
  • select current_user(): xem thông tin của user hiện tại đang sử dụng ứng với db truy cập
  • select user,host from mysql.user : xem thông tin tất cả các user có trên hệ thống
  • select `User`, `Grant_priv` from `mysql`.`user`; Xem tất cả trạng thái được set của Grant_prive
  • select `User`, `Grant_priv` from `mysql`.`user` WHERE `User` = 'user_name'; Xem thông tin Grant_priv của tài khoản có user = user_name
c) Hủy quyền
Cú pháp hủy được tách ra làm 3 cú pháp cơ bản
  • Hủy quyền chỉ định trong user:
    • vd- REVOKE INSERT ON *.* FROM 'admin5'@'%'; <=> hủy quyền insert của thằng admin5 ở tất cả các CSDL
  • Hủy toàn bộ quyền: bạn có thể xem thêm tại đây
  • Hủy quyền proxy: bạn có thể xem thêm tại đây

3. Một số lỗi khắc phục

- Không thể tạo user từ tài khoản cấp mọi quyền  (ALL)=> Khắc phục:
    Sử dụng lệnh Select `User`, `Grant_priv` from `mysql`.`user` WHERE `User` = 'user_name';
   Xem thông tin nếu tồn tại value là 'N' tức là user này chưa có quyền cao nhất  => Khắc phục bằng cách
    UPDATE `mysql`.`user` SET `Grant_priv` = 'Y' WHERE `User` = 'root';
    FLUSH PRIVILEGES;
Bảng danh sách các tùy chọn quyền
Privilege Ý nghĩa Cấp độ truy cập
ALL [PRIVILEGES] Cấp tất cả các đặc quyền ở cấp truy cập quy định trừ GRANT OPTION và PROXY.
ALTER Cho phép sử dung ALTER TABLE Global, database, table
CREATE Cho phép tạo database (CSDL) và các bảng Global, database, table
CREATE TABLESPACE Cho phép tạo, thay đổi hoặc hủy các không gian bảng và các nhóm lịch sử Global
CREATE TEMPORARY TABLES Cho phép tạo bảng tạm Global, database
CREATE USER Cho phép tạo user, hủy user, thay đổi tên user và hủy một tất cả các đặc quyền của user Global
CREATE VIEW Cho phép tạo và sửa đổi view Global, database, table
DELETE Cho phép sử dụng toán tử delete Global, database, table
DROP Cho phép hủy database, table và view Global, database, table
EVENT Cho phép sử dụng các sự kiện lập lịch Global, database
FILE Cho phép người dùng để đọc hoặc ghi các tập tin. Global
INDEX Cho phép tạo và hủy index. Global, database, table
INSERT Cho phép sử dụng toán tử insert Global, database, table, column
REFERENCES Cho phép tạo khóa ngoại liên kết Global, database, table, column
RELOAD Cho phép sử dụng lệnh FLUSH (đây là lệnh apply các thay đổi mỗi khi thiết lập quyền) Global
SELECT Cho phép sử dụng toán tử select. Global, database, table, column
SHOW DATABASES Cho phép hiển thị tất cả các cơ sở dữ liệu có trên hệ thống. Global
SHOW VIEW Cho phép hiển thị các view được tạo (chi tiết SHOW CREATE VIEW) Global, database, name
SHUTDOWN Cho phép sử dụng để tắt mysqladmin (chi tiết: mysqladmin shutdown). Global
TRIGGER Cho phép sử dụng trigger Global, database, table
UPDATE Cho phép sử dụng toán tử update Global, database, table, column
USAGE Không cung cấp đặc quyền nào
     Ok bài viết hơi dài quá rồi. Mình xin phép dừng lại đây nhé. Hi vọng nó sẽ hưu ích cho các bạn đang tập phân quyền với MySql để remote từ xa. Cùng bình luận và chia sẻ quan điểm về các lỗi mà các bạn hay gặp phải khi phân quyền cho CSDL MySql này nhé. 🙂
Tham khảo
https://dev.mysql.com
Previous
Next Post »