Cách bảo mật MongoDB bằng tên người dùng và mật khẩu


376

Tôi muốn thiết lập xác thực tên người dùng và mật khẩu cho phiên bản MongoDB của mình, để mọi truy cập từ xa sẽ hỏi tên người dùng và mật khẩu. Tôi đã thử hướng dẫn từ trang MongoDB và đã làm như sau:

use admin
db.addUser('theadmin', '12345');
db.auth('theadmin','12345');

Sau đó, tôi thoát ra và chạy lại mongo. Và tôi không cần mật khẩu để truy cập nó. Ngay cả khi tôi kết nối với cơ sở dữ liệu từ xa, tôi không được nhắc nhập tên người dùng và mật khẩu.


CẬP NHẬT Đây là giải pháp tôi đã sử dụng

1) At the mongo command line, set the administrator:

    use admin;
    db.addUser('admin','123456');

2) Shutdown the server and exit

    db.shutdownServer();
    exit

3) Restart mongod with --auth

  $ sudo ./mongodb/bin/mongod --auth --dbpath /mnt/db/

4) Run mongo again in 2 ways:

   i) run mongo first then login:

        $ ./mongodb/bin/mongo localhost:27017
        use admin
        db.auth('admin','123456');

  ii) run & login to mongo in command line.

        $ ./mongodb/bin/mongo localhost:27017/admin -u admin -p 123456

Tên người dùng và mật khẩu sẽ hoạt động theo cùng một cách cho mongodumpmongoexport.


4
cái này cho MongDB phiên bản 2.2.x
Tom Imrei

22
Trong Mongo 3.0.4, lệnh tạo người dùng là db.createUser () .
chronologos

4
Vui lòng làm theo cách này để tạo người dùng quản trị trên Mongodb 3.0 docs.mongodb.org/v3.0/tutorial/add-user-ad Administrator
Sul Aga

3
Bản cập nhật cho MongoDB 3.0+: Cách thiết lập xác thực trong MongoDB 3.0 .
Dan Dascalescu

1
Để rõ ràng, điều này không mã hóa các byte đi qua dây. Nó chỉ dành cho kiểm soát truy cập.
Daniel F

Câu trả lời:


117

Bạn cần bắt đầu mongodvới --authtùy chọn sau khi thiết lập người dùng.

Từ trang MongoDB:

Chạy cơ sở dữ liệu (quá trình mongod) với --authtùy chọn kích hoạt bảo mật. Bạn phải thêm người dùng vào db quản trị viên trước khi khởi động máy chủ --authhoặc thêm người dùng đầu tiên từ giao diện localhost.

Xác thực MongoDB


1
Tôi đã thử điều đó và làm theo ví dụ. Bây giờ .. tôi có thể thiết lập nó sau khi tôi khởi động lại máy chủ bằng --auth. Tuy nhiên, khi tôi cố gắng đăng nhập (./mongo -u theadmin -p 12345) thì tôi thất bại. Tôi không thể đăng nhập.
murvinlai

Nếu sau đó bạn không thể kết nối, đó là vì bạn đang cố gắng kết nối trên admindb, hãy sử dụng một db khác và thử lại. Chỉ người dùngAdmin (AnyDatabase) có thể kết nối trên admin.
Vadorequest

80

Wow rất nhiều câu trả lời phức tạp / khó hiểu ở đây.

Điều này là của v3.4 .

Câu trả lời ngắn.

1) Khởi động MongoDB mà không cần kiểm soát truy cập.

mongod --dbpath /data/db

2) Kết nối với ví dụ.

mongo

3) Tạo người dùng.

use some_db
db.createUser(
  {
    user: "myNormalUser",
    pwd: "xyz123",
    roles: [ { role: "readWrite", db: "some_db" },
             { role: "read", db: "some_other_db" } ]
  }
)

4) Dừng phiên bản MongoDB và khởi động lại với điều khiển truy cập.

mongod --auth --dbpath /data/db

5) Kết nối và xác thực là người dùng.

use some_db
db.auth("myNormalUser", "xyz123")
db.foo.insert({x:1})
use some_other_db
db.foo.find({})

Câu trả lời dài: Đọc này nếu bạn muốn hiểu đúng.

Nó thực sự đơn giản. Tôi sẽ câm dưới đây https://docs.mongodb.com/manual/tutorial/enable-authentication/

Nếu bạn muốn tìm hiểu thêm về những vai trò thực sự đọc thêm tại đây: https://docs.mongodb.com/manual/reference/built-in-roles/

1) Khởi động MongoDB mà không cần kiểm soát truy cập.

mongod --dbpath /data/db

2) Kết nối với ví dụ.

mongo

3) Tạo quản trị viên người dùng. Sau đây tạo một quản trị viên người dùng trong admincơ sở dữ liệu xác thực. Người sử dụng là một dbOwnertrong những some_dbcơ sở dữ liệu và không qua admincơ sở dữ liệu, điều này rất quan trọng để nhớ.

use admin
db.createUser(
  {
    user: "myDbOwner",
    pwd: "abc123",
    roles: [ { role: "dbOwner", db: "some_db" } ]
  }
)

Hoặc nếu bạn muốn tạo một quản trị viên là quản trị viên trên bất kỳ cơ sở dữ liệu nào:

use admin
db.createUser(
  {
    user: "myUserAdmin",
    pwd: "abc123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

4) Dừng phiên bản MongoDB và khởi động lại với điều khiển truy cập.

mongod --auth --dbpath /data/db

5) Kết nối và xác thực là quản trị viên người dùng đối với admincơ sở dữ liệu xác thực, KHÔNG hướng tới some_dbcơ sở dữ liệu xác thực. Quản trị viên người dùng đã được tạo trong admincơ sở dữ liệu xác thực, người dùng không tồn tại trong some_dbcơ sở dữ liệu xác thực.

use admin
db.auth("myDbOwner", "abc123")

Bây giờ bạn được chứng thực là một dbOwnertrong những some_dbcơ sở dữ liệu. Vì vậy, bây giờ nếu bạn muốn đọc / ghi / làm công cụ trực tiếp tới some_dbcơ sở dữ liệu, bạn có thể thay đổi nó.

use some_db
//...do stuff like db.foo.insert({x:1})
// remember that the user administrator had dbOwner rights so the user may write/read, if you create a user with userAdmin they will not be able to read/write for example.

Thêm về vai trò: https://docs.mongodb.com/manual/reference/built-in-roles/

Nếu bạn muốn tạo thêm người dùng không phải là quản trị viên người dùng và những người dùng bình thường tiếp tục đọc bên dưới.

6) Tạo một người dùng bình thường. Người dùng này sẽ được tạo trong some_dbcơ sở dữ liệu xác thực bên dưới.

use some_db
db.createUser(
  {
    user: "myNormalUser",
    pwd: "xyz123",
    roles: [ { role: "readWrite", db: "some_db" },
             { role: "read", db: "some_other_db" } ]
  }
)

7) Thoát khỏi vỏ mongo, kết nối lại, xác thực là người dùng.

use some_db
db.auth("myNormalUser", "xyz123")
db.foo.insert({x:1})
use some_other_db
db.foo.find({})

2
Cuối cùng tôi cũng có một ý tưởng về những gì đang thực sự xảy ra.
bắt đầu từ


3
Tôi thấy mình muốn câu trả lời được chấp nhận có thể được làm mới trên SO. Đây là giải pháp phù hợp nhất kể từ tháng 7 năm 2017.
azatar

1
Hãy cập nhật câu trả lời của bạn! Tôi không biết bạn đã lấy userAdminAnyDatabase từ đâu nhưng nó không hoạt động. Vai trò là root để truy cập quản trị viên trên tất cả các dbs.
Aakash Verma

@AakashVerma docs.mongodb.com/manual/reference/built-in-roles/ mẹo ;) Cũng KHÔNG BAO GIỜ SỬ DỤNG ROOT trừ khi vì mục đích phát triển mà bạn biết bạn không thể bị xâm phạm! (tbh chỉ không bao giờ sử dụng root lol)
K - Độc tính trong SO đang tăng lên.

63

Đầu tiên, bỏ bình luận dòng bắt đầu bằng #auth=truetrong tệp cấu hình mongod của bạn (đường dẫn mặc định /etc/mongo.conf). Điều này sẽ cho phép xác thực cho mongodb.

Sau đó, khởi động lại mongodb: sudo service mongod restart


10
đường dẫn mặc định /etc/mongod.confkhông phải là/etc/mongo.conf
Mithril

2
hoặc, trước hết là không chú ý, sau đó khởi động lại :)))
GioMac

2
Cập nhật: Bây giờ khởi động lại dịch vụ với: sudo dịch vụ mongodb restart
sharafjaffri

cấu hình vị trí và tên tệp là: /etc/mongodb.conf
HGMamaci

46

Câu trả lời này là dành cho Mongo 3.2.1 tham khảo

Nhà ga 1:

$ mongod --auth

Nhà ga 2:

db.createUser({user:"admin_name", pwd:"1234",roles:["readWrite","dbAdmin"]})

nếu bạn muốn thêm mà không có vai trò (tùy chọn):

db.createUser({user:"admin_name", pwd:"1234", roles:[]})

để kiểm tra xem có xác thực hay không:

db.auth("admin_name", "1234")

nó sẽ cung cấp cho bạn:

1

khác:

Error: Authentication failed.
0

2
các phiên bản cũ hơn như 2.4 sẽ sử dụng db.addUser
arviman

Tôi đã phải gõ use admintrước khi createUsernó đã báo lỗi.
Guillaume F.

28

Đây là một mã javascript để thêm người dùng.

  1. Bắt đầu mongodvới--auth = true

  2. Truy cập cơ sở dữ liệu quản trị từ mongo shell và truyền tệp javascript.

    quản trị viên mongo "Filename.js"

    "Filename.js"

    // Adding admin user
    db.addUser("admin_username", " admin_password");
    // Authenticate admin user
    db.auth("admin_username ", " admin_password ");
    // use  database code from java script
    db = db.getSiblingDB("newDatabase");
    // Adding newDatabase database user  
    db.addUser("database_username ", " database_ password ");
  3. Bây giờ bổ sung người dùng đã hoàn tất, chúng tôi có thể xác minh truy cập cơ sở dữ liệu từ vỏ mongo


1
Đặt tên người dùng và mật khẩu trong một tệp trông không an toàn lắm.
Khám phá

Javascript. Không phải "tập lệnh java".
Camilo Martin

mục đích của tập tin javascript ở đây là gì?
Ravi

@CamiloMartin JavaScript, không phải "Javascript".
Madbreaks


10

Lần đầu tiên chạy mongoDB trên thiết bị đầu cuối bằng cách sử dụng

mongod

Bây giờ chạy shell mongo sử dụng các lệnh sau

    use admin
db.createUser(
  {
    user: "myUserAdmin",
    pwd: "abc123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

Khởi động lại phiên bản MongoDB bằng điều khiển truy cập.

mongod --auth

Bây giờ hãy xác thực chính bạn từ dòng lệnh bằng cách sử dụng

mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"

Tôi đọc nó từ

https://docs.mongodb.com/manual/tutorial/enable-authentication/


1
tôi đã xác định một người dùng, với root, sau đó thêm nhiều hơn nữa cho đến khi tôi tìm thấy bạn, MongoDB Enterprise > db.system.users.find() { "_id" : "admin.admin", "user" : "admin", "db" : "admin", "credentials" : { "SC RAM-SHA-1" : { "iterationCount" : 10000, "salt" : "k96PCEflidMY5seVju+gAw==", "s toredKey" : "CabQTnJtny7cv0wT5X8oX9QOn3A=", "serverKey" : "RJyCdnlIhyIfj2+d44L61 bYK+MU=" } }, "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" }, { "role" : "dbAdmin", "db" : "admin" }, { "role" : "userAdmin", "db" : "admin" }, { "role" : "root", "db" : "admin" } ] }vẫn xác thực thất bại
deadManN

tôi thậm chí đã sử dụng db.changeUserPassword () hoặc bất kỳ thứ gì, ngay cả sau đó, khi tôi gọi db.auth ('admin', 'my pass') hoặc cách bạn thực hiện, nó nói rằng xác thực thất bại cho quản trị viên người dùng
deadManN

Sử dụng rootvai trò để cung cấp quyền truy cập vào các hoạt động và tất cả các tài nguyên của các vai trò sau đây kết hợp ... gốc vai trò
Laode Muhammad Al Fatih

8

Đây là những gì tôi đã làm trên Ubuntu 18.04:

$ sudo apt install mongodb
$ mongo
> show dbs
> use admin
> db.createUser({  user: "root",  pwd: "rootpw",  roles: [ "root" ]  })  // root user can do anything
> use lefa
> db.lefa.save( {name:"test"} )
> db.lefa.find()
> show dbs
> db.createUser({  user: "lefa",  pwd: "lefapw",  roles: [ { role: "dbOwner", db: "lefa" } ]  }) // admin of a db
> exit
$ sudo vim /etc/mongodb.conf
auth = true
$ sudo systemctl restart mongodb
$ mongo -u "root" -p "rootpw" --authenticationDatabase  "admin"
> use admin
> exit
$ mongo -u "lefa" -p "lefapw" --authenticationDatabase  "lefa"
> use lefa
> exit

8

Bạn có thể thay đổi /etc/mongod.conf.

Trước

#security:

Sau

security:
    authorization: "enabled"

Sau đó sudo service mongod restart


5

Thực hiện theo các bước dưới đây theo thứ tự

  • Tạo người dùng bằng CLI
use admin
db.createUser(
  {
    user: "admin",
    pwd: "admin123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
  }
)
  • Cho phép xác thực, cách bạn thực hiện khác nhau dựa trên hệ điều hành của bạn, nếu bạn đang sử dụng windows, bạn có thể chỉ cần mongod --authtrong trường hợp linux, bạn có thể chỉnh sửa /etc/mongod.conftệp để thêm security.authorization : enabledvà sau đó khởi động lại dịch vụ mongd
  • Để kết nối qua cli mongo -u "admin" -p "admin123" --authenticationDatabase "admin". Đó là nó

Bạn có thể kiểm tra bài đăng này để đi vào chi tiết hơn và tìm hiểu kết nối với nó bằng cách sử dụng cầy mangut.


4

Tạo người dùng bằng mật khẩu cho một cơ sở dữ liệu cụ thể để bảo mật truy cập cơ sở dữ liệu:

use dbName

db.createUser(
   {
     user: "dbUser",
     pwd: "dbPassword",
     roles: [ "readWrite", "dbAdmin" ]
   }
)


3

Những bước này đã làm việc với tôi:

  1. viết mongod - cổng 27017 trên cmd
  2. sau đó kết nối với vỏ mongo: mongo --port 27017
  3. tạo quản trị viên người dùng: sử dụng quản trị viên db.createUser ({user: "myUserAdmin", pwd: "abc123", vai trò: [{vai trò: "userAdminAnyDatabase", db: "admin"}]})
  4. ngắt kết nối vỏ mongo
  5. khởi động lại mongodb: mongod --auth --port 27017
  6. bắt đầu shell mongo: mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
  7. Để xác thực sau khi kết nối, Kết nối vỏ mongo với mongod: mongo --port 27017
  8. chuyển sang cơ sở dữ liệu xác thực: sử dụng quản trị viên db.auth ("myUserAdmin", "abc123"

3

Cách thực hành tốt nhất để kết nối với mongoDB như sau:

  1. Sau khi cài đặt ban đầu,

    use admin

  2. Sau đó chạy đoạn script sau để tạo người dùng quản trị

    db.createUser( { user: "YourUserName", pwd: "YourPassword", roles: [ { role: "userAdminAnyDatabase", db: "admin" }, { role: "readWriteAnyDatabase", db: "admin" }, { role: "dbAdminAnyDatabase", db: "admin" }, { role: "clusterAdmin", db: "admin" } ] })

đoạn script sau sẽ tạo người dùng quản trị cho DB.

  1. đăng nhập vào db.admin bằng cách sử dụng

    mongo -u YourUserName -p YourPassword admin

  2. Sau khi đăng nhập, bạn có thể tạo số N của cơ sở dữ liệu với cùng thông tin quản trị viên hoặc khác nhau bằng cách lặp lại từ 1 đến 3.

Điều này cho phép bạn tạo người dùng và mật khẩu khác nhau cho bộ sưu tập khác nhau mà bạn tạo trong MongoDB


sau này, hãy truy cập sudo nano /etc/mongod.conf và đặt dòng bảo mật này. Tác giả: đã bật, bạn có thể xem liên kết tham chiếu tại đây: stackoverflow.com/a/57384027/3904109
DragonFire

2

sau khi bạn tạo người dùng mới, xin đừng quên cấp grant read/write/rootphép cho người dùng. bạn có thể thử

cmd: db.grantRolesToUser('yourNewUsername',[{ role: "root", db: "admin" }])

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.