MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Cách quản lý người dùng và xác thực trong MongoDB


Giới thiệu

Quản lý người dùng và xác thực là một số nhiệm vụ quản trị quan trọng nhất của việc quản lý máy chủ MongoDB. Bạn phải đảm bảo rằng máy chủ được định cấu hình để có thể xác định đúng người dùng và ứng dụng của bạn và từ chối các kết nối hoặc hoạt động không thể xác thực chính xác.

Để quản lý các yêu cầu này, bạn phải có thể quyết định người dùng nào mà máy chủ của bạn yêu cầu và tạo các tài khoản đó. Là một phần của quá trình này, bạn có thể đặt chi tiết xác thực để cho phép truy cập bên ngoài bằng cách sử dụng danh tính mới.

Trong hướng dẫn này, chúng tôi sẽ hướng dẫn cách tạo, xem và xóa tài khoản người dùng. Chúng tôi sẽ xem xét cách thiết lập xác thực cho tài khoản của bạn và cách cập nhật thông tin đăng nhập khi bạn cần thay đổi mật khẩu người dùng của mình.



Điều kiện tiên quyết

Để làm theo hướng dẫn này, bạn cần có tài khoản trên máy chủ MongoDB với các đặc quyền thích hợp.


Các lệnh và phương thức chúng tôi sẽ sử dụng

Để tạo, sửa đổi và xóa người dùng trong MongoDB và định cấu hình xác thực, các phương pháp cốt lõi bạn cần là:

  • db.createUser :tạo tài khoản người dùng MongoDB mới
  • db.updateUser :cập nhật thông tin chi tiết của tài khoản người dùng
  • db.changeUserPassword :thay đổi mật khẩu được sử dụng bởi tài khoản người dùng
  • db.dropUser :xóa tài khoản người dùng MongoDB

Ngoài ra, lệnh cơ sở dữ liệu sau rất hữu ích để tìm kiếm thông tin về người dùng trên hệ thống:

  • db.runCommand('usersInfo') :hiển thị thông tin về một hoặc nhiều tài khoản người dùng MongoDB


Đặc quyền bắt buộc

Để thực hiện các lệnh trên, bạn cần đăng nhập vào MongoDB bằng tài khoản với một số hành động đặc quyền khác nhau. Các đặc quyền cụ thể mà bạn yêu cầu phụ thuộc vào các lệnh bạn cần sử dụng.

Để nhận thông tin về những người dùng khác, người dùng hiện tại của bạn phải bật tác vụ đặc quyền sau:

  • viewUser hành động đặc quyền

Để tạo người dùng mới, người dùng hiện tại của bạn phải bật các tác vụ đặc quyền sau:

  • createUser hành động đặc quyền
  • grantRole hành động đặc quyền

Để thay đổi mật khẩu hoặc chi tiết tài khoản của người dùng, bạn có thể cần các đặc quyền sau:

  • changeOwnPassword hành động đặc quyền để thay đổi mật khẩu tài khoản của riêng bạn
  • changeOwnCustomData hành động đặc quyền để thay đổi dữ liệu tùy chỉnh trong tài khoản của bạn
  • changePassword hành động đặc quyền để thay đổi mật khẩu của người dùng khác
  • changeCustomData hành động đặc quyền để thay đổi dữ liệu tùy chỉnh của người dùng khác

Chúng tôi sẽ không đề cập đến quản lý vai trò trong hướng dẫn này, vì vậy grantRolerevokeRole các hành động đặc quyền là không bắt buộc.

Để xóa tài khoản người dùng, người dùng hiện tại của bạn phải bật tác vụ đặc quyền sau:

  • dropUser hành động đặc quyền



Hiểu cách MongoDB triển khai người dùng và xác thực

Trước khi chúng tôi bắt đầu tạo và quản lý tài khoản, sẽ hữu ích nếu bạn dành chút thời gian để làm quen với cách MongoDB xác định và lưu trữ thông tin này.

Trong MongoDB, tài khoản người dùng là sự kết hợp của tên người dùng tài khoản cùng với cơ sở dữ liệu xác thực cụ thể. Cơ sở dữ liệu xác thực chỉ đơn giản là cơ sở dữ liệu nơi người dùng được xác định và không ngụ ý giới hạn về phạm vi hoặc quyền. Cơ sở dữ liệu xác thực là cơ sở dữ liệu thông thường được sử dụng để quản lý các dữ liệu khác và không phải là cơ sở dữ liệu chuyên dụng, đặc biệt.

Tên tài khoản người dùng phải là duy nhất trong cơ sở dữ liệu xác thực của nó. Tuy nhiên, cùng một tên người dùng có thể được sử dụng lại với một cơ sở dữ liệu xác thực khác để tạo một tài khoản người dùng mới, riêng biệt.

Kết quả của thiết kế này, một tài khoản chỉ có thể được xác định chính xác bằng cách bao gồm tên người dùng và cơ sở dữ liệu xác thực. Để xác thực tài khoản, một người cũng cần có khả năng cung cấp thông tin đăng nhập được liên kết với tài khoản. Đây thường là mật khẩu nhưng cũng có thể là chứng chỉ.



Bạn tạo người dùng bằng cách nào?

Bây giờ chúng ta đã xem xét cách MongoDB khái niệm hóa tài khoản người dùng, chúng ta có thể thảo luận về cách tạo người dùng mới. Hãy nhớ đăng nhập vào máy chủ MongoDB của bạn bằng người dùng có các đặc quyền thích hợp để theo dõi cùng.

Để tạo người dùng mới, trước tiên bạn phải chuyển sang cơ sở dữ liệu bạn muốn sử dụng làm cơ sở dữ liệu xác thực của người dùng mới.

Đầu tiên, bạn có thể nhận được danh sách các cơ sở dữ liệu đã được định cấu hình trên hệ thống của mình bằng cách nhập:

show dbs
admin   0.000GBconfig  0.000GBlocal   0.000GB

Chuyển sang cơ sở dữ liệu mà người dùng sẽ được liên kết bằng cách sử dụng use lệnh:

use admin
switched to db admin

Để tạo người dùng mới, bạn có thể sử dụng db.createUser() hoặc bạn có thể sử dụng createUser lệnh cơ sở dữ liệu. Dù bằng cách nào, bạn sẽ cần phải chuyển tên người dùng (user trường), mật khẩu (pwd trường) và một loạt các vai trò mà người dùng nên được thêm vào (các roles key) trong một user đối tượng.

Để tạo người dùng mới có tên tom với mật khẩu được đặt thành hellothere với một mảng vai trò trống bằng cách sử dụng db.createUser() , bạn có thể nhập:

db.createUser({    user: "tom",    pwd: "hellothere",    roles: []})
Successfully added user: { "user" : "tom", "roles" : [ ] }

Thao tác tương tự khi sử dụng createUser lệnh cơ sở dữ liệu sẽ giống như sau:

db.runCommand({    createUser: "tom",    pwd: "hellothere",    roles: []})
Successfully added user: { "user" : "tom", "roles" : [ ] }

Hai tùy chọn khác nhau rất giống nhau, vì vậy chúng tôi sẽ chỉ hiển thị các phương thức cơ sở dữ liệu nếu có thể áp dụng trong tương lai. Tuy nhiên, nếu bạn thích cú pháp lệnh cơ sở dữ liệu hơn, bạn có thể tìm thấy từng lệnh liên quan trong tài liệu tham khảo lệnh MongoDB.

Trong các lệnh trên, chúng tôi đã xác định rõ ràng mật khẩu nội dòng trong user vật. Để ngăn mật khẩu được ghi lại và có thể truy xuất được, bạn có thể sử dụng passwordPrompt(). trong user tài liệu để có MongoDB tương tác nhắc bạn nhập mật khẩu khi lệnh được chạy. Mật khẩu sẽ không hiển thị, vì vậy lịch sử lệnh của bạn sẽ sạch:

db.createUser({    user: "tom",    pwd: passwordPrompt(),    roles: []})
Enter password:Successfully added user: { "user" : "tom", "roles" : [ ] }

Hãy nhớ rằng mật khẩu sẽ vẫn được gửi đến máy chủ ở dạng văn bản thuần túy nếu bạn chưa bật TLS / SSL.



Làm cách nào để hiển thị những người dùng hiện tại?

Tiếp theo, hãy xem cách tìm thông tin về những người dùng hiện có.

Để trả lại nhiều người dùng, bạn có thể sử dụng db.getUsers() để hiển thị tất cả người dùng trong cơ sở dữ liệu hiện tại. Trước tiên, hãy chuyển sang cơ sở dữ liệu mà bạn muốn truy vấn:

use admin

Tiếp theo, sử dụng db.getUsers() để trả về tất cả người dùng được liên kết với cơ sở dữ liệu hiện tại:

db.getUsers()
[    {            "_id" : "admin.root",            "userId" : UUID("f5ded238-19c9-4886-b649-711ec36993cb"),            "user" : "root",            "db" : "admin",            "roles" : [                    {                            "role" : "root",                            "db" : "admin"                    }            ],            "mechanisms" : [                    "SCRAM-SHA-1",                    "SCRAM-SHA-256"            ]    },    {            "_id" : "admin.tom",            "userId" : UUID("e7a0abde-a9f9-412a-bfd5-eb11fda41fd3"),            "user" : "tom",            "db" : "admin",            "roles" : [ ],            "mechanisms" : [                    "SCRAM-SHA-1",                    "SCRAM-SHA-256"            ]    }]

Để hiển thị thêm thông tin xác thực của từng người dùng, hãy chuyển một đối tượng vào phương thức với showCredentials chìa khóa thành true :

use admindb.getUsers({    showCredentials: true})
[        {                "_id" : "admin.root",                . . .                "credentials" : {                        "SCRAM-SHA-1" : {                                "iterationCount" : 10000,                                "salt" : "WpB0H4f7dG8XlCDyaVzarA==",                                "storedKey" : "b11nA1+mGo3+Tr8P//u3NEdJLHk=",                                "serverKey" : "3xE8o663hjqySrMCQcXjSxmjmhk="                        },                        "SCRAM-SHA-256" : {                                "iterationCount" : 15000,                                "salt" : "UtsfNRedf2ek5tbWFoGs2g52U0H7Na44wV4rYA==",                                "storedKey" : "mz9/qHnI79pNAIQm0MZTKZ0U3qFk0xhUDd2grvKtMdI=",                                "serverKey" : "c/sA4j+I/29Ea1y07zxoMcBgHFoYTUAa6luX3Z9sToQ="                        }                },                . . .        },        {                "_id" : "admin.tom",                . . .                "credentials" : {                        "SCRAM-SHA-1" : {                                "iterationCount" : 10000,                                "salt" : "qCbxWQSGt3QoN3S1aM5AEg==",                                "storedKey" : "hypim5+m2wqbS1gc47o2itc7jew=",                                "serverKey" : "h9myNoSvY2015yqvw3UldmJzZCg="                        },                        "SCRAM-SHA-256" : {                                "iterationCount" : 15000,                                "salt" : "lNtIVL79J8FF+uPaFfRMwPK079gfLEUrsQe3Qg==",                                "storedKey" : "u8pgn3OJiZxIwEL7ryZkoAF5bnMefQEEsZDTXNDCTRY=",                                "serverKey" : "BmmfVeikSA0DN1aZmyZP9NXi5owxGr1ZRmVX2XH8qVg="                        }                },                . . .        }]

Để truy vấn người dùng phù hợp với tiêu chí nhất định, bạn có thể chuyển một đối tượng xác định filter khóa xác định điều kiện phù hợp.

Ví dụ:để lấy thông tin về tất cả người dùng trong cơ sở dữ liệu hiện tại có root vai trò, bạn có thể nhập:

use admindb.getUsers({    filter: {        "roles.role": "root"    }})
[        {                "_id" : "admin.root",                "userId" : UUID("f5ded238-19c9-4886-b649-711ec36993cb"),                "user" : "root",                "db" : "admin",                "roles" : [                        {                                "role" : "root",                                "db" : "admin"                        }                ],                "mechanisms" : [                        "SCRAM-SHA-1",                        "SCRAM-SHA-256"                ]        }]

Để có được một người dùng cụ thể, bạn có thể sử dụng db.getUser() thay vào đó. Điều này hoạt động giống như db.getUsers() nhưng trả về một người dùng duy nhất. Thay vì truyền một đối tượng cho phương thức, bạn chuyển một chuỗi chứa tên người dùng mà bạn muốn truy xuất:

use admindb.getUser("tom")
{        "_id" : "admin.tom",        "userId" : UUID("e7a0abde-a9f9-412a-bfd5-eb11fda41fd3"),        "user" : "tom",        "db" : "admin",        "roles" : [ ],        "mechanisms" : [                "SCRAM-SHA-1",                "SCRAM-SHA-256"        ]}

Bạn có thể tùy chọn bao gồm một args bổ sung đối tượng cho phép bạn chỉ định thông tin bổ sung mà bạn muốn bằng cách đặt các khóa sau thành true :

  • showCredentials :hiển thị thông tin xác thực ngoài đầu ra thông thường
  • showPrivileges :hiển thị thông tin đặc quyền ngoài đầu ra thông thường
  • showAuthenticationRestrictions :hiển thị các hạn chế xác thực đối với tài khoản ngoài đầu ra thông thường

Ví dụ:bạn có thể yêu cầu MongoDB cung cấp cho bạn tất cả thông tin trên bằng cách nhập:

use admindb.getUser("tom",{    showCredentials: true,    showPrivileges: true,    showAuthenticationRestrictions: true})
{        "_id" : "admin.tom",        "userId" : UUID("e7a0abde-a9f9-412a-bfd5-eb11fda41fd3"),        "user" : "tom",        "db" : "admin",        "mechanisms" : [                "SCRAM-SHA-1",                "SCRAM-SHA-256"        ],        "credentials" : {                "SCRAM-SHA-1" : {                        "iterationCount" : 10000,                        "salt" : "qCbxWQSGt3QoN3S1aM5AEg==",                        "storedKey" : "hypim5+m2wqbS1gc47o2itc7jew=",                        "serverKey" : "h9myNoSvY2015yqvw3UldmJzZCg="                },                "SCRAM-SHA-256" : {                        "iterationCount" : 15000,                        "salt" : "lNtIVL79J8FF+uPaFfRMwPK079gfLEUrsQe3Qg==",                        "storedKey" : "u8pgn3OJiZxIwEL7ryZkoAF5bnMefQEEsZDTXNDCTRY=",                        "serverKey" : "BmmfVeikSA0DN1aZmyZP9NXi5owxGr1ZRmVX2XH8qVg="                }        },        "roles" : [ ],        "inheritedRoles" : [ ],        "inheritedPrivileges" : [ ],        "inheritedAuthenticationRestrictions" : [ ],        "authenticationRestrictions" : [ ]}


Làm cách nào để thay đổi mật khẩu cho người dùng MongoDB?

Để thay đổi mật khẩu của người dùng, bạn có thể sử dụng db.changeUserPassword() phương pháp. Một lần nữa, bạn phải chuyển sang cơ sở dữ liệu xác thực của người dùng trước khi thực hiện lệnh.

db.changeUserPassword() phương thức có hai đối số:tên người dùng của tài khoản bạn muốn thay đổi và mật khẩu mới cho tài khoản.

Ví dụ:để thay đổi mật khẩu cho người dùng tom được xác thực với admin cơ sở dữ liệu tới secretpassword , bạn có thể nhập:

use admindb.changeUserPassword("tom", "secretpassword")

Cũng như với db.createUser() , bạn có thể sử dụng passwordPrompt() phương thức cho đối số thứ hai thay vì cung cấp mật khẩu nội dòng. MongoDB sẽ nhắc bạn nhập mật khẩu khi lệnh được thực thi:

use admindb.changeUserPassword("tom", passwordPrompt())
Enter password:


Bạn làm cách nào để thay đổi các chi tiết tài khoản người dùng khác?

Để thay đổi thông tin khác được liên kết với tài khoản người dùng, bạn có thể sử dụng db.updateUser() phương pháp. Đảm bảo rằng bạn chuyển sang cơ sở dữ liệu xác thực của người dùng trước khi cập nhật thông tin chi tiết của họ.

db.updateUser() phương thức yêu cầu bạn chỉ định tên người dùng và sau đó cung cấp một đối tượng chứa dữ liệu bạn muốn cập nhật. Bất kỳ trường nào bạn chọn cập nhật sẽ được thay thế hoàn toàn bằng thông tin mới, vì vậy hãy đảm bảo bao gồm dữ liệu gốc cũng như dữ liệu mới trong đối tượng của bạn nếu bạn chỉ hy vọng thêm thông tin mới.

Đối tượng mà bạn đưa vào lệnh với thông tin thay đổi có thể chứa nhiều trường khác nhau. Hãy xem qua chúng:

  • customData :Mọi dữ liệu tùy ý được liên kết với tài khoản người dùng.
  • roles :Các vai trò mà người dùng được cấp. Thường thì tốt hơn là sử dụng db.grantRolesToUser()db.revokeRolesFromUser() các phương pháp kiểm soát tư cách thành viên của vai trò thay vì cập nhật bằng khóa này vì bạn có thể thêm và xóa các vai trò riêng lẻ.
  • pwd :Mật khẩu của người dùng. Sử dụng db.ChangeUserPassword() thường dễ dàng hơn nếu đó là trường duy nhất cần được cập nhật.
  • authenticationRestrictions :Chỉ định các hạn chế cho tài khoản có thể giới hạn địa chỉ IP mà người dùng có thể kết nối từ hoặc đến. Giá trị của khóa này là một đối tượng hoặc mảng xác định clientSource và hoặc serverAddress , chứa các mảng chỉ định các địa chỉ hoặc dải IP hợp lệ. Tìm hiểu thêm trong tài liệu MongoDB về các hạn chế xác thực.
  • mechanisms :Các cơ chế xác thực cụ thể được sử dụng cho thông tin xác thực. Có thể được đặt thành một hoặc cả hai SCRAM-SHA-1 hoặc SCRAM-SHA-256 nhưng chỉ có thể được thay đổi thành một tập hợp con của các cơ chế hiện tại nếu mật khẩu mới hiện không được cung cấp.
  • passwordDigestor :Chỉ định thành phần nào xử lý mật khẩu của người dùng. Có thể là server (mặc định) hoặc client .

Ví dụ:chúng tôi có thể cập nhật tom tài khoản xác thực với admin cơ sở dữ liệu để chỉ có thể đăng nhập từ cùng một máy tính lưu trữ chính máy chủ đó bằng cách thay đổi authenticationRestrictions lĩnh vực:

use admindb.updateUser("tom", {    authenticationRestrictions: [ {        clientSource: ["127.0.0.1", "::1"],        serverAddress: ["127.0.0.1", "::1"]    } ]})

Bây giờ, nếu bạn yêu cầu MongoDB hiển thị cho bạn thông tin liên quan về người dùng, nó sẽ hiển thị các hạn chế bổ sung cho tài khoản:

use admindb.getUser("tom", {    showAuthenticationRestrictions: true})
{        "_id" : "admin.tom",        "userId" : UUID("e7a0abde-a9f9-412a-bfd5-eb11fda41fd3"),        "user" : "tom",        "db" : "admin",        "mechanisms" : [                "SCRAM-SHA-1",                "SCRAM-SHA-256"        ],        "roles" : [ ],        "authenticationRestrictions" : [                {                        "clientSource" : [                                "127.0.0.1",                                "::1"                        ],                        "serverAddress" : [                                "127.0.0.1",                                "::1"                        ]                }        ],        "inheritedRoles" : [ ],        "inheritedPrivileges" : [ ],        "inheritedAuthenticationRestrictions" : [ ]}

Để thu hồi những hạn chế đó, chúng ta có thể chạy lại lệnh với một mảng trống:

use admindb.changeUser("tom", {    authenticationRestrictions: []})


Làm cách nào để xóa người dùng MongoDB?

Để xóa tài khoản người dùng MongoDB, bạn có thể sử dụng db.dropUser() phương pháp. Đảm bảo kết nối với cơ sở dữ liệu xác thực của người dùng trước khi xóa chúng.

Để thực thi db.dropUser() , bạn cần cung cấp tên của người dùng bạn muốn xóa:

db.dropUser("tom")

Sau khi xóa thành công, MongoDB sẽ trả về true :

true

Nếu tài khoản không tồn tại trong cơ sở dữ liệu hiện tại, nó sẽ trả về false .



Kết luận

Cấu hình xác thực và quản lý người dùng của MongoDB cho phép bạn kiểm soát ai có thể kết nối với máy chủ của bạn và thuộc tính người dùng của họ là gì. Trong bài viết sau, chúng tôi sẽ trình bày cách hạn chế cấp độ truy cập mà người dùng có bằng cách giải quyết phần ủy quyền của quản lý người dùng.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Tìm đối tượng giữa hai ngày MongoDB

  2. MongoDB $ hàng tuầnUpdate # 65 (ngày 15 tháng 4 năm 2022):GDELT, Mongoose và Giờ Hackathon!

  3. Giúp xác định một công cụ GUI MongoDB tuyệt vời

  4. Cách sắp xếp hoạt động trong phần mở rộng mongodb PECL mới?

  5. mongodb, bản sao và lỗi:{$ err:not master and slaveOk =false, code:13435}