MariaDB
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> MariaDB

Mẹo và thủ thuật để triển khai điều khiển truy cập dựa trên vai trò cơ sở dữ liệu cho MariaDB

Trong hệ thống quản lý cơ sở dữ liệu (DBMS), kiểm soát truy cập dựa trên vai trò (RBAC), là một hạn chế đối với tài nguyên cơ sở dữ liệu dựa trên một tập hợp các nhóm đặc quyền được xác định trước và đã trở thành một trong những phương pháp kiểm soát truy cập nâng cao. Các vai trò cơ sở dữ liệu có thể được tạo và loại bỏ, cũng như có các đặc quyền được cấp và thu hồi từ chúng. Các vai trò có thể được cấp và thu hồi từ các tài khoản người dùng cá nhân. Các vai trò hoạt động hiện hành cho tài khoản có thể được chọn từ những vai trò được cấp cho tài khoản và được thay đổi trong các phiên của tài khoản đó.

Trong bài đăng trên blog này, chúng tôi sẽ trình bày một số mẹo và thủ thuật về việc sử dụng vai trò cơ sở dữ liệu để quản lý các đặc quyền của người dùng và như một cơ chế kiểm soát truy cập nâng cao để truy cập cơ sở dữ liệu của chúng tôi. Nếu bạn muốn tìm hiểu về các khái niệm cơ bản về vai trò trong MySQL và MariaDB, hãy xem bài đăng trên blog này, Quản lý người dùng cơ sở dữ liệu:Quản lý vai trò cho MariaDB.

Vai trò MySQL và MariaDB

MySQL và MariaDB sử dụng hai cơ chế vai trò khác nhau. Trong MySQL 8.0 trở lên, vai trò tương tự như một người dùng khác, với tên người dùng và máy chủ lưu trữ ('role1' @ 'localhost'). Đúng, đó là tên vai trò, thực tế tương tự như định nghĩa máy chủ lưu trữ người dùng tiêu chuẩn. MySQL lưu trữ định nghĩa vai trò giống như lưu trữ các đặc quyền của người dùng trong bảng hệ thống mysql.user.

MariaDB đã giới thiệu vai trò và đặc quyền truy cập trong phiên bản MariaDB 10.0.5 (tháng 11 năm 2013), 8 năm trước khi MySQL đưa tính năng này vào MySQL8.0. Nó tuân theo quản lý vai trò tương tự trong hệ thống cơ sở dữ liệu tuân thủ SQL, mạnh mẽ hơn và dễ hiểu hơn nhiều. MariaDB lưu trữ định nghĩa trong bảng hệ thống mysql.user được gắn cờ với một cột mới được thêm vào gọi là is_role. MySQL lưu trữ vai trò khác nhau, sử dụng kết hợp máy chủ lưu trữ người dùng tương tự như quản lý người dùng MySQL tiêu chuẩn.

Phải nói rằng, việc di chuyển vai trò giữa hai DBMS này hiện không tương thích với nhau.

Vai trò Quản trị và Sao lưu MariaDB

MySQL có các đặc quyền động, cung cấp một tập hợp các đặc quyền cho các tác vụ quản trị chung. Đối với MariaDB, chúng ta có thể đặt những thứ tương tự bằng cách sử dụng vai trò, đặc biệt là đối với các đặc quyền sao lưu và khôi phục. Đối với MariaDB Backup, vì nó là một bản sao lưu vật lý và yêu cầu một bộ đặc quyền khác, chúng tôi có thể tạo một vai trò cụ thể để nó được gán cho một người dùng cơ sở dữ liệu khác.

Trước tiên, hãy tạo một vai trò và gán cho nó các đặc quyền phù hợp:

MariaDB> CREATE ROLE mariadb_backup;
MariaDB> GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO mariadb_backup;

Sau đó, chúng tôi có thể tạo người dùng sao lưu, cấp cho nó vai trò mariadb_backup và gán vai trò mặc định:

MariaDB> CREATE USER [email protected] IDENTIFIED BY 'passw0rdMMM';
MariaDB> GRANT mariadb_backup TO [email protected];
MariaDB> SET DEFAULT ROLE mariadb_backup FOR [email protected];

Đối với mysqldump hoặc mariadb-dump, các đặc quyền tối thiểu để tạo bản sao lưu có thể được đặt như sau:

MariaDB> CREATE ROLE mysqldump_backup;
MariaDB> GRANT SELECT, SHOW VIEW, TRIGGER, LOCK TABLES ON *.* TO mysqldump_backup;

Sau đó, chúng tôi có thể tạo người dùng sao lưu, cấp cho nó vai trò mysqldump_backup và gán vai trò mặc định:

MariaDB> CREATE USER [email protected] IDENTIFIED BY 'p4ss182MMM';
MariaDB> GRANT mysqldump_backup TO [email protected];
MariaDB> SET DEFAULT ROLE mysqldump_backup FOR [email protected];

Để khôi phục, nó thường yêu cầu một bộ đặc quyền khác, một chút:

MariaDB> CREATE ROLE mysqldump_restore;
MariaDB> GRANT SUPER, ALTER, INSERT, CREATE, DROP, LOCK TABLES, REFERENCES, SELECT, CREATE ROUTINE, TRIGGER ON *.* TO mysqldump_restore;

Sau đó, chúng tôi có thể tạo người dùng khôi phục, cấp cho nó vai trò mysqldump_restore và gán vai trò mặc định:

MariaDB> CREATE USER [email protected] IDENTIFIED BY 'p4ss182MMM';
MariaDB> GRANT mysqldump_restore TO [email protected];
MariaDB> SET DEFAULT ROLE mysqldump_restore FOR [email protected];

Bằng cách sử dụng thủ thuật này, chúng ta có thể đơn giản hóa quá trình tạo người dùng quản trị bằng cách gán một vai trò với các đặc quyền được xác định trước. Do đó, tuyên bố GRANT của chúng tôi có thể được rút ngắn và dễ hiểu.

Tạo vai trò thay thế vai trò trong MariaDB

Chúng ta có thể tạo một vai trò khác thay cho một vai trò hiện có tương tự như một thành viên nhóm lồng nhau với quyền kiểm soát chi tiết hơn đối với các đặc quyền. Ví dụ:chúng ta có thể tạo 4 vai trò sau:

MariaDB> CREATE ROLE app_developer, app_reader, app_writer, app_structure;

Cấp đặc quyền quản lý cấu trúc giản đồ cho vai trò app_ architecture:

MariaDB> GRANT CREATE, ALTER, DROP, CREATE VIEW, CREATE ROUTINE, INDEX, TRIGGER, REFERENCES ON app.* to app_structure;

Cấp đặc quyền cho Ngôn ngữ thao tác dữ liệu (DML) cho vai trò app_writer:

MariaDB> GRANT INSERT, DELETE, UPDATE, CREATE TEMPORARY TABLES app.* to app_writer;

Cấp đặc quyền cho Ngôn ngữ truy vấn dữ liệu (DQL) cho vai trò app_reader:

MariaDB> GRANT SELECT, LOCK TABLES, SHOW VIEW app.* to app_reader;

Và cuối cùng, chúng ta có thể gán tất cả các vai trò ở trên cho app_developer để có toàn quyền kiểm soát lược đồ:

MariaDB> GRANT app_structure TO app_developer;
MariaDB> GRANT app_reader TO app_developer;
MariaDB> GRANT app_writer TO app_developer;

Các vai trò đã sẵn sàng và bây giờ chúng ta có thể tạo người dùng cơ sở dữ liệu với vai trò app_developer:

MariaDB> CREATE USER 'michael'@'192.168.0.%' IDENTIFIED BY 'passw0rdMMMM';
MariaDB> GRANT app_developer TO 'michael'@'192.168.0.%';
MariaDB> GRANT app_reader TO 'michael'@'192.168.0.%';

Vì Michael hiện thuộc về các vai trò app_deleloper và app_reader, chúng tôi cũng có thể chỉ định các đặc quyền thấp nhất làm vai trò mặc định để bảo vệ anh ấy khỏi sai lầm không mong muốn của con người:

MariaDB> SET DEFAULT ROLE app_reader FOR 'michael'@'192.168.0.%';

Điều tốt khi sử dụng một vai trò là bạn có thể ẩn các đặc quyền thực tế khỏi người dùng cơ sở dữ liệu. Hãy xem xét người dùng cơ sở dữ liệu sau đây vừa đăng nhập:

MariaDB> SELECT user();
+----------------------+
| user()               |
+----------------------+
| [email protected] |
+----------------------+

Khi cố gắng lấy các đặc quyền bằng SHOW GRANTS, Michael sẽ thấy:

MariaDB> SHOW GRANTS FOR 'michael'@'192.168.0.%';
+----------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]                                                                                   |
+----------------------------------------------------------------------------------------------------------------+
| GRANT `app_developer` TO `michael`@`localhost`                                                                 |
| GRANT USAGE ON *.* TO `michael`@`localhost` IDENTIFIED BY PASSWORD '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' |
+----------------------------------------------------------------------------------------------------------------+

Và khi Michael đang cố gắng tìm kiếm các đặc quyền của app_developer, anh ấy sẽ thấy lỗi này:

MariaDB> SHOW GRANTS FOR FOR app_developer;
ERROR 1044 (42000): Access denied for user 'michael'@'localhost' to database 'mysql'

Thủ thuật này cho phép các DBA chỉ hiển thị nhóm logic nơi người dùng thuộc về và không có gì khác. Chúng tôi có thể giảm vectơ tấn công từ khía cạnh này vì người dùng sẽ không biết về các đặc quyền thực sự được chỉ định cho họ.

Thực thi vai trò mặc định trong MariaDB

Bằng cách thực thi vai trò mặc định, người dùng cơ sở dữ liệu có thể được bảo vệ ở lớp đầu tiên khỏi những sai lầm ngẫu nhiên của con người. Ví dụ:hãy xem xét người dùng Michael đã được cấp vai trò app_developer, trong đó vai trò app_developer là một tập hợp siêu của các vai trò app_strucutre, app_writer và app_reader, như được minh họa bên dưới:

Vì Michael thuộc về vai trò app_deleloper nên chúng tôi cũng có thể đặt đặc quyền thấp nhất là vai trò mặc định để bảo vệ anh ta khỏi việc vô tình sửa đổi dữ liệu:

MariaDB> GRANT app_reader TO 'michael'@'192.168.0.%';
MariaDB> SET DEFAULT ROLE app_reader FOR 'michael'@'192.168.0.%';

Đối với người dùng "michael", anh ta sẽ thấy thông tin sau khi đăng nhập:

MariaDB> SELECT user(),current_role();
+-------------------+----------------+
| user()            | current_role() |
+-------------------+----------------+
| [email protected] | app_reader     |
+-------------------+----------------+

Vai trò mặc định của nó là app_reader, là đặc quyền read_only cho cơ sở dữ liệu được gọi là "app". Người dùng hiện tại có khả năng chuyển đổi giữa bất kỳ vai trò áp dụng nào bằng cách sử dụng tính năng ĐẶT VAI TRÒ. Đối với Michael, anh ấy có thể chuyển sang một vai trò khác bằng cách sử dụng câu lệnh sau:

MariaDB> SET ROLE app_developer;

Tại thời điểm này, Michael sẽ có thể ghi vào 'ứng dụng' cơ sở dữ liệu vì app_developer là một tập siêu của app_writer và app_ architecture. Để kiểm tra các vai trò khả dụng cho người dùng hiện tại, chúng tôi có thể truy vấn bảng information_schema.applicable_roles:

MariaDB> SELECT * FROM information_schema.applicable_roles;
+-------------------+---------------+--------------+------------+
| GRANTEE           | ROLE_NAME     | IS_GRANTABLE | IS_DEFAULT |
+-------------------+---------------+--------------+------------+
| [email protected] | app_developer | NO           | NO         |
| app_developer     | app_writer    | NO           | NULL       |
| app_developer     | app_reader    | NO           | NULL       |
| app_developer     | app_structure | NO           | NULL       |
| [email protected] | app_reader    | NO           | YES        |
+-------------------+---------------+--------------+------------+

Theo cách này, chúng ta đang thiết lập một vai trò chính cho người dùng và vai trò chính có thể là đặc quyền thấp nhất có thể cho một người dùng cụ thể. Người dùng phải đồng ý về vai trò hoạt động của nó, bằng cách chuyển sang một vai trò đặc quyền khác trước khi thực hiện bất kỳ hoạt động rủi ro nào đối với máy chủ cơ sở dữ liệu.

Lập bản đồ vai trò trong MariaDB

MariaDB cung cấp một bảng ánh xạ vai trò được gọi là mysql.roles_mapping. Việc ánh xạ cho phép chúng tôi dễ dàng hiểu được mối tương quan giữa người dùng và các vai trò của người dùng và cách một vai trò được ánh xạ với một vai trò khác:

MariaDB> SELECT * FROM mysql.roles_mapping;
+-------------+-------------------+------------------+--------------+
| Host        | User              | Role             | Admin_option |
+-------------+-------------------+------------------+--------------+
| localhost   | root              | app_developer    | Y            |
| localhost   | root              | app_writer       | Y            |
| localhost   | root              | app_reader       | Y            |
| localhost   | root              | app_structure    | Y            |
|             | app_developer     | app_structure    | N            |
|             | app_developer     | app_reader       | N            |
|             | app_developer     | app_writer       | N            |
| 192.168.0.% | michael           | app_developer    | N            |
| localhost   | michael           | app_developer    | N            |
| localhost   | root              | mysqldump_backup | Y            |
| localhost   | dump_user1        | mysqldump_backup | N            |
| localhost   | root              | mariadb_backup   | Y            |
| localhost   | mariabackup_user1 | mariadb_backup   | N            |
+-------------+-------------------+------------------+--------------+

Từ kết quả trên, chúng ta có thể biết rằng Người dùng không có Máy chủ lưu trữ về cơ bản là một vai trò thay vì một vai trò và người dùng quản trị (Admin_option =Y) cũng đang được tự động gán cho các vai trò đã tạo. Để có được danh sách các vai trò đã tạo, chúng ta có thể truy vấn bảng người dùng MySQL:

MariaDB> SELECT user FROM mysql.user WHERE is_role = 'Y';
+------------------+
| User             |
+------------------+
| app_developer    |
| app_writer       |
| app_reader       |
| app_structure    |
| mysqldump_backup |
| mariadb_backup   |
+------------------+

Lời kết

Việc sử dụng các vai trò có thể cải thiện tính bảo mật của cơ sở dữ liệu bằng cách cung cấp thêm một lớp bảo vệ chống lại việc sửa đổi dữ liệu ngẫu nhiên của người dùng cơ sở dữ liệu. Hơn nữa, nó đơn giản hóa các hoạt động quản lý và bảo trì đặc quyền cho các tổ chức có nhiều người dùng cơ sở dữ liệu.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách RTRIM () hoạt động trong MariaDB

  2. 8 cách để thêm phút vào ngày giờ trong MariaDB

  3. HOUR () so với EXTRACT (HOUR…) ở MariaDB:Sự khác biệt là gì?

  4. Cách khắc phục việc xóa dữ liệu ngẫu nhiên trong MySQL &MariaDB

  5. MariaDB USER () Giải thích