Kiểm soát truy cập dựa trên vai trò (RBAC) trong MongoDB
Tìm hiểu kiểm soát truy cập dựa trên vai trò (RBAC) trong MongoDB để quản lý người dùng và vai trò, tạo vai trò tùy chỉnh, và áp dụng chính sách đặc quyền tối thiểu cho các triển khai.
Khi ngày càng nhiều người trực tuyến trong kỷ nguyên số, nhu cầu xác định quyền hạn và vai trò để đảm bảo an toàn và quản lý truy cập vào ứng dụng cũng như hệ thống ngày càng tăng. Kiểm soát truy cập dựa trên vai trò là một mô hình ủy quyền dùng để kiểm soát truy cập vào tài nguyên dựa trên các vai trò được xác định trước của người dùng.
Với mô hình RBAC của MongoDB, hành động được biểu diễn dưới dạng vai trò và được gán cho đúng người dùng. Ví dụ, thay vì gán nhiều quyền riêng lẻ, bạn có thể gán một vai trò duy nhất (ví dụ: dbAdmin), vốn tự động bao gồm tập quyền đã được xác định (ví dụ: quyền đọc trên các bộ sưu tập trong cơ sở dữ liệu). Mô hình này giúp việc quản lý quyền truy cập người dùng dễ dàng và có thể mở rộng.
Bật RBAC trong MongoDB
Với mô hình RBAC cốt lõi, truy cập bị từ chối theo mặc định, nghĩa là người dùng không thể truy cập tài nguyên nếu không có vai trò. Người dùng có thể được gán nhiều vai trò và mỗi vai trò có thể có một tập đặc quyền hoặc quyền hạn cụ thể để truy cập các khả năng nhất định.
Các khái niệm cốt lõi của RBAC
Dưới đây là một số khái niệm quan trọng bạn cần biết về RBAC:
Người dùng
Trong mô hình RBAC, người dùng là một thực thể được cấp một hoặc nhiều vai trò quyết định quyền truy cập của người đó vào tài nguyên và thao tác của cơ sở dữ liệu. Người dùng sẽ không có quyền truy cập hệ thống nếu không có gán vai trò. Để truy cập hệ thống, người dùng phải xác thực và phải được gán ít nhất một vai trò.
Vai trò
MongoDB cung cấp các vai trò và đặc quyền dựng sẵn cho cả triển khai tự quản lẫn MongoDB Atlas. Một số vai trò dựng sẵn phổ biến là read, readWrite và các vai trò dbAdmin/atlasAdmin. Các vai trò quản trị cơ sở dữ liệu có đặc quyền cao hơn so với các vai trò người dùng cơ sở dữ liệu khác, bao gồm cả đặc quyền quản lý đặc quyền của các vai trò khác.
Nếu các vai trò dựng sẵn không đáp ứng được tập đặc quyền mong muốn, MongoDB cung cấp các phương thức để tạo và chỉnh sửa vai trò do người dùng định nghĩa.
Một vai trò là một tập đặc quyền được gán cho người dùng.
Ví dụ, vai trò “read” có thể có đặc quyền chỉ đọc, vai trò “admin” có thể có đặc quyền đọc và ghi, trong khi vai trò “owner” có thể có đặc quyền đọc, ghi và xóa đối với một mục cụ thể (một cơ sở dữ liệu, một tài liệu, v.v.). Một vai trò cấp các đặc quyền để thực hiện các hành động đã chỉ định trên tài nguyên. Mỗi đặc quyền hoặc được chỉ định rõ ràng trong vai trò, hoặc kế thừa từ một vai trò khác, hoặc cả hai.
Vai trò do người dùng định nghĩa / Vai trò tùy chỉnh
MongoDB cung cấp một số vai trò dựng sẵn để quản trị viên sử dụng nhằm kiểm soát truy cập vào hệ thống MongoDB. Tuy nhiên, nếu các vai trò hiện có không mô tả được các đặc quyền cụ thể bạn muốn, bạn có thể định nghĩa và gán các vai trò mới cho người dùng trong một cơ sở dữ liệu — đó là vai trò tùy chỉnh. Ngoại trừ các vai trò tạo trong cơ sở dữ liệu admin, một vai trò chỉ có thể bao gồm các đặc quyền áp dụng cho chính cơ sở dữ liệu của nó và chỉ có thể kế thừa từ các vai trò khác trong cùng cơ sở dữ liệu đó.
Để tạo một vai trò mới, hãy dùng phương thức db.createRole(), chỉ định các đặc quyền trong mảng privileges và các vai trò kế thừa trong mảng roles.
MongoDB sử dụng kết hợp tên cơ sở dữ liệu và tên vai trò để xác định duy nhất một vai trò, và MongoDB lưu toàn bộ thông tin vai trò trong bộ sưu tập admin.system.roles thuộc cơ sở dữ liệu admin.
Ví dụ: Ví dụ này tạo một vai trò tùy chỉnh (sales_attendant) chỉ được phép chèn tài liệu vào bộ sưu tập sales trong cơ sở dữ liệu sales_db.
Các vai trò dựng sẵn là những vai trò được tạo sẵn và gán cho người dùng, cho phép họ thực hiện các thao tác như đọc và ghi trên các bộ sưu tập trong một cơ sở dữ liệu. Ví dụ về vai trò dựng sẵn gồm read, write, readWrite, dbAdmin và readAnyDatabase.
read và readWrite (truy cập cấp cơ sở dữ liệu): Các vai trò này lần lượt cấp quyền thực hiện các thao tác chỉ đọc hoặc đọc/ghi trên tất cả các bộ sưu tập không thuộc hệ thống trong một cơ sở dữ liệu được chỉ định.
dbAdmin: Vai trò này cấp quyền quản trị cần thiết để quản lý một cơ sở dữ liệu cụ thể, như tạo, xóa và chỉnh sửa chỉ mục và bộ sưu tập. Phù hợp cho các đội ngũ phát triển hoặc các script bảo trì cơ sở dữ liệu.
clusterAdmin (truy cập vận hành): Đây là vai trò có đặc quyền cao, chủ yếu dành cho nhân sự vận hành (DevOps/Ops). Vai trò này cấp các quyền cần thiết để quản lý toàn bộ triển khai MongoDB, bao gồm tạo bản sao lưu định kỳ, cấu hình replica set và sharding.
Đặc quyền (quyền hạn)
Đặc quyền là tập các hành động (ví dụ: find, insert) được phép trên một khả năng.
Ví dụ, nếu khả năng là “thông báo cho khách hàng về số dư hiện tại của họ”, thì đặc quyền của người dùng (giả sử là giao dịch viên ngân hàng) có thể là chỉ đọc. Nếu khả năng là tăng hạn mức giao dịch của một tài khoản ngân hàng, đặc quyền có thể là đọc và ghi.
Đặc quyền kế thừa
Một vai trò có thể bao gồm một hoặc nhiều vai trò hiện có (bao gồm tất cả đặc quyền của chúng). Ví dụ, vai trò dbAdmin có thể bao gồm các vai trò read, write và update (có thể là các vai trò riêng lẻ) đi kèm với đặc quyền của chúng.
Tài nguyên
Tài nguyên là một cơ sở dữ liệu, bộ sưu tập, tập hợp các bộ sưu tập, hoặc cụm (cluster).
Áp dụng Nguyên tắc Đặc quyền Tối thiểu
Trong bảo mật cơ sở dữ liệu hiện đại, Nguyên tắc Đặc quyền Tối thiểu (PoLP) là tối quan trọng. Nguyên tắc này nêu rằng mỗi người dùng chỉ nên được gán các quyền tối thiểu cần thiết để thực hiện các tác vụ bắt buộc của họ.
Ví dụ thực hành tốt: Thay vì dùng một người dùng readWrite toàn cục, hãy tạo người dùng theo từng ứng dụng. Chẳng hạn, nếu dịch vụ kiểm kê (inventory) của bạn chỉ tương tác với cơ sở dữ liệu app_data, thì người dùng của ứng dụng chỉ nên được cấp quyền readWrite cho đúng cơ sở dữ liệu đó. Việc phân tách này ngăn một dịch vụ bị xâm phạm truy cập trái phép vào các cơ sở dữ liệu khác (như billing hoặc users).
Ví dụ mã:
Tạo một người dùng theo nguyên tắc đặc quyền tối thiểu. Ví dụ này tạo một người dùng (branch_manager) với quyền đọc/ghi chỉ giới hạn trong cơ sở dữ liệu bank_data.
Tạo và gán các vai trò, chính sách được định nghĩa rõ ràng từ trước.
Tuân thủ nguyên tắc đặc quyền tối thiểu để đảm bảo tính bảo mật chặt chẽ.
Sử dụng các vai trò dựng sẵn khi có thể; định kỳ kiểm tra (audit) các vai trò đã gán để phát hiện bất thường.
Câu hỏi thường gặp
RBAC trong MongoDB là gì?⌄
Kiểm soát truy cập dựa trên vai trò là một biện pháp bảo mật dùng để quản lý quyền truy cập của người dùng.
Sự khác nhau giữa vai trò dựng sẵn và vai trò tùy chỉnh là gì?⌄
Vai trò dựng sẵn là vai trò được tạo sẵn và gán cho người dùng, cho phép họ thực hiện các thao tác như đọc và ghi trên các bộ sưu tập trong một cơ sở dữ liệu; còn vai trò tùy chỉnh là vai trò do người dùng định nghĩa, mô tả các đặc quyền cụ thể bạn mong muốn.
Vì sao Nguyên tắc Đặc quyền Tối thiểu quan trọng?⌄
Điều này quan trọng vì đảm bảo người dùng chỉ được gán các quyền tối thiểu cần thiết để thực hiện các tác vụ của họ.
Nếu bạn muốn một quản lý cửa hàng chỉ có thể đọc và ghi dữ liệu từ một cơ sở dữ liệu cụ thể, bạn sẽ gán loại vai trò nào?⌄
Afi vận động cho các nhà phát triển tại MongoDB với trọng tâm là Django và Python, hỗ trợ kỹ sư xây dựng cùng các công nghệ dữ liệu hiện đại thông qua hướng dẫn, bài nói chuyện và hoạt động cộng đồng. Là Microsoft MVP được công nhận cho Python và Web, cô phục vụ trong ban quản trị Django Software Foundation và là Trưởng ban Chương trình của DjangoCon US 2025. Afi cũng là Điều phối viên Khu vực của Black Python Devs, đồng thời là người đóng góp mã nguồn mở năng động và diễn giả quốc tế.
Khi ngày càng nhiều người trực tuyến trong kỷ nguyên số, nhu cầu xác định quyền hạn và vai trò để đảm bảo an toàn và quản lý truy cập vào ứng dụng cũng như hệ thống ngày càng tăng. Kiểm soát truy cập dựa trên vai trò là một mô hình ủy quyền dùng để kiểm soát truy cập vào tài nguyên dựa trên các vai trò được xác định trước của người dùng.
Với mô hình RBAC của MongoDB, hành động được biểu diễn dưới dạng vai trò và được gán cho đúng người dùng. Ví dụ, thay vì gán nhiều quyền riêng lẻ, bạn có thể gán một vai trò duy nhất (ví dụ: dbAdmin), vốn tự động bao gồm tập quyền đã được xác định (ví dụ: quyền đọc trên các bộ sưu tập trong cơ sở dữ liệu). Mô hình này giúp việc quản lý quyền truy cập người dùng dễ dàng và có thể mở rộng.
Bật RBAC trong MongoDB
Với mô hình RBAC cốt lõi, truy cập bị từ chối theo mặc định, nghĩa là người dùng không thể truy cập tài nguyên nếu không có vai trò. Người dùng có thể được gán nhiều vai trò và mỗi vai trò có thể có một tập đặc quyền hoặc quyền hạn cụ thể để truy cập các khả năng nhất định.
Các khái niệm cốt lõi của RBAC
Dưới đây là một số khái niệm quan trọng bạn cần biết về RBAC:
Người dùng
Trong mô hình RBAC, người dùng là một thực thể được cấp một hoặc nhiều vai trò quyết định quyền truy cập của người đó vào tài nguyên và thao tác của cơ sở dữ liệu. Người dùng sẽ không có quyền truy cập hệ thống nếu không có gán vai trò. Để truy cập hệ thống, người dùng phải xác thực và phải được gán ít nhất một vai trò.
Vai trò
MongoDB cung cấp các vai trò và đặc quyền dựng sẵn cho cả triển khai tự quản lẫn MongoDB Atlas. Một số vai trò dựng sẵn phổ biến là read, readWrite và các vai trò dbAdmin/atlasAdmin. Các vai trò quản trị cơ sở dữ liệu có đặc quyền cao hơn so với các vai trò người dùng cơ sở dữ liệu khác, bao gồm cả đặc quyền quản lý đặc quyền của các vai trò khác.
Nếu các vai trò dựng sẵn không đáp ứng được tập đặc quyền mong muốn, MongoDB cung cấp các phương thức để tạo và chỉnh sửa vai trò do người dùng định nghĩa.
Một vai trò là một tập đặc quyền được gán cho người dùng.
Ví dụ, vai trò “read” có thể có đặc quyền chỉ đọc, vai trò “admin” có thể có đặc quyền đọc và ghi, trong khi vai trò “owner” có thể có đặc quyền đọc, ghi và xóa đối với một mục cụ thể (một cơ sở dữ liệu, một tài liệu, v.v.). Một vai trò cấp các đặc quyền để thực hiện các hành động đã chỉ định trên tài nguyên. Mỗi đặc quyền hoặc được chỉ định rõ ràng trong vai trò, hoặc kế thừa từ một vai trò khác, hoặc cả hai.
Vai trò do người dùng định nghĩa / Vai trò tùy chỉnh
MongoDB cung cấp một số vai trò dựng sẵn để quản trị viên sử dụng nhằm kiểm soát truy cập vào hệ thống MongoDB. Tuy nhiên, nếu các vai trò hiện có không mô tả được các đặc quyền cụ thể bạn muốn, bạn có thể định nghĩa và gán các vai trò mới cho người dùng trong một cơ sở dữ liệu — đó là vai trò tùy chỉnh. Ngoại trừ các vai trò tạo trong cơ sở dữ liệu admin, một vai trò chỉ có thể bao gồm các đặc quyền áp dụng cho chính cơ sở dữ liệu của nó và chỉ có thể kế thừa từ các vai trò khác trong cùng cơ sở dữ liệu đó.
Để tạo một vai trò mới, hãy dùng phương thức
db.createRole(), chỉ định các đặc quyền trong mảng privileges và các vai trò kế thừa trong mảng roles.MongoDB sử dụng kết hợp tên cơ sở dữ liệu và tên vai trò để xác định duy nhất một vai trò, và MongoDB lưu toàn bộ thông tin vai trò trong bộ sưu tập
admin.system.rolesthuộc cơ sở dữ liệu admin.Ví dụ: Ví dụ này tạo một vai trò tùy chỉnh (sales_attendant) chỉ được phép chèn tài liệu vào bộ sưu tập sales trong cơ sở dữ liệu sales_db.
Các vai trò dựng sẵn
Các vai trò dựng sẵn là những vai trò được tạo sẵn và gán cho người dùng, cho phép họ thực hiện các thao tác như đọc và ghi trên các bộ sưu tập trong một cơ sở dữ liệu. Ví dụ về vai trò dựng sẵn gồm read, write, readWrite, dbAdmin và readAnyDatabase.
Đặc quyền (quyền hạn)
Đặc quyền là tập các hành động (ví dụ: find, insert) được phép trên một khả năng.
Ví dụ, nếu khả năng là “thông báo cho khách hàng về số dư hiện tại của họ”, thì đặc quyền của người dùng (giả sử là giao dịch viên ngân hàng) có thể là chỉ đọc. Nếu khả năng là tăng hạn mức giao dịch của một tài khoản ngân hàng, đặc quyền có thể là đọc và ghi.
Đặc quyền kế thừa
Một vai trò có thể bao gồm một hoặc nhiều vai trò hiện có (bao gồm tất cả đặc quyền của chúng). Ví dụ, vai trò
dbAdmincó thể bao gồm các vai trò read, write và update (có thể là các vai trò riêng lẻ) đi kèm với đặc quyền của chúng.Tài nguyên
Tài nguyên là một cơ sở dữ liệu, bộ sưu tập, tập hợp các bộ sưu tập, hoặc cụm (cluster).
Áp dụng Nguyên tắc Đặc quyền Tối thiểu
Trong bảo mật cơ sở dữ liệu hiện đại, Nguyên tắc Đặc quyền Tối thiểu (PoLP) là tối quan trọng. Nguyên tắc này nêu rằng mỗi người dùng chỉ nên được gán các quyền tối thiểu cần thiết để thực hiện các tác vụ bắt buộc của họ.
Ví dụ thực hành tốt: Thay vì dùng một người dùng readWrite toàn cục, hãy tạo người dùng theo từng ứng dụng. Chẳng hạn, nếu dịch vụ kiểm kê (inventory) của bạn chỉ tương tác với cơ sở dữ liệu app_data, thì người dùng của ứng dụng chỉ nên được cấp quyền readWrite cho đúng cơ sở dữ liệu đó. Việc phân tách này ngăn một dịch vụ bị xâm phạm truy cập trái phép vào các cơ sở dữ liệu khác (như billing hoặc users).
Ví dụ mã:
Tạo một người dùng theo nguyên tắc đặc quyền tối thiểu. Ví dụ này tạo một người dùng (branch_manager) với quyền đọc/ghi chỉ giới hạn trong cơ sở dữ liệu bank_data.
Thực hành tốt