Giới thiệu
Kiểm soát truy cập và quản lý người dùng là hai lĩnh vực có thể nhanh chóng trở nên phức tạp khi số lượng người dùng và các thực thể cơ sở dữ liệu khác nhau trong hệ thống của bạn tăng lên. Quản lý nhiều đặc quyền khác nhau trên các đối tượng cơ sở dữ liệu khác nhau, đảm bảo những người dùng có trách nhiệm giống nhau có cùng cấp độ truy cập và việc kiểm tra và thu hẹp quyền truy cập đều trở nên khó khăn hơn theo thời gian.
Để giúp giải quyết vấn đề này, MySQL có một khái niệm gọi là "vai trò" cho phép bạn nhóm các gói đặc quyền dưới một tên nhất định, cho phép bạn chỉ định và sửa đổi cài đặt hàng loạt. Trong hướng dẫn này, chúng ta sẽ xem xét cách các vai trò hoạt động trong MySQL và cách sử dụng chúng để giúp quản lý quyền truy cập dữ liệu cho người dùng của bạn dễ dàng hơn.
Lệnh
Dưới đây là các lệnh SQL chính mà chúng ta sẽ thảo luận liên quan đến việc quản lý các vai trò của MySQL.
-
CREATE ROLE
:CREATE ROLE
lệnh xác định một vai trò mới trong hệ thống cơ sở dữ liệu. -
DROP ROLE
:DROP ROLE
lệnh làm ngược lại, xóa một vai trò hiện có. -
GRANT
:GRANT
lệnh có hai mục đích riêng biệt liên quan đến vai trò:thêm đặc quyền vào vai trò và thêm tài khoản người dùng làm thành viên của vai trò. -
REVOKE
:Trong ngữ cảnh của các vai trò,REVOKE
lệnh xóa đặc quyền khỏi vai trò và cũng xóa tư cách thành viên vai trò khỏi tài khoản người dùng. -
SHOW GRANTS
:SHOW GRANTS
lệnh hiển thị các đặc quyền của tài khoản hoặc vai trò người dùng nhất định. -
SET ROLE
:SET ROLE
lệnh thay đổi các vai trò mà tài khoản người dùng đang sử dụng. Điều này cho phép bạn chỉ định bộ quyền nào áp dụng cho tài khoản của phiên. -
SET DEFAULT ROLE
:SET DEFAULT ROLE
lệnh xác định các vai trò được áp dụng tự động khi khách hàng đăng nhập bằng tài khoản người dùng cụ thể.
Đặc quyền bắt buộc
Để làm theo hướng dẫn này, bạn sẽ cần các đặc quyền sau:
-
CREATE ROLE
-
GRANT OPTION
-
CREATE USER
(để đặt vai trò mặc định cho người dùng khác) -
ROLE_ADMIN
(để đặt các biến hệ thống sửa đổi hành vi của vai trò) -
SYSTEM_VARIABLES_ADMIN
(để đặt các biến hệ thống sửa đổi hành vi của vai trò)
CREATE ROLE
đặc quyền là phiên bản thấp hơn của CREATE USER
đặc quyền, cho phép bạn tạo và quản lý các vai trò. Các tài khoản đã có CREATE USER
đặc quyền tự động có tất cả các chức năng cần thiết để quản lý các vai trò.
GRANT OPTION
đặc quyền được yêu cầu để gán đặc quyền cho một vai trò. Bạn phải có GRANT OPTION
được bật cho bất kỳ đặc quyền nào bạn muốn gán cho một vai trò.
Vai trò là gì?
Trong MySQL, một vai trò là một thực thể có chức năng như một vùng chứa hoặc tập hợp các đặc quyền. Quản trị viên có thể gán đặc quyền cho các vai trò giống như cách họ gán đặc quyền cho tài khoản người dùng. Sau đó, bạn có thể thêm tài khoản người dùng làm thành viên của vai trò, cho phép những tài khoản đó truy cập vào các đặc quyền liên quan đến vai trò.
Về cơ bản, các vai trò hoạt động như một cách để nhóm các đặc quyền liên quan khác nhau lại với nhau để giúp quản lý đặc quyền dễ dàng hơn. Thay vì đảm bảo rằng mỗi người dùng có cấp độ truy cập chính xác mà họ yêu cầu bằng cách chỉ định các đặc quyền riêng lẻ, việc sử dụng các nhóm đặc quyền được đặt tên cho phép bạn quản lý các nhiệm vụ ít hơn, dễ hiểu hơn.
Điều này có một lợi thế rõ ràng khi chỉ định các cấp độ truy cập, vì việc chỉ định một nhà phát triển developer
sẽ dễ dàng hơn , sysadmin
hoặc financeteam
vai trò đối với người dùng hơn là quản lý hàng chục đặc quyền riêng lẻ. Nó cũng giúp bạn nhanh chóng điều chỉnh quyền truy cập vào nhiều tài khoản cùng một lúc. Nếu bạn tạo cơ sở dữ liệu mới cho nhóm bán hàng, bạn có thể cung cấp salesteam
vai trò quyền truy cập vào nó thay vì theo dõi mọi tài khoản cần có quyền truy cập.
Tạo vai trò
Nếu bạn có tài khoản với CREATE ROLE
đặc quyền, bạn có thể quản lý các vai trò bằng cách sử dụng CREATE ROLE
lệnh.
Cú pháp của MySQL cho vai trò là gì?
Tên vai trò phải tuân theo một định dạng cụ thể để MySQL coi chúng là hợp lệ. Theo nhiều cách, chúng phản ánh định dạng được sử dụng để xác định tài khoản người dùng MySQL, nhưng có một số khác biệt quan trọng.
Vai trò tuân theo định dạng sau:
'<role>'@'<host>'
Giống như người dùng, vai trò có hai thành phần:tên vai trò và máy chủ mà máy khách đang kết nối. Tuy nhiên, cách MySQL diễn giải các thành phần này khác nhau.
Với các vai trò, '<role>'
phần của tên không bao giờ được để trống. Không có khái niệm vai trò là "ẩn danh" như với người dùng. Mặt khác, bỏ qua '<host>'
phần là vẫn được phép và MySQL sẽ sử dụng %
với tư cách là người dẫn chương trình. Tuy nhiên, %
trong ngữ cảnh này được hiểu là một ký tự nghĩa đen, không phải là một ký tự đại diện.
Về mặt hiệu quả, điều này có nghĩa là mặc dù tên vai trò chia sẻ bề ngoài định dạng của tên tài khoản người dùng, nhưng chúng không trải qua bất kỳ loại đánh giá nào như tài khoản người dùng và chỉ là một nhãn có hai thành phần. Lý do họ làm có hai phần đối với tên của họ là bạn có thể tạo tài khoản người dùng có thể hoạt động như cả người dùng và vai trò. Khi được sử dụng với tư cách người dùng, các thành phần phải tuân theo các quy tắc đánh giá đặc biệt được mô tả trong bài viết quản lý người dùng và khi được sử dụng như một vai trò, tên chỉ được khớp trực tiếp bằng cách sử dụng các tên thành phần theo nghĩa đen.
Do các quy tắc này, trong nhiều trường hợp, quản trị viên chọn xác định vai trò chỉ bằng cách sử dụng '<role>'
thành phần. Điều này khiến MySQL thay thế một %
theo nghĩa đen ký tự cho '<host>'
, làm cho phần đó của tên trở nên vô hình và không quan trọng một cách hiệu quả. Nếu bạn không có ý định sử dụng tên cho cả tài khoản người dùng và vai trò, bạn có thể làm như vậy.
Bạn tạo vai trò như thế nào?
Để tạo vai trò mới, hãy sử dụng CREATE ROLE
lệnh.
Cú pháp cơ bản giống như sau:
CREATE ROLE '<role>'@'<host>';
Bạn cũng có thể tạo nhiều vai trò cùng lúc bằng cách phân tách từng tên vai trò bằng dấu phẩy:
CREATE ROLE '<role_1>'@'<host>', '<role_2>'@'<host>', '<role_3>'@'<host>';
Nếu bất kỳ vai trò nào bạn chỉ định đã tồn tại trên hệ thống, lệnh sẽ không thành công với lỗi.
Để tránh điều này và khiến MySQL chỉ đưa ra cảnh báo, bạn có thể bao gồm IF NOT EXISTS
sau mệnh đề CREATE ROLE
lệnh trước tên vai trò:
CREATE ROLE IF NOT EXISTS '<role>'@'<host>';
Như đã đề cập ở trên, nhiều lần quản trị viên bỏ qua '<host>'
phần của tên vai trò để đơn giản hóa, đặt nó thành chữ %
theo nghĩa đen tính cách. Vì vậy, trong thực tế, nhiều lệnh tạo vai trò của bạn có thể trông giống như sau:
CREATE ROLE '<role>';
Bạn cấp đặc quyền cho một vai trò như thế nào?
Sau khi tạo các vai trò mới, ưu tiên tiếp theo của bạn thường là làm cho chúng có ý nghĩa bằng cách cấp cho chúng các đặc quyền.
Bạn cấp đặc quyền cho các vai trò giống như cách bạn cấp đặc quyền cho tài khoản người dùng. Bạn cung cấp các đặc quyền chính xác mà bạn muốn cấp, chỉ định phạm vi bằng cách cung cấp cơ sở dữ liệu và đối tượng cơ sở dữ liệu nơi đặc quyền hợp lệ và thực thể sẽ được cấp đặc quyền - trong trường hợp này là vai trò:
GRANT <privileges> ON <database>.<object> TO '<role>'@'<host>';
Ví dụ:để cấp SELECT
đặc quyền cho một vai trò được gọi là readapp
trên appdb
cơ sở dữ liệu và tất cả các đối tượng trong nó, bạn có thể nhập:
GRANT SELECT ON appdb.* TO 'readapp';
Tương tự, bạn có thể cấp đặc quyền ghi vào cùng một cơ sở dữ liệu cho một vai trò có tên là writeapp
bằng cách gõ:
GRANT SELECT,INSERT,UPDATE,DELETE ON appdb.* TO 'writeapp';
Bạn có thể cấp đặc quyền và thu hồi chúng khỏi các vai trò giống như cách bạn làm trực tiếp với tài khoản người dùng. Vì vậy, bạn luôn có thể sửa đổi các đặc quyền được liên kết với một vai trò nếu bạn cần điều chỉnh cấp độ truy cập mà bạn muốn cung cấp.
Làm cách nào để cấp cho người dùng tư cách thành viên?
Khi bạn đã thêm đặc quyền vào vai trò của mình, bạn có thể bắt đầu thêm thành viên vào vai trò để cấp cho họ các đặc quyền liên quan.
Để làm điều này, MySQL sử dụng một dạng khác của cùng một GRANT
chúng tôi sử dụng để cấp đặc quyền cho người dùng và vai trò. Tuy nhiên, biểu mẫu mới này thêm vai trò cho người dùng, cho phép tài khoản người dùng truy cập vào tất cả các đặc quyền được cấp cho vai trò đó.
Cú pháp cơ bản giống như sau:
GRANT '<role>'@'<host>' TO '<user>'@'<host>';
Ví dụ:nếu 'reports'@'localhost'
người dùng cần có khả năng đọc dữ liệu từ appdb
cơ sở dữ liệu để tạo báo cáo, chúng tôi có thể thêm readapp
vai trò đối với tài khoản người dùng, cấp cho nó các đặc quyền chọn lọc:
GRANT 'readapp' TO 'reports'@'localhost';
Tương tự, để cung cấp cho 'appuser'@'localhost'
khả năng quản lý dữ liệu trong cùng một cơ sở dữ liệu, chúng tôi có thể đặt người dùng đó trở thành thành viên của writeapp
vai trò:
GRANT 'writeapp' TO 'appuser'@'localhost';
'appuser'@'localhost'
tài khoản bây giờ sẽ có khả năng chèn, cập nhật và xóa dữ liệu khỏi cơ sở dữ liệu. Nếu các đặc quyền mới được thêm vào writeapp
vai trò, 'appuser'@'localhost'
tài khoản sẽ ngay lập tức nhận được những đặc quyền đó.
Làm cách nào để bạn tự động cấp một số vai trò nhất định cho mọi người dùng?
Đôi khi có thể có những vai trò mà bạn muốn mọi người dùng trên hệ thống của mình có quyền truy cập. Bạn có thể xác định những vai trò nào mà mỗi tài khoản được cấp tự động bằng cách đặt mandatory_roles
biến.
Để sửa đổi mandatory_roles
biến, người dùng của bạn phải có ROLE_ADMIN
và SYSTEM_VARIABLES_ADMIN
đặc quyền. Bạn có thể đặt các vai trò mà bạn muốn giao cho mọi người dùng bằng cách nhập:
SET PERSIST mandatory_roles = '`<role_1>`@`<host>`, `<role_2>`@`<host>`, `<role_3>`@`<host>`';
Ở đây, chúng tôi tự động cung cấp cho mỗi người dùng trên hệ thống ba vai trò. Khi đặt biến hệ thống, giá trị của mandatory_roles
phải là một chuỗi, vì vậy chúng tôi gói toàn bộ danh sách vai trò trong các dấu ngoặc kép và sử dụng dấu gạch ngược để trích dẫn các thành phần vai trò riêng lẻ.
Bạn không thể thêm vai trò vào mandatory_roles
danh sách có SYSTEM_USER
đặc ân. Đây là một biện pháp bảo mật để đảm bảo rằng không phải tất cả các phiên trên hệ thống đều là phiên hệ thống tự động.
Bạn sử dụng đặc quyền từ vai trò như thế nào?
Khi bạn đã cấp tư cách thành viên tài khoản người dùng cho các vai trò, bạn sử dụng chúng như thế nào? Để truy cập các đặc quyền do một vai trò cấp cho tài khoản, nó phải được kích hoạt.
Xem các vai trò đang hoạt động hiện tại
Trước khi kích hoạt các vai trò mới, bạn có thể kiểm tra những vai trò nào hiện đang hoạt động cho phiên người dùng của bạn.
Để xem các vai trò đang hoạt động cho phiên của bạn, hãy nhập:
SELECT CURRENT_ROLE()
Đầu ra sẽ hiển thị không hoặc nhiều vai trò đang hoạt động trong phiên hiện tại của bạn. Các đặc quyền được liên kết với các vai trò đó sẽ bổ sung cho những hành động bạn được phép thực hiện.
Cách kích hoạt vai trò cho phiên
Để thay đổi vai trò nào hoạt động trong phiên của bạn, hãy sử dụng SET ROLE
yêu cầu. Bạn có thể sử dụng lệnh này theo một số cách khác nhau.
Cú pháp cơ bản giống như sau:
SET ROLE '<rolename>'@'<host>';
Điều này sẽ kích hoạt vai trò được đề cập. Điều quan trọng cần lưu ý là bất kỳ vai trò hoạt động nào trước đây không được đề cập trong SET ROLE
lệnh bây giờ sẽ bị vô hiệu hóa.
Để kích hoạt nhiều vai trò cùng một lúc, hãy phân tách từng vai trò bằng dấu phẩy:
SET ROLE '<role_1>'@'<host>', '<role_2>'@'<host>', '<role_3>'@'<host>';
Để kích hoạt tất cả các vai trò đã được cấp cho tài khoản của bạn, bạn có thể chỉ định ALL
thay vì một vai trò cụ thể:
SET ROLE ALL;
Bạn cũng có thể yêu cầu MySQL kích hoạt tất cả các vai trò của mình với ngoại lệ cụ thể bằng cách sử dụng ALL EXCEPT
:
SET ROLL ALL EXCEPT '<role_1>'@'<host>';
Một tùy chọn khác là vô hiệu hóa tất cả các vai trò trên tài khoản của bạn bằng cách chỉ định NONE
:
SET ROLE NONE
Thao tác này sẽ hủy kích hoạt tất cả các vai trò người dùng của bạn trong phiên, chỉ cấp cho bạn các đặc quyền được chỉ định cụ thể cho tài khoản người dùng của bạn.
Để quay lại danh sách các vai trò mặc định được xác định cho tài khoản của bạn, hãy sử dụng DEFAULT
từ khóa:
SET ROLE DEFAULT
Cách xác định vai trò mặc định cho tài khoản người dùng
Các vai trò được tự động kích hoạt khi bạn đăng nhập với tư cách người dùng và các vai trò được kích hoạt lại khi bạn sử dụng SET ROLE
có thể định cấu hình.
Để xác định các vai trò sẽ được kích hoạt theo mặc định, hãy sử dụng SET DEFAULT ROLE
tương tự như cách bạn sử dụng SET ROLE
lệnh:
SET DEFAULT ROLE '<role_1>'@'<host>';
Điều này sẽ đặt các vai trò mặc định sẽ được kích hoạt cho tài khoản của riêng bạn khi đăng nhập hoặc khi sử dụng SET ROLE
.
Nếu người dùng của bạn có CREATE USER
đặc quyền, bạn có thể đặt các vai trò mặc định cho các tài khoản khác:
SET DEFAULT ROLE ALL TO '<user>'@'<host>';
Ở đây, chúng tôi chỉ định rằng '<user>'@'<host>'
tài khoản sẽ tự động kích hoạt tất cả các vai trò của nó khi xác thực.
Cú pháp này cũng có thể được sử dụng để xác định vai trò mặc định cho nhiều tài khoản bằng cách phân tách từng người dùng bằng dấu phẩy:
SET DEFAULT ROLE ALL TO '<user_1>'@'<host>', '<user_2>'@'<host>';
Kích hoạt tất cả các vai trò cho tất cả người dùng theo mặc định
Nếu bạn muốn mọi tài khoản trên máy chủ MySQL của mình kích hoạt tất cả các vai trò của nó theo mặc định, bạn có thể thay đổi cài đặt hệ thống để làm như vậy.
Khi activate_all_roles_on_login
biến được đặt thành true, MySQL sẽ tự động kích hoạt tất cả các vai trò được liên kết với tài khoản khi đăng nhập. Điều này thay thế các cài đặt được chỉ định bởi SET DEFAULT ROLE
.
Để bật tính năng này, bạn phải có SYSTEM_VARIABLES_ADMIN
và ROLE_ADMIN
đặc quyền. Bật tính năng này bằng cách nhập:
SET PERSIST activate_all_roles_on_login = ON;
Điều này sẽ khiến tài khoản người dùng tự động kích hoạt tất cả các vai trò khi đăng nhập. Tuy nhiên, SET ROLE
sẽ vẫn cho phép bạn chỉ kích hoạt các vai trò mặc định được liên kết với tài khoản.
Hiển thị các đặc quyền hiện có nhận được từ vai trò
Để hiểu những đặc quyền nào khả dụng trên tài khoản của bạn, bạn có thể sử dụng SHOW GRANTS
lệnh.
Để kiểm tra các khoản tài trợ được bật cho người dùng, hãy nhập:
SHOW GRANTS FOR '<user>'@'<host>';
Kết quả đầu ra sẽ hiển thị cho bạn tất cả các đặc quyền được chỉ định trực tiếp cho tài khoản người dùng cũng như tất cả các vai trò mà người dùng là thành viên.
Sau khi biết tài khoản là thành viên của những vai trò nào, bạn có thể kiểm tra những đặc quyền mà vai trò cung cấp cho người dùng bằng cách nhập:
SHOW GRANTS FOR '<user>'@'<host>' USING '<role>'@'<host>';
Ví dụ:để kiểm tra các đặc quyền của 'reports'@'localhost'
người dùng, bao gồm cả những người được cấp bởi tư cách thành viên của nó trong readapp
vai trò, bạn có thể sử dụng:
SHOW GRANTS FOR 'reports'@'localhost' USING 'readapp';
Điều này sẽ hiển thị cho bạn tất cả các đặc quyền được cấp rõ ràng cho 'reports'@'localhost'
tài khoản người dùng cũng như những tài khoản được thêm bởi readapp
vai trò.
Thu hồi vai trò từ người dùng
Vậy điều gì sẽ xảy ra khi bạn muốn xóa vai trò khỏi người dùng? Tương tự như cách GRANT
lệnh có thể thêm đặc quyền mới cho người dùng hoặc vai trò hoặc thêm vai trò cho người dùng, REVOKE
lệnh có thể xóa đặc quyền khỏi người dùng hoặc vai trò và cũng có thể xóa tư cách thành viên vai trò khỏi người dùng.
Cú pháp cơ bản được sử dụng để xóa vai trò khỏi đăng nhập tài khoản người dùng như sau:
REVOKE '<role>' FROM '<user>'@'<host>';
Sau khi thực hiện một câu lệnh như thế này, người dùng sẽ không còn quyền truy cập vào các đặc quyền đã được cấp thông qua vai trò.
Ví dụ:chúng tôi có thể thu hồi writeapp
vai trò từ 'appuser'@'localhost'
tài khoản người dùng bằng cách nhập:
REVOKE 'writeapp' FROM 'appuser'@'localhost';
Tuy nhiên, nếu người dùng đã được cấp đặc quyền thông qua các phương tiện khác (được cấp trực tiếp hoặc được cấp thông qua tư cách thành viên với vai trò khác) thì họ sẽ vẫn có quyền truy cập đặc quyền đó. Vì vậy, nếu 'appuser'@'localhost'
người dùng cũng là thành viên của readapp
vai trò mà chúng tôi đã cấp trước đó, họ sẽ vẫn có SELECT
đặc quyền trên appdb
cơ sở dữ liệu.
Kết luận
Sử dụng các vai trò để phân phối đặc quyền trong cơ sở dữ liệu MySQL của bạn có thể giúp đơn giản hóa chi phí quản lý và độ phức tạp của hệ thống kiểm soát truy cập của bạn. Việc đảm bảo rằng những người dùng có cùng trách nhiệm có cùng đặc quyền sử dụng các vai trò sẽ dễ dàng hơn nhiều so với việc cấp trực tiếp nhiều đặc quyền khác nhau.
Tương tự, các vai trò cho phép bạn rõ ràng về mục đích đằng sau việc cấp đặc quyền của bạn. Thay vì cấp nhiều đặc quyền cho các tài khoản mà không có bất kỳ bình luận nào, các tên vai trò được chọn cẩn thận có thể giúp phân biệt giữa các lý do truy cập khác nhau. Bằng cách dành thời gian để tạo và sắp xếp các vai trò trước thời hạn, khả năng quản lý quyền truy cập của người dùng vào các phần khác nhau của dữ liệu sẽ dễ dàng hơn về lâu dài.