Luôn luôn là một vấn đề đau đầu ... bạn cần thêm vai trò người dùng mới hoặc thay đổi một số đặc quyền và bạn cần chỉ định nó ... từng ... một. Đây là nhiệm vụ thường xuyên, đặc biệt là trong các tổ chức lớn, hoặc trong một công ty mà bạn có cấu trúc đặc quyền phức tạp, hoặc ngay cả khi bạn phải quản lý một số lượng lớn người dùng cơ sở dữ liệu.
Ví dụ:giả sử bạn cần thêm đặc quyền CẬP NHẬT vào cơ sở dữ liệu cụ thể cho tất cả nhóm QA, nếu họ là nhóm năm người thì không có vấn đề gì, nhưng nếu họ 50 ... hoặc 100 ... thì có thể khó khăn. Tất nhiên, bạn luôn có thể viết kịch bản cho nó, nhưng bằng cách này luôn có rủi ro.
Trong blog này, chúng ta sẽ xem cách chúng ta có thể giải quyết vấn đề quản lý người dùng cơ sở dữ liệu này bằng cách sử dụng các vai trò và với các mẹo cụ thể về cách sử dụng chúng với MariaDB.
Vai trò là gì?
Trong thế giới cơ sở dữ liệu, vai trò là một nhóm các đặc quyền có thể được gán cho một hoặc nhiều người dùng và người dùng có thể có một hoặc nhiều vai trò được chỉ định cho anh ta. Để so sánh, nó giống như một nhóm trên Hệ điều hành Linux.
Nếu chúng ta xem ví dụ trước về đặc quyền CẬP NHẬT trong nhóm QA, nếu chúng ta đã tạo vai trò QA và tất cả các thành viên QA đều có vai trò này được chỉ định, không quan trọng số lượng thành viên, bạn chỉ cần thay đổi đặc quyền về vai trò QA này và nó sẽ được phổ biến cho tất cả người dùng QA.
Các vai trò trên MariaDB
Để quản lý vai trò trên MariaDB, bạn phải tạo vai trò bằng câu lệnh CREATE ROLE, gán đặc quyền cho vai trò đó bằng câu lệnh GRANT, sau đó gán đặc quyền cho người dùng để có thể sử dụng vai trò này. Bạn cũng có thể đặt vai trò mặc định để người dùng sẽ đảm nhận vai trò đó khi kết nối.
Là người dùng cơ sở dữ liệu, bạn phải đặt vai trò khi truy cập cơ sở dữ liệu (nếu không có vai trò mặc định) và bạn có thể thay đổi vai trò nếu cần bằng câu lệnh SET ROLE.
Từ phía ứng dụng, bạn có thể đặt vai trò (hoặc sử dụng mặc định) trước khi truy vấn để làm cho điều này hoạt động, vì vậy trong các ứng dụng cũ, việc triển khai có thể phức tạp.
Hãy xem một số thông số kỹ thuật cho Vai trò trên MariaDB.
- Người dùng hiện tại chỉ có thể hoạt động cùng một lúc một vai trò.
- Kể từ MariaDB 10.1, chúng tôi có Vai trò Mặc định. Vai trò này tự động được bật khi người dùng kết nối.
- Các vai trò được lưu trữ trong bộ nhớ.
Cách kiểm tra vai trò
Trên MariaDB, có nhiều cách để kiểm tra nó:
- SHOW GRANTS [FOR (user | role)]:Liệt kê các khoản trợ cấp cho người dùng hiện tại hoặc cho một người cụ thể.
MariaDB [testing]> SHOW GRANTS for [email protected]'%'; +----------------------------------------------------------------------------------------------------------+ | Grants for [email protected]% | +----------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'testuser'@'%' IDENTIFIED BY PASSWORD '*FAAFFE644E901CFAFAEC7562415E5FAEC243B8B2' | +----------------------------------------------------------------------------------------------------------+ 1 row in set (0.000 sec)
- CHỌN người dùng TỪ mysql.user WHERE is_role ='Y':Liệt kê các vai trò được tạo trong cơ sở dữ liệu.
MariaDB [testing]> SELECT user FROM mysql.user WHERE is_role='Y'; +--------+ | user | +--------+ | qateam | +--------+ 1 row in set (0.000 sec)
- CHỌN * TỪ information_schema.applicable_roles:Đó là danh sách các vai trò có sẵn cho người dùng hiện tại.
MariaDB [testing]> SELECT * FROM information_schema.applicable_roles; +-------------+-----------+--------------+------------+ | GRANTEE | ROLE_NAME | IS_GRANTABLE | IS_DEFAULT | +-------------+-----------+--------------+------------+ | [email protected]% | qateam | NO | NO | +-------------+-----------+--------------+------------+ 1 row in set (0.000 sec)
- SELECT * FROM information_schema.enabled_roles:Liệt kê các vai trò đang hoạt động hiện tại.
MariaDB [testing]> SELECT * FROM information_schema.enabled_roles; +-----------+ | ROLE_NAME | +-----------+ | qateam | +-----------+ 1 row in set (0.000 sec)
- CHỌN * TỪ mysql.roles_mapping:Liệt kê các mối quan hệ giữa vai trò và quyền của người dùng.
MariaDB [testing]> SELECT * FROM mysql.roles_mapping; +-----------+-----------+--------+--------------+ | Host | User | Role | Admin_option | +-----------+-----------+--------+--------------+ | localhost | root | qateam | Y | | % | testuser | qateam | N | +-----------+-----------+--------+--------------+ 2 rows in set (0.000 sec)
Cách quản lý các vai trò trên MariaDB
Hãy xem một ví dụ về cách quản lý nó trên MariaDB. Trong trường hợp này, chúng tôi sẽ sử dụng phiên bản MariaDB 10.3 chạy trên CentOS 7.
Đầu tiên, hãy tạo một người dùng cơ sở dữ liệu mới:
MariaDB [testing]> CREATE USER [email protected]'%' IDENTIFIED BY 'PASSWORD';
Nếu chúng tôi kiểm tra các khoản tài trợ cho người dùng mới này, chúng tôi sẽ thấy một cái gì đó như sau:
MariaDB [testing]> SHOW GRANTS for [email protected]'%';
+----------------------------------------------------------------------------------------------------------+
| Grants for [email protected]% |
+----------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'testuser'@'%' IDENTIFIED BY PASSWORD '*FAAFFE644E901CFAFAEC7562415E5FAEC243B8B2' |
+----------------------------------------------------------------------------------------------------------+
1 row in set (0.000 sec)
Bây giờ, hãy thử đăng nhập với người dùng này và kết nối với cơ sở dữ liệu thử nghiệm:
$ mysql -utestuser -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 54
Server version: 10.3.16-MariaDB-log MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> use testing
ERROR 1044 (42000): Access denied for user 'testuser'@'%' to database 'testing'
Như có thể thấy, chúng tôi không thể kết nối với cơ sở dữ liệu thử nghiệm với người dùng này, vì vậy, bây giờ, chúng tôi sẽ tạo một vai trò “qateam” với các đặc quyền và chúng tôi sẽ chỉ định vai trò này cho người dùng mới này.
MariaDB [testing]> CREATE ROLE qateam;
Query OK, 0 rows affected (0.001 sec)
MariaDB [testing]> GRANT SELECT,INSERT,UPDATE,DELETE ON testing.* TO qateam;
Query OK, 0 rows affected (0.000 sec)
Nếu chúng tôi cố gắng sử dụng vai trò này mà không có GRANT, chúng tôi sẽ thấy lỗi sau:
MariaDB [(none)]> SET ROLE qateam;
ERROR 1959 (OP000): Invalid role specification `qateam`
Vì vậy, bây giờ chúng tôi sẽ chạy GRANT để cho phép người dùng sử dụng nó:
MariaDB [(none)]> GRANT qateam TO [email protected]'%';
Query OK, 0 rows affected (0.000 sec)
Đặt vai trò cho người dùng hiện tại:
MariaDB [(none)]> SET ROLE qateam;
Query OK, 0 rows affected (0.000 sec)
Và cố gắng truy cập cơ sở dữ liệu:
MariaDB [(none)]> use testing;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MariaDB [testing]>
Chúng tôi có thể kiểm tra các khoản tài trợ cho người dùng hiện tại:
MariaDB [(none)]> SHOW GRANTS for [email protected]'%';
+----------------------------------------------------------------------------------------------------------+
| Grants for [email protected]% |
+----------------------------------------------------------------------------------------------------------+
| GRANT qateam TO 'testuser'@'%' |
| GRANT USAGE ON *.* TO 'testuser'@'%' IDENTIFIED BY PASSWORD '*FAAFFE644E901CFAFAEC7562415E5FAEC243B8B2' |
+----------------------------------------------------------------------------------------------------------+
2 rows in set (0.000 sec)
Và vai trò hiện tại:
MariaDB [testing]> SELECT CURRENT_ROLE;
+--------------+
| CURRENT_ROLE |
+--------------+
| qateam |
+--------------+
1 row in set (0.000 sec)
Tại đây, chúng ta có thể thấy khoản trợ cấp cho vai trò qateam và đó là điều đó, chúng tôi không có đặc quyền được chỉ định trực tiếp cho người dùng, chúng tôi có các đặc quyền cho vai trò và người dùng nhận các đặc quyền từ đó.
Kết luận
Việc quản lý các vai trò có thể giúp cuộc sống của chúng ta dễ dàng hơn trong các công ty hoặc cơ sở dữ liệu lớn với số lượng người dùng truy cập cao. Nếu chúng ta muốn sử dụng nó từ ứng dụng của mình, chúng ta phải tính đến việc ứng dụng cũng phải có khả năng quản lý nó.