วิธีรักษาความปลอดภัย MongoDB ด้วยชื่อผู้ใช้และรหัสผ่าน


376

ฉันต้องการตั้งค่าการตรวจสอบชื่อผู้ใช้และรหัสผ่านสำหรับอินสแตนซ์ MongoDB ของฉันเพื่อให้การเข้าถึงระยะไกลใด ๆ จะขอชื่อผู้ใช้และรหัสผ่าน ฉันพยายามสอนจากเว็บไซต์ MongoDB และทำตาม:

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

หลังจากนั้นฉันก็ออกมาแล้วก็วิ่งอีกครั้ง และฉันไม่ต้องการรหัสผ่านเพื่อเข้าถึง แม้ว่าฉันจะเชื่อมต่อกับฐานข้อมูลจากระยะไกลฉันยังไม่ได้รับแจ้งชื่อผู้ใช้และรหัสผ่าน


UPDATEนี่คือทางออกที่ฉันใช้

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

รหัสผ่านชื่อผู้ใช้และจะทำงานในแบบเดียวกันสำหรับและmongodumpmongoexport


4
สิ่งนี้สำหรับ MongDB เวอร์ชัน 2.2.x
Tom Imrei

22
ใน Mongo 3.0.4 คำสั่งสำหรับการสร้างผู้ใช้เป็นdb.createUser ()
chronologos

4
โปรดติดตามสิ่งนี้เพื่อสร้างผู้ใช้ที่เป็นผู้ดูแลระบบบน Mongodb 3.0 docs.mongodb.org/v3.0/tutorial/add-user-administrator
Sul Aga

3
การปรับปรุงสำหรับ MongoDB 3.0+: วิธีการตั้งค่าการตรวจสอบใน MongoDB 3.0
Dan Dascalescu

1
เพียงเพื่อให้ชัดเจนนี่ไม่ได้เข้ารหัสไบต์ที่ผ่านสาย มันเป็นเพียงสำหรับการควบคุมการเข้าถึง
Daniel F

คำตอบ:


117

คุณต้องเริ่มต้นmongodด้วย--authตัวเลือกหลังจากตั้งค่าผู้ใช้

จากไซต์ MongoDB:

เรียกใช้ฐานข้อมูล (กระบวนการ mongod) ด้วย--authตัวเลือกเพื่อเปิดใช้งานความปลอดภัย คุณต้องเพิ่มผู้ใช้ใน admin db ก่อนที่จะเริ่มต้นเซิร์ฟเวอร์ด้วย--authหรือเพิ่มผู้ใช้รายแรกจากอินเตอร์เฟส localhost

การพิสูจน์ตัวตน MongoDB


1
ฉันลองแล้วและทำตามตัวอย่าง ตอนนี้ .. ฉันสามารถตั้งค่าได้หลังจากรีสตาร์ทเซิร์ฟเวอร์ด้วย - อัตโนมัติ อย่างไรก็ตามเมื่อฉันพยายามเข้าสู่ระบบ (./mongo -u theadmin -p 12345) ฉันล้มเหลว ฉันเข้าสู่ระบบไม่ได้
murvinlai

หากหลังจากนั้นคุณไม่สามารถเชื่อมต่อได้อาจเป็นเพราะคุณพยายามเชื่อมต่อกับadminฐานข้อมูลให้ใช้ฐานข้อมูลอื่นแล้วลองอีกครั้ง มีเพียง userAdmin (AnyDatabase) เท่านั้นที่สามารถเชื่อมต่อadminได้
Vadorequest

80

ว้าวคำตอบที่ซับซ้อน / สับสนมากมายที่นี่

นี้จะเป็นของv3.4

คำตอบสั้น ๆ

1) เริ่ม MongoDB โดยไม่มีการควบคุมการเข้าถึง

mongod --dbpath /data/db

2) เชื่อมต่อกับอินสแตนซ์

mongo

3) สร้างผู้ใช้

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

4) หยุดอินสแตนซ์ MongoDB และเริ่มต้นอีกครั้งด้วยการควบคุมการเข้าถึง

mongod --auth --dbpath /data/db

5) เชื่อมต่อและรับรองความถูกต้องเป็นผู้ใช้

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

คำตอบยาว: อ่านสิ่งนี้หากคุณต้องการเข้าใจอย่างถูกต้อง

มันง่ายมาก ฉันจะใบ้ด้านล่างhttps://docs.mongodb.com/manual/tutorial/enable-authentication/

หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับบทบาทที่แท้จริงอ่านเพิ่มเติมได้ที่นี่: https://docs.mongodb.com/manual/reference/built-in-roles/

1) เริ่ม MongoDB โดยไม่มีการควบคุมการเข้าถึง

mongod --dbpath /data/db

2) เชื่อมต่อกับอินสแตนซ์

mongo

3) สร้างผู้ดูแลระบบผู้ใช้ ต่อไปนี้สร้างผู้ดูแลระบบผู้ใช้ในadminฐานข้อมูลการรับรองความถูกต้อง ผู้ใช้เป็นdbOwnerมากกว่าsome_dbฐานข้อมูลและไม่เกินadminฐานข้อมูลนี้เป็นสิ่งสำคัญที่ต้องจำ

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

หรือถ้าคุณต้องการสร้างผู้ดูแลระบบซึ่งเป็นผู้ดูแลระบบผ่านฐานข้อมูลใด ๆ :

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

4) หยุดอินสแตนซ์ MongoDB และเริ่มต้นอีกครั้งด้วยการควบคุมการเข้าถึง

mongod --auth --dbpath /data/db

5) เชื่อมต่อและรับรองความถูกต้องในฐานะผู้ดูแลระบบของผู้ใช้ไปยังadminฐานข้อมูลการรับรองความถูกต้องไม่ใช่ไปยังsome_dbฐานข้อมูลการรับรองความถูกต้อง ผู้ดูแลระบบผู้ใช้ถูกสร้างขึ้นในadminฐานข้อมูลการรับรองความถูกต้องผู้ใช้ไม่มีอยู่ในsome_dbฐานข้อมูลการรับรองความถูกต้อง

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

คุณกำลังรับรองความถูกต้องในขณะนี้เป็นdbOwnerมากกว่าsome_dbฐานข้อมูล ดังนั้นตอนนี้ถ้าคุณต้องการอ่าน / เขียน / ทำข้อมูลโดยตรงไปยังsome_dbฐานข้อมูลคุณสามารถเปลี่ยนมันได้

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.

เพิ่มเติมเกี่ยวกับบทบาท: https://docs.mongodb.com/manual/reference/built-in-roles/

หากคุณต้องการให้ผู้ใช้เพิ่มเติมซึ่งไม่ใช่ผู้ดูแลระบบและเป็นเพียงผู้ใช้ปกติอ่านต่อด้านล่าง

6) สร้างผู้ใช้ปกติ ผู้ใช้นี้จะถูกสร้างขึ้นในsome_dbฐานข้อมูลการตรวจสอบด้านล่าง

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

7) ออกจากเปลือก Mongo เชื่อมต่อใหม่รับรองความถูกต้องในฐานะผู้ใช้

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

2
ในที่สุดฉันก็รู้ว่าเกิดอะไรขึ้นจริง ๆ
mestarted


3
ฉันพบว่าตัวเองต้องการคำตอบที่ยอมรับจะได้รับการรีเฟรชใน SO นี่เป็นวิธีแก้ปัญหาที่มีความเกี่ยวข้องมากที่สุดในเดือนกรกฎาคม 2017
azatar

1
โปรดอัปเดตคำตอบของคุณ! ฉันไม่ทราบว่าคุณรับuserAdminAnyDatabaseจากที่ใด แต่ไม่ได้ผล บทบาทคือรูทสำหรับผู้ดูแลระบบในการเข้าถึงดีบีเอสทั้งหมด
Aakash Verma

@AakashVerma docs.mongodb.com/manual/reference/built-in-roles/ ...... ;) ไม่เคยใช้รูทเว้นแต่จะมีจุดประสงค์เพื่อการพัฒนาที่คุณรู้ว่าคุณไม่สามารถถูกบุกรุกได้! (tbh ไม่เคยใช้รูต lol)
K - ความเป็นพิษใน SO กำลังเพิ่มขึ้น

63

ก่อนอื่นให้ยกเลิกการใส่เครื่องหมายบรรทัดที่ขึ้นต้นด้วย#auth=trueในไฟล์กำหนดค่า mongod ของคุณ (เส้นทางเริ่มต้น/etc/mongo.conf) สิ่งนี้จะเปิดใช้งานการพิสูจน์ตัวตนสำหรับ mongodb

จากนั้นเริ่ม mongodb ใหม่: sudo service mongod restart


10
เส้นทางเริ่มต้น/etc/mongod.confไม่ใช่/etc/mongo.conf
มิ ธ ริล

2
หรือไม่แสดงความคิดเห็นก่อนจากนั้นเริ่มต้นใหม่ :)))
GioMac

2
อัปเดต: ตอนนี้เริ่มบริการใหม่ด้วย: sudo service mongodb restart
sharafjaffri

ตำแหน่งไฟล์ config และชื่อเป็น: /etc/mongodb.conf
HGMamaci

46

คำตอบนี้สำหรับ Mongo 3.2.1 Reference

อาคาร 1:

$ mongod --auth

อาคาร 2:

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

หากคุณต้องการเพิ่มโดยไม่มีบทบาท (ไม่บังคับ):

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

เพื่อตรวจสอบว่ารับรองความถูกต้องหรือไม่:

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

มันควรจะให้คุณ:

1

อื่น:

Error: Authentication failed.
0

2
เวอร์ชันที่เก่ากว่าเช่น 2.4 จะใช้ db.addUser
arviman

ฉันต้องพิมพ์use adminก่อนcreateUserมิฉะนั้นจะทำให้เกิดข้อผิดพลาด
Guillaume F.

28

นี่คือรหัสจาวาสคริปต์เพื่อเพิ่มผู้ใช้

  1. เริ่มmongodด้วย--auth = true

  2. เข้าถึงฐานข้อมูลผู้ดูแลระบบจากเชลล์ mongo และส่งไฟล์ javascript

    ผู้ดูแลระบบ 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. ตอนนี้การเพิ่มผู้ใช้เสร็จสิ้นแล้วเราสามารถตรวจสอบการเข้าถึงฐานข้อมูลจากเชลล์ mongo


1
การตั้งชื่อผู้ใช้และรหัสผ่านในไฟล์ดูไม่ปลอดภัยมาก
การสำรวจ

จาวาสคริ ไม่ใช่ "สคริปต์ java"
Camilo Martin

จุดประสงค์ของไฟล์จาวาสคริปต์คืออะไร?
Ravi

@CamiloMartin JavaScript ไม่ใช่ "Javascript"
Madbreaks

14

https://docs.mongodb.com/manual/reference/configuration-options/#security.authorization

แก้ไขไฟล์การตั้งค่า Mongo;

sudo nano /etc/mongod.conf

เพิ่มบรรทัด:

security.authorization : enabled

เริ่มบริการใหม่

sudo service mongod restart

ความนับถือ


2
ฉันไม่เข้าใจว่าทำไมทุกคนไม่พูดถึงเรื่องนี้ มันสำคัญมาก
จอห์น

10

รัน mongoDB ครั้งแรกบนเทอร์มินัลโดยใช้

mongod

ตอนนี้เรียกใช้ mongo shell ใช้คำสั่งต่อไปนี้

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

เริ่มต้นอินสแตนซ์ MongoDB อีกครั้งด้วยการควบคุมการเข้าถึง

mongod --auth

ตอนนี้ตรวจสอบตัวเองจากบรรทัดคำสั่งโดยใช้

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

ฉันอ่านมันจาก

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


1
ฉันกำหนดผู้ใช้ที่มีรากจากนั้นเพิ่มมากขึ้นเรื่อย ๆ จนฉันพบคุณ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" } ] }ยังคงล้มเหลวในการตรวจสอบ
deadManN

ฉันยังใช้ db.changeUserPassword () หรืออะไรก็ได้แม้หลังจากนั้นเมื่อฉันเรียก db.auth ('admin', 'my pass') หรือวิธีที่คุณทำมันก็บอกว่าการตรวจสอบสิทธิ์ล้มเหลวสำหรับผู้ดูแลระบบของผู้ใช้
deadManN

ใช้rootบทบาทเพื่อให้การเข้าถึงการดำเนินการและทรัพยากรทั้งหมดของบทบาทต่อไปนี้รวมกัน ... รูทบทบาท
Laode Muhammad Al Fatih

8

นี่คือสิ่งที่ฉันทำบน 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

/etc/mongod.confคุณอาจมีการเปลี่ยนแปลง

ก่อน

#security:

หลังจาก

security:
    authorization: "enabled"

แล้วก็ sudo service mongod restart


5

ทำตามขั้นตอนด้านล่างตามลำดับ

  • สร้างผู้ใช้โดยใช้ CLI
use admin
db.createUser(
  {
    user: "admin",
    pwd: "admin123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
  }
)
  • เปิดใช้งานการรับรองความถูกต้องวิธีที่คุณทำมันแตกต่างกันไปตามระบบปฏิบัติการของคุณหากคุณใช้ windows คุณสามารถทำได้mongod --authในกรณีของ linux คุณสามารถแก้ไข/etc/mongod.confไฟล์เพื่อเพิ่มsecurity.authorization : enabledและจากนั้นเริ่มบริการ mongd
  • การเชื่อมต่อผ่าน mongo -u "admin" -p "admin123" --authenticationDatabase "admin"CLI แค่นั้นแหละ

คุณสามารถตรวจสอบโพสต์นี้เพื่อดูรายละเอียดเพิ่มเติมและเรียนรู้การเชื่อมต่อกับโพสต์โดยใช้พังพอน


4

การสร้างผู้ใช้ด้วยรหัสผ่านสำหรับฐานข้อมูลเฉพาะเพื่อความปลอดภัยในการเข้าถึงฐานข้อมูล:

use dbName

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

4

คุณจะต้องเปลี่ยนไปใช้ฐานข้อมูลที่คุณต้องการให้ผู้ใช้เปิด (ไม่ใช่ admin db) ...

use mydatabase

ดูโพสต์นี้สำหรับความช่วยเหลือเพิ่มเติม ... https://web.archive.org/web/20140316031938/http://learnmongo.com/posts/quick-tip-mongodb-users/


ไม่ต้องการเนื่องจากการตั้งค่า db = db.getSiblingDB ("newDatabase");
Ozan BAYRAM

3

ขั้นตอนเหล่านี้ทำงานกับฉัน:

  1. เขียน mongod - พอร์ต 27017 บน cmd
  2. จากนั้นเชื่อมต่อกับเชลล์ mongo: mongo --port 27017
  3. สร้างผู้ใช้ผู้ดูแลระบบ: ใช้ผู้ดูแลระบบ db.createUser ({ผู้ใช้: "myUserAdmin", pwd: "abc123", บทบาท: [{บทบาท: "userAdminAnyDatabase", db: "admin"}]})
  4. ตัดการเชื่อมต่อเปลือก Mongo
  5. รีสตาร์ท mongodb: mongod --auth --port 27017
  6. start mongo shell: mongo - พอร์ต 27017 -u "myUserAdmin" -p "abc123" - ฐานข้อมูลรับรองความถูกต้อง "admin"
  7. ในการตรวจสอบสิทธิ์หลังจากเชื่อมต่อเชื่อมเปลือก mongo กับ mongod: mongo --port 27017
  8. เปลี่ยนเป็นฐานข้อมูลการพิสูจน์ตัวตน: ใช้ admin db.auth ("myUserAdmin", "abc123"

3

แนวทางปฏิบัติที่ดีที่สุดในการเชื่อมต่อกับ mongoDB ดังต่อไปนี้:

  1. หลังจากการติดตั้งครั้งแรก

    use admin

  2. จากนั้นเรียกใช้สคริปต์ต่อไปนี้เพื่อสร้างผู้ใช้ที่เป็นผู้ดูแลระบบ

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

สคริปต์ต่อไปนี้จะสร้างผู้ใช้ผู้ดูแลระบบสำหรับฐานข้อมูล

  1. ล็อกอินเข้าสู่ db.admin โดยใช้

    mongo -u YourUserName -p YourPassword admin

  2. หลังจากเข้าสู่ระบบคุณสามารถสร้างหมายเลข N ของฐานข้อมูลที่มีข้อมูลประจำตัวของผู้ดูแลระบบเดียวกันหรือแตกต่างกันโดยทำซ้ำ 1 ถึง 3

สิ่งนี้อนุญาตให้คุณสร้างผู้ใช้และรหัสผ่านที่แตกต่างกันสำหรับคอลเลกชันต่าง ๆ ที่คุณสร้างใน MongoDB


หลังจากนี้ไปที่ sudo nano /etc/mongod.conf และใส่ความปลอดภัยบรรทัดนี้การอนุญาต: เปิดใช้งานคุณสามารถดูลิงค์อ้างอิงได้ที่นี่: stackoverflow.com/a/57384027/3904109
DragonFire

2

หลังจากที่คุณสร้างผู้ใช้ใหม่โปรดอย่าลืมให้grant read/write/rootสิทธิ์แก่ผู้ใช้ คุณสามารถลอง

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.