Tạo Kiểm soát Truy cập Dựa trên Vai trò trong MongoDB
MongoDB cung cấp quyền truy cập của người dùng thông qua các điều khiển dựa trên vai trò, bao gồm nhiều vai trò tích hợp có thể được gán cho người dùng. Hai điều khiển nổi tiếng nhất là vai trò đọc và đọc / ghi, tuy nhiên, đôi khi, chúng không chi tiết như chúng ta mong muốn.
Gần đây, tôi đã có cơ hội khám phá các vai trò do người dùng xác định được giới thiệu trong MongoDB phiên bản 2.6. Trong bài viết này, chúng ta sẽ xem xét các vai trò do người dùng MongoDB xác định và xác định một số vai trò tùy chỉnh mà bạn có thể thấy hữu ích.
-
Tạo vai trò trong MongoDB
Tạo vai trò do người dùng xác định trong MongoDB khá đơn giản. Bạn có thể sử dụng lệnh createRole để tạo một vai trò mới và cú pháp tạo vai trò chung như sau:
{ createRole: "<role name>", privileges: [{ resource: { <resource> }, actions: [ "<action>",] }, ], roles: [ { role: "<role>", db: "<database>" } | "<role>",], writeConcern: <write concern document> }
Trước khi chạy lệnh createRole, hãy đảm bảo rằng bạn chuyển sang cơ sở dữ liệu mà bạn muốn tạo vai trò trong đó vì chúng sẽ chỉ được xác định trong cơ sở dữ liệu trong mà chúng đã được tạo ra. Nếu bạn muốn tạo một vai trò cấp quyền truy cập vào nhiều hơn một cơ sở dữ liệu, thì vai trò đó sẽ cần được tạo trên cơ sở dữ liệu quản trị.
Hãy xem qua các thành phần chính của cú pháp vai trò tạo.
-
Đặc quyền của Vai trò
Tạo quyền cho vai trò do người dùng xác định bằng cách thêm đặc quyền và xác định các hành động và tài nguyên của bạn:
Tác vụ Đặc quyền
Hành động là một tập hợp các thao tác được nhóm lại với nhau, chẳng hạn như hành động chèn có thể thực hiện cả chèn và tạo. Các hành động cũng chi tiết như kiểm soát truy cập dựa trên vai trò của MongoDB. Tham số đặc quyền có thể được sử dụng để thêm vai trò vào các hành động mongo và một đặc quyền tạo thành các hành động cùng với tài nguyên mà nó áp dụng. Sử dụng phần sau để thêm các hành động tìm, chèn và cập nhật trên cơ sở dữ liệu “mydb”.
privileges: [ {resource: {db: "mydb", collection: "" }, actions: [ “find”,”insert”,”update” ] } ]
Tài nguyên Đặc quyền
Tài liệu tài nguyên chỉ định phạm vi áp dụng các hành động đặc quyền của bạn và có thể được đặt ở nhiều mức độ chi tiết khác nhau như sau:
a. Bộ sưu tập
Tài nguyên có thể được đặt thành tài nguyên:
{db: "<db-name>", collection: "<collection name>" }
để chỉ cấp các hành động cụ thể cho bộ sưu tập cụ thể đó.b. Cơ sở dữ liệu
Tài nguyên có thể được đặt thành một cơ sở dữ liệu cụ thể bằng cách để trống tham số bộ sưu tập. Nguồn tài nguyên chuỗi tài nguyên:
{db: "<db-name>", collection: "<collection name>" }
đặt phạm vi cho toàn bộ cơ sở dữ liệu.c. Bộ sưu tập đơn trên các cơ sở dữ liệu
Tài nguyên có thể được đặt thành một bộ sưu tập cụ thể bằng cách sử dụng tài nguyên:
{db: ", collection: "<collection name>" }
để cấp quyền cho bộ sưu tập trên tất cả các cơ sở dữ liệu. Quyền này chỉ có thể được thêm vào một vai trò được tạo trên cơ sở dữ liệu quản trị.d. Nhiều bộ sưu tập trên các cơ sở dữ liệu
Tài nguyên có thể được đặt thành tất cả các bộ sưu tập (ngoại trừ bộ sưu tập hệ thống) trên tất cả các cơ sở dữ liệu bằng cách để lại cả thông số db và bộ sưu tập làm rỗng cái gì. resource:
{db: "", collection: "" }
. Tài nguyên này, giống như tài nguyên ở trên, chỉ có thể được cấp cho một vai trò được tạo trên cơ sở dữ liệu quản trị.e. Tài nguyên toàn cụm
Có thể chỉ định tài nguyên trên toàn cụm bằng cách sử dụng tài nguyên:
{ cluster : true }
. Tài nguyên toàn cụm này được sử dụng để chỉ định trạng thái của hệ thống, chẳng hạn như tắt replSetReconfig thay vì cấp quyền trên bất kỳ tài liệu cụ thể nào.f. Tất cả tài nguyên
Bạn không nên sử dụng phạm vi này cho bất kỳ điều gì khác ngoài những trường hợp đặc biệt.
{anyResource: true }
có thể được sử dụng để đặt phạm vi được đặt thành tất cả tài nguyên. -
Vai trò
Vai trò có sẵn cũng có thể được thêm vào vai trò tùy chỉnh. Khi một vai trò có sẵn được thêm vào bằng cách sử dụng tham số role:[], nó sẽ thêm các quyền của vai trò có sẵn vào vai trò tùy chỉnh.
Dưới đây là ví dụ về thông số vai trò:
roles: [{ role: "read", db: "&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;db name&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;"}]
Trong ví dụ này, vai trò tùy chỉnh sẽ kế thừa tất cả các quyền của vai trò “đọc” trên cơ sở dữ liệu đã xác định. Nếu một vai trò được kế thừa trên cơ sở dữ liệu db1, thì vai trò tùy chỉnh có thể được tạo trên cơ sở dữ liệu db1 hoặc trên cơ sở dữ liệu quản trị.
Viết Quan ngại
Ghi mối quan tâm xác định mức độ xác nhận được yêu cầu từ MongoDB và có thể được sử dụng để kiểm soát việc ghi xác nhận từ cơ sở dữ liệu. Lưu ý rằng bạn không cần quan tâm đến việc viết khi tạo một vai trò. Viết mối quan tâm có thể bao gồm các trường w, j và wtimeout:
W - Viết Quan ngại
Trường W có thể được sử dụng để cho biết số lượng bản ghi đã được truyền sang.
J - Viết Quan ngại
Trường J có thể được đặt để xác định xem bài viết có được viết vào tạp chí hay không.
Wtimeout - Viết Quan ngại
Tùy chọn này được sử dụng để đặt thời gian mà bài viết phải đạt được sự quan tâm của việc viết. Mối quan tâm ghi có thể vẫn đạt được sau khi lỗi được ném ra. Nếu Wtimeout chưa được thiết lập và không thể đạt được mối quan tâm ghi, việc ghi sẽ bị chặn vô thời hạn.
-
Chỉ định vai trò
Vai trò tùy chỉnh là db cụ thể và chỉ có thể được gán cho một người dùng trong cùng một cơ sở dữ liệu.
Giả sử chúng tôi đã tạo một vai trò “myrole” trên cơ sở dữ liệu “db1”. Chúng tôi có thể tạo người dùng trên cơ sở dữ liệu bằng các lệnh sau:
Use db1 db.createUser({"user" : "&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;user&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;",pwd: "&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;password&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;","roles" : [{"role" : "myrole", "db" : "db1"}]})
Để biết thêm thông tin về quản lý người dùng, hãy tham khảo bài đăng này của Dharshan về quản lý người dùng trong MongoDB.
-
Vai trò Người dùng Tùy chỉnh
Hãy xem qua một số vai trò tùy chỉnh có thể hữu ích.
Một DB - Quyền Đọc, Chèn &Cập nhật
Các vai trò có sẵn đọc và đọc Viết đôi khi có thể cảm thấy có quá nhiều quyền hoặc quá ít. Hãy xem cách chúng tôi có thể tạo vai trò tùy chỉnh chỉ cấp quyền đọc, chèn và ghi.
Chúng tôi đã biết rằng chúng tôi cần tất cả các quyền đọc để chúng tôi có thể thêm vai trò có sẵn “đọc” vào vai trò tùy chỉnh của mình. Chúng tôi cũng cần các quyền để tạo và cập nhật tài liệu, và những quyền này có thể được bao gồm bằng cách thêm chèn và cập nhật các hành động đặc quyền. Nếu chúng tôi muốn cung cấp cho người dùng khả năng tạo chỉ mục và tạo bộ sưu tập, chúng tôi có thể thêm hành động đặc quyền createIndex và createCollection.
Đối với phạm vi, giả sử tôi có một db tên là “db1” mà tôi đặt các quyền ở trên. Lệnh tạo sẽ giống như sau:
Use db1. db.createRole( { createRole: "&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;role-name&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;", privileges: [ { resource: { db: "db1", collection: "" }, actions: [ "insert","update","createIndex", "createCollection" ] } ], roles: [{ role: "read", db: "db1"}] })
Lệnh trên sẽ tạo một vai trò với
<role-name>
trong cơ sở dữ liệu db1. Người dùng được cấp quyền bởi vai trò trên sẽ không có hành động đặc quyền "xóa". Ngoài ra, lưu ý rằng không thể chạy đầy đủ các phương thức db.collection.findAndModify (), db.collection.mapReduce () và db.collection.aggregate () vì chúng yêu cầu đặc quyền xóa.Tất cả các quyền của DB - Quyền Đọc, Chèn &Cập nhật
Chúng tôi có thể tạo một vai trò trên cơ sở dữ liệu quản trị tương tự như vai trò ở trên, để cấp các đặc quyền Đọc, Tạo và Cập nhật trên tất cả các DB. Vai trò này phải được tạo trên Cơ sở dữ liệu quản trị và người dùng tiếp theo cũng phải được tạo trên Cơ sở dữ liệu quản trị viên.
Đối với vai trò này, thay vì sử dụng vai trò đọc tiêu chuẩn, chúng ta có thể kế thừa quyền từ vai trò readAnyDatabase. Vai trò được tạo sẽ trông giống như sau:
Use admin. db.createRole( { createRole: "&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;role-name&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;", privileges: [ { resource: { db: "", collection: "" }, actions: [ "insert","update","createIndex", "createCollection" ] } ], roles: [{ role: "readAnyDatabase", db: "admin"}] })
Vai trò của người viết với mối quan tâm của người viết
Nếu bạn gặp tình huống cần thực thi mối quan tâm về viết, đây là cách bạn có thể thêm nó vào một vai trò. Thêm mối quan tâm ghi vào một vai trò sẽ thực thi nó trên tất cả những người dùng được cấp dưới vai trò này trên DB. Hãy xác định một vai trò với mối quan tâm viết mà thực thi đa số viết:
Use admin. db.createRole( { createRole: "&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;role-name&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;", privileges: [ ], roles: [{ role: "readWriteAnyDatabase", db: "admin"}], writeConcern: { w: “majority”, j: false, wtimeout: 300 } })