MongoDB - ผู้ดูแลระบบไม่ได้รับอนุญาต


200

ฉันพยายามเพิ่มการอนุญาตให้ MongoDB ของฉัน
ฉันทำทั้งหมดนี้บน Linux ด้วย MongoDB 2.6.1
ไฟล์ mongod.conf ของฉันอยู่ในรูปแบบความเข้ากันได้แบบเก่า
(นี่คือวิธีที่มันมาพร้อมกับการติดตั้ง)

1) ฉันสร้างผู้ดูแลระบบตามที่อธิบายไว้ที่นี่ใน (3)

http://docs.mongodb.org/manual/tutorial/add-user-administrator/

2) ฉันแก้ไข mongod.conf โดยไม่แสดงข้อคิดเห็นบรรทัดนี้

auth = true

3) ในที่สุดฉันก็เริ่มบริการ mongod และฉันพยายามที่จะเข้าสู่ระบบด้วย:

/usr/bin/mongo localhost:27017/admin -u sa -p pwd

4) ฉันสามารถเชื่อมต่อ แต่มันบอกว่านี้เมื่อเชื่อมต่อ

MongoDB shell version: 2.6.1
connecting to: localhost:27017/admin
Welcome to the MongoDB shell!
The current date/time is: Thu May 29 2014 17:47:16 GMT-0400 (EDT)
Error while trying to show server startup warnings: not authorized on admin to execute command { getLog: "startupWarnings" }

5) ดูเหมือนว่าsaผู้ใช้รายนี้ที่ฉันสร้างไว้ไม่มีสิทธิ์เลย

root@test02:~# mc
MongoDB shell version: 2.6.1
connecting to: localhost:27017/admin
Welcome to the MongoDB shell!
The current date/time is: Thu May 29 2014 17:57:03 GMT-0400 (EDT)
Error while trying to show server startup warnings: not authorized on admin to execute command { getLog: "startupWarnings" }
[admin] 2014-05-29 17:57:03.011 >>> use admin
switched to db admin
[admin] 2014-05-29 17:57:07.889 >>> show collections
2014-05-29T17:57:10.377-0400 error: {
        "$err" : "not authorized for query on admin.system.namespaces",
        "code" : 13
} at src/mongo/shell/query.js:131
[admin] 2014-05-29 17:57:10.378 >>> use test
switched to db test
[test] 2014-05-29 17:57:13.466 >>> show collections
2014-05-29T17:57:15.930-0400 error: {
        "$err" : "not authorized for query on test.system.namespaces",
        "code" : 13
} at src/mongo/shell/query.js:131
[test] 2014-05-29 17:57:15.931 >>>

อะไรคือปัญหา? ฉันทำซ้ำขั้นตอนทั้งหมดนี้ 3 ครั้งและ
ฉันคิดว่าฉันทำทุกอย่างตามที่ระบุในเอกสาร MongoDB แต่มันไม่ทำงาน
ฉันคาดหวังว่าsaผู้ใช้รายนี้จะได้รับอนุญาตให้ทำทุกอย่างเพื่อให้
เขาสามารถสร้างผู้ใช้รายอื่นและให้สิทธิ์ที่เฉพาะเจาะจงมากขึ้น


20
มันน่ารำคาญมากหรือเอกสารไม่ดี ฉันกำลังดิ้นรนอยู่ที่นั่น ในที่สุดฉันมีผู้ใช้ที่มีบทบาท "root" ระดับโลกและยังไม่สามารถทำสิ่งต่าง ๆ เช่นรันคำสั่ง ...
ToBe

คำตอบ:


476

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

use admin
db.createUser(
  {
    user: 'admin',
    pwd: 'password',
    roles: [ { role: 'root', db: 'admin' } ]
  }
);
exit;

หากคุณได้สร้างadminผู้ใช้แล้วคุณสามารถเปลี่ยนบทบาทดังนี้:

use admin;
db.grantRolesToUser('admin', [{ role: 'root', db: 'admin' }])

สำหรับการอ้างอิงการตั้งค่าการรับรองความถูกต้องสมบูรณ์โปรดดูขั้นตอนที่ฉันได้รวบรวมหลังจากทำการวิจัยผ่านอินเทอร์เน็ตเป็นเวลาหลายชั่วโมง


155
WTF ?! แพ้ชั่วโมงเดียวกับสิ่งที่โง่เช่นนี้ ทำไมพวกเขาถึงใส่เอกสารuserAdminAnyDatabaseแทนroot?
akostadinov

15
แนวคิดคือคุณสร้างผู้ใช้ครั้งแรกที่ใช้สำหรับการดูแลผู้ใช้รายอื่นเท่านั้น (ดังนั้นบทบาทที่ขึ้นต้นด้วย "userAdmin") จากนั้นสร้างผู้ใช้ปกติของคุณเท่านั้น เป็นเรื่องที่สมเหตุสมผล แต่ฉันก็ไม่เข้าใจเหมือนกันเป็นครั้งแรก ... @akostadinov
TomTasche

11
นี่ใช้ไม่ได้กับ MongoDB v3.4.7:db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])
user124384

2
@Cerin รหัสนี้DIDทำงานสำหรับฉัน: db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])และนั่นทำให้ฉันสับสน ฉันไม่ได้รับอนุญาตให้เรียกใช้คำสั่งและยังสามารถเรียกใช้คำสั่งเพื่อทำให้ตัวเองรูทแล้วเรียกใช้คำสั่งนั้น แปลกมาก: S

2
สำหรับผู้ที่db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])ไม่ได้ทำงานให้แน่ใจว่าคุณเปลี่ยนกลับไปuse admin... มีปัญหาเดียวกันเมื่อฉันเปลี่ยนกลับไปทำงานเหมือนเสน่ห์
esko22

37

มันค่อนข้างสับสน - ฉันเชื่อว่าคุณจะต้องให้สิทธิ์ตัวเองในการอ่านเขียนเพื่อสืบค้นฐานข้อมูล ผู้ใช้ที่มี dbadmin หรือ useradmin สามารถดูแลฐานข้อมูล (รวมถึงการให้สิทธิ์เพิ่มเติมแก่คุณ) แต่ไม่สามารถทำการสืบค้นหรือเขียนข้อมูลได้

ดังนั้นให้ตัวเองอ่านเขียนและคุณควรจะปรับ -

http://docs.mongodb.org/manual/reference/built-in-roles/#readWrite


ฉันไม่แน่ใจว่าคำตอบนี้เกี่ยวข้องกับคำถาม แต่อย่างใดก็ให้ข้อมูลที่ไม่ถูกต้อง บทบาท dbOwner รวมถึงบทบาท readWrite: docs.mongodb.org/manual/reference/built-in-roles/#dbOwner
Andy Triggs

10
คำตอบนั้นถูกต้อง - บทบาท dbadmin และ useradmin (ซึ่งเป็นสิ่งที่ผู้โพสต์ดั้งเดิมถามถึง) ไม่รวม readWrite dbOwner ทำ แต่นั่นไม่ใช่สิ่งที่ผู้ใช้ดั้งเดิมใช้และถามถึง
John Petrone

3
คุณพูดถูก ขอโทษ. ฉันใช้เวลาในการถกเถียงกันนานเกินไปและยุ่งเหยิง
Andy Triggs

ดังนั้นคุณสามารถมีผู้ใช้ที่เป็นผู้ดูแลระบบเพื่อเข้าถึงเซิร์ฟเวอร์ mongodb จริงจากนั้นมีผู้อื่นสำหรับฐานข้อมูลเฉพาะหรือไม่
K - ความเป็นพิษใน SO กำลังเพิ่มขึ้น

32

บางทีตัวอย่างรวดเร็วของการเปลี่ยนผู้ใช้ปัจจุบันจะเป็นประโยชน์กับใครบางคน นี่คือสิ่งที่ฉันกำลังมองหา

คำแนะนำต่อไปนี้ของ @JohnPetrone ฉันได้เพิ่มบทบาทreadWriteให้กับผู้ใช้ที่เป็นผู้ดูแลระบบของฉันด้วยgrantRolesToUser

> use admin
> db.grantRolesToUser("admin",["readWrite"])
> show collections
system.users
system.version

26

คุณสามารถลอง: การใช้ช่วย --authenticationDatabase flag ช่วย

mongo --port 27017 -u "admin" -p "password" --authenticationDatabase "admin"

9

ฉันรู้ว่าคำตอบนี้จะมาช้าในหัวข้อนี้ แต่ฉันหวังว่าคุณจะตรวจสอบออก

เหตุผลที่คุณได้รับข้อผิดพลาดนั้นขึ้นอยู่กับบทบาทเฉพาะที่คุณให้กับผู้ใช้ซึ่งคุณได้รวบรวมไว้ตอนนี้และใช่การให้ผู้ใช้นั้นบทบาทrootจะแก้ปัญหาของคุณ แต่คุณต้องเข้าใจก่อนว่าบทบาทเหล่านี้ทำอะไรก่อนที่จะอนุญาต ถึงผู้ใช้

ในบทช่วยสอนคุณให้สิทธิ์แก่ผู้ใช้ในuserAdminAnyDatabaseบทบาทที่ให้ผู้ใช้สามารถจัดการผู้ใช้ฐานข้อมูลทั้งหมดของคุณได้ สิ่งที่คุณพยายามทำกับผู้ใช้ของคุณอยู่นอกเหนือการกำหนดบทบาท

rootบทบาทมีบทบาทนี้รวมอยู่ในนั้นความหมายเช่นเดียวกับreadWriteAnyDatabase, dbAdminAnyDatabaseและบทบาทอื่น ๆ ทำให้ superuser (ที่พื้นเพราะคุณสามารถทำอะไรกับมัน)

คุณสามารถตรวจสอบคำจำกัดความบทบาทเพื่อดูว่าบทบาทใดที่คุณจะต้องให้ผู้ใช้ดำเนินงานบางอย่างให้เสร็จ https://docs.mongodb.com/manual/reference/built-in-roles/ ไม่แนะนำให้ผู้ใช้ของคุณสุดยอดเลย :)


ดังนั้นถ้าไม่ใช่รูทคุณแนะนำให้แก้ปัญหาอย่างไร
Hendy Irawan

สวัสดี @HendyIrawan ฉันขอแนะนำให้คุณตัดสินใจเลือกสิ่งที่คุณต้องการให้ผู้ใช้แต่ละคนสามารถทำได้และให้บทบาทที่ทำให้พวกเขาทำอย่างนั้น ตัวอย่างเช่นถ้าคุณเพียงต้องการให้ผู้ใช้สามารถอ่าน (ซึ่งเป็นสิ่งที่คำถามที่พยายามจะทำอย่างไรกับshow collections) roles: [ { role: "read", db: "admin" } ]คุณควรจะให้มันว่ามีความสามารถและไม่มีอะไรอื่น โปรดสังเกตว่ามีการอ่านบทบาทที่นี่นี่เป็นฐานข้อมูลเฉพาะและคุณไม่สามารถทำอะไรได้นอกจากนั้น ลองใช้ลิงค์นี้เพื่อดูบทบาทอื่น ๆdocs.mongodb.com/manual/reference/built-in-roles
el Punch

ดังนั้นคำตอบของคำถามที่นี่ (ไม่ใช่ "ตัวอย่าง") คือ "อ่าน" หรือไม่
Hendy Irawan

ใช่. โปรดทราบว่าผู้ใช้จะสามารถอ่าน db ที่ระบุได้เท่านั้น
el Punch

2

มันเป็นคำถามง่าย ๆ

  1. เป็นสิ่งสำคัญที่คุณจะต้องเปลี่ยน db เป้าหมายไม่ใช่ผู้ดูแลระบบ

ใช้ yourDB

  1. ตรวจสอบการรับรองความถูกต้อง db ของคุณโดย

แสดงผู้ใช้

  1. หากคุณได้รับ {} วัตถุที่ว่างเปล่านั่นคือคำถาม คุณเพียงแค่ต้องพิมพ์

db.createUser ({ผู้ใช้: "yourUser", pwd: "รหัสผ่าน", บทบาท: ["readWrite", "dbAdmin"]})

หรือ

db.grantRolesToUser ('yourUser', [{role: "dbAdmin", db: "yourDB"}])


0

ฉันมีปัญหาที่คล้ายกันที่นี่ในสภาพแวดล้อม Windows: ฉันได้ติดตั้ง Bitnami DreamFactory และมันยังติดตั้ง MongoDb อีกอันที่เริ่มในการบูตระบบ ฉันใช้งาน MongoDbService ของฉัน (ซึ่งเริ่มต้นโดยไม่มีข้อผิดพลาด) แต่ฉันสังเกตเห็นว่าหลังจากเสียเวลาไปมากในความเป็นจริงที่เชื่อมต่อกับบริการ MongoDb ของ Bitnami โปรดดูว่าไม่มีอินสแตนซ์อื่นของ mongoDB ที่ทำงานบนเซิร์ฟเวอร์ของคุณ

โชคดี!


2
ฉันไม่รู้ว่าทำไมคำตอบนี้จึงถูกลดระดับลง นี่เป็นข้อเสนอแนะที่ถูกต้องตามกฎหมาย ตัวอย่างเช่นฉันพบกับคอนโซลการจัดการที่ใช้ Tomcat ใต้กระโปรงหน้ารถ หากคุณเริ่มเซิร์ฟเวอร์ท้องถิ่น (ทุกประเภท) คุณอาจตรวจสอบว่ามันทำงานโดยพยายามเชื่อมต่อกับมัน การเชื่อมต่อครั้งแรกนั้นจะสำเร็จ จากนั้นคุณจะต่อสู้กับเซิร์ฟเวอร์ "ซ่อน" ก่อนตรวจสอบบันทึกของเซิร์ฟเวอร์และสังเกตว่าเซิร์ฟเวอร์ของคุณไม่สามารถผูกกับพอร์ตที่ต้องการ
พอล

0

นอกจากนี้โปรดสังเกตว่าหากไคลเอ็นต์ mongo shell ของคุณไม่สามารถเชื่อมต่อกับmongodอินสแตนซ์ได้อย่างถูกต้องคุณสามารถรับข้อผิดพลาด "สิทธิ์การปฏิเสธ"

ตรวจสอบให้แน่ใจว่าไคลเอนต์ของคุณเปิดการเชื่อมต่อโดยการตรวจสอบพอร์ตการเชื่อมต่อ แต่รวมถึงพอร์ตที่คุณใช้อยู่mongodนั้นไม่ได้ใช้งาน คุณสามารถตั้งค่าพอร์ตอื่นโดยใช้--port <port>พารามิเตอร์ทั้งในเชลล์และกระบวนการ


0

ฉันมีปัญหานี้เนื่องจากชื่อโฮสต์ในMongoDB Compassของฉันชี้ไปที่ผู้ดูแลระบบแทนโครงการของฉัน แก้ไขโดยการเพิ่ม / projectname หลังชื่อโฮสต์ :) ลองนี้:

  1. เลือกโครงการของคุณในเว็บไซต์ Atlas MongoDB
  2. เชื่อมต่อ / เชื่อมต่อกับ MongoDB Compass
  3. ดาวน์โหลด Compass / เลือกระบบปฏิบัติการของคุณ
  4. ฉันใช้เข็มทิศ 1.12 หรือใหม่กว่า
  5. คัดลอกสตริงการเชื่อมต่อภายใต้เข็มทิศ 1.12 หรือใหม่กว่า
  6. เปิด MongoDB Compass / เชื่อมต่อ (ซ้ายบน) / เชื่อมต่อกับ
  7. ตรวจพบสตริงการเชื่อมต่อ / ใช่ /
  8. ผนวกชื่อโครงการของคุณหลังจากที่ชื่อโฮสต์: cluster9-foodie.mongodb.net/ projectname
  9. เชื่อมต่อและทดสอบ API ด้วย POSTMAN
  10. ประสบความสำเร็จ

ใช้สตริงการเชื่อมต่อเดียวกันในรหัสของคุณด้วย:

  1. ก่อน:
    • mongodb + srv: // projectname: รหัสผ่าน @ cluster9-foodie.mongodb.net / admin
  2. หลังจาก:
    • mongodb + srv: // projectname: password @ cluster9-foodie.mongodb.net / projectname

โชคดี.


0

ใช้ mydb
db.createUser ({ผู้ใช้: "ทดสอบ", pwd: "secret", บทบาท: ["readWrite", "dbAdmin"], passwordDigestor: "เซิร์ฟเวอร์"})


0

ตกลงว่าคุณจะได้รับการรับรองความถูกต้องของผู้ดูแลระบบ db และต้องการอย่างน้อยบทบาทที่มีสิทธิ์ที่ถูกต้องซึ่งจะหลีกเลี่ยง 'ข้อยกเว้นโฮสต์ในพื้นที่' จาก DB (นี่เป็นของ mongoDB ที่โฮสต์ในสถานที่) แม้ว่าคุณจะมีทุกอย่าง ไม่ได้รับการยกเว้นที่ได้รับอนุญาตในเกือบทุกคำสั่งในขณะที่เข้าถึง mongoDB ซึ่งสร้างขึ้นโดยใช้Mongo Atlasจากนั้นที่นี่เป็นสถานที่ที่คุณอาจทราบเหตุผลว่าทำไม:

/dba/219003/not-authorized-on-admin-to-execute-command-mongodb-atlas-m0-free-tier-cluster?newreg=471a9a26108243d78d4ca74a87e7a115

และตรวจสอบสิ่งนี้หากคุณได้โฮสต์ mongoDB บนmongo Atlas :

https://docs.atlas.mongodb.com/unsupported-commands/


0
Use Admin :
    use admin

Create a super user : 

    db.createUser(
    {
    user: "master",
    pwd: "test@123",
    roles: [ 
    { 
    role: "readWriteAnyDatabase", 
    db: "admin" 
    }, 
    {
    "role" : "dbAdminAnyDatabase",
    "db" : "admin"
    },
    {
    "role" : "clusterAdmin",
    "db" : "admin"
    },
    "userAdminAnyDatabase" 
    ]
    }
    )

1
ขอบคุณสำหรับข้อมูลโค้ดนี้ซึ่งอาจให้ความช่วยเหลือระยะสั้นแบบ จำกัด คำอธิบายที่เหมาะสมจะช่วยเพิ่มมูลค่าในระยะยาวได้อย่างมากโดยการแสดงว่าเหตุใดจึงเป็นวิธีแก้ปัญหาที่ดีและจะทำให้มีประโยชน์มากขึ้นสำหรับผู้อ่านในอนาคตด้วยคำถามอื่น ๆ ที่คล้ายกัน โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบายรวมถึงข้อสมมติที่คุณได้ทำไว้
Toby Speight

0

ฉันทำตามขั้นตอนเหล่านี้ใน Centos 7 สำหรับ MongoDB 4.2 (ผู้ใช้ระยะไกล)

อัพเดตไฟล์ mongod.conf

vi /etc/mongod.conf
   net:
     port: 27017
     bindIp: 0.0.0.0 
   security:
     authorization: enabled

เริ่มปีศาจบริการ MongoDB

systemctl start mongod

เปิดเปลือก MongoDB

mongo

ดำเนินการคำสั่งนี้บนเปลือก

use admin
db.createUser(
  {
    user: 'admin',
    pwd: 'YouPassforUser',
    roles: [ { role: 'root', db: 'admin' } ]
  }
);

สร้างผู้ใช้รูทระยะไกลแล้ว ตอนนี้คุณสามารถทดสอบการเชื่อมต่อฐานข้อมูลโดยใช้เครื่องมือ MongoDB GUI จากเครื่อง dev ของคุณ เช่นเดียวกับRobo 3T


-10

อาจเป็นเพราะคุณไม่ได้ตั้ง noAuth = true ใน mongodb.conf

# Turn on/off security.  Off is currently the default
noauth = true
#auth = true

หลังจากการตั้งค่านี้เริ่มบริการโดยใช้

บริการ mongod เริ่มต้นใหม่


1
ผู้ใช้กล่าวอย่างชัดเจนว่าเขาต้องการเริ่มใช้การให้สิทธิ์ดังนั้นเขาจึงไม่ใส่เครื่องหมายข้อคิดเห็น auth = true ทำไมคุณถึงแนะนำให้ปิดการให้สิทธิ์!
อเล็กซ์ 75

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