MongoDB - pengguna admin tidak diotorisasi


200

Saya mencoba menambahkan otorisasi ke MongoDB saya.
Saya melakukan semua ini di Linux dengan MongoDB 2.6.1.
File mongod.conf saya berada dalam format kompatibilitas yang lama
(beginilah cara menginstalnya).

1) Saya membuat pengguna admin seperti yang dijelaskan di sini dalam (3)

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

2) Saya kemudian mengedit mongod.conf dengan menghapus komentar pada baris ini

auth = true

3) Akhirnya saya reboot layanan mongod dan saya mencoba masuk dengan:

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

4) Saya dapat terhubung tetapi dikatakan ini saat terhubung.

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) Sekarang tampaknya sapengguna yang saya buat ini tidak memiliki izin sama sekali.

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 >>>

Apa masalahnya? Saya mengulangi seluruh prosedur ini 3 kali dan
saya pikir saya melakukan semuanya seperti yang ditentukan dalam dokumen MongoDB. Tapi itu tidak berhasil.
Saya mengharapkan sapengguna ini diotorisasi untuk melakukan apa saja sehingga
ia kemudian dapat membuat pengguna lain dan memberi mereka izin yang lebih spesifik.


20
Ini sangat menjengkelkan atau didokumentasikan dengan buruk. Saya berjuang sendiri di sana. Pada akhirnya, saya memiliki pengguna dengan peran "root" global dan masih tidak dapat melakukan beberapa hal seperti menjalankan perintah ...
ToBe

Jawaban:


471

Saya juga menggaruk-garuk kepala saya di masalah yang sama, dan semuanya bekerja setelah saya menetapkan peran menjadi root saat menambahkan pengguna admin pertama.

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

Jika Anda telah membuat adminpengguna, Anda dapat mengubah peran seperti ini:

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

Untuk referensi pengaturan otentikasi lengkap, lihat langkah - langkah yang telah saya susun setelah berjam-jam penelitian melalui internet.


154
WTF ?! kehilangan satu jam untuk hal bodoh seperti ini. Mengapa mereka memasukkan dokumentasi userAdminAnyDatabasebukan root?
akostadinov

15
idenya adalah Anda pertama kali membuat pengguna yang hanya digunakan untuk mengatur pengguna lain (karena itu perannya dimulai dengan "userAdmin") dan baru kemudian menciptakan pengguna normal Anda. itu agak masuk akal, tetapi saya tidak mengerti pertama kali juga ... @akostadinov
TomTasche

10
Ini tidak berhasil untuk saya di MongoDB v3.4.7:db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])
user124384

2
@Cerin Kode ini tidak berfungsi untuk saya :, db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])dan itu membuat saya bingung. Saya tidak berwenang untuk menjalankan perintah, namun saya dapat menjalankan perintah untuk membuat diri saya root, dan kemudian jalankan perintah itu. Sangat aneh: S

2
bagi mereka yang db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])tidak bekerja, pastikan Anda beralih kembali ke use admin... memiliki masalah yang sama, setelah saya beralih kembali itu berfungsi seperti pesona
esko22

37

Agak membingungkan - saya yakin Anda harus memberikan diri Anda readWrite untuk meminta basis data. Seorang pengguna dengan dbadmin atau useradmin dapat melakukan admin database (termasuk memberikan hak tambahan kepada diri Anda sendiri) tetapi tidak dapat melakukan kueri atau menulis data.

jadi berikan diri Anda readWrite dan Anda harus baik -

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


Saya tidak yakin jawaban ini relevan dengan pertanyaan, tetapi bagaimanapun juga memberikan informasi yang salah. Peran dbOwner mencakup peran readWrite: docs.mongodb.org/manual/reference/built-in-roles/#dbOwner
Andy Triggs

10
jawabannya benar - peran dbadmin dan useradmin (yang merupakan apa yang diminta poster asli) tidak termasuk readWrite. DbOwner melakukannya tetapi bukan itu yang digunakan dan ditanyakan oleh pengirim aslinya.
John Petrone

3
Anda benar sekali. Permintaan maaf. Saya telah menghabiskan terlalu lama peran perselisihan dan menjadi bingung.
Andy Triggs

Jadi Anda dapat memiliki pengguna admin untuk mengakses server mongodb yang sebenarnya, dan kemudian memiliki orang lain untuk database tertentu?
K - Keracunan dalam SO tumbuh.

32

Mungkin contoh cepat tentang cara mengubah pengguna saat ini akan membantu seseorang. Inilah yang sebenarnya saya cari.

Mengikuti saran dari @JohnPetrone saya menambahkan peran readWrite ke pengguna admin saya dengan grantRolesToUser

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

26

Anda dapat mencoba: Menggunakan flag --authenticationDatabase membantu.

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

8

Saya tahu jawaban ini datang sangat terlambat di utas ini tetapi saya harap Anda memeriksanya.

Alasan Anda mendapatkan kesalahan itu didasarkan pada peran spesifik yang Anda berikan kepada pengguna, yang telah Anda kumpulkan sekarang, dan ya memberi pengguna peran itu rootakan menyelesaikan masalah Anda, tetapi Anda harus terlebih dahulu memahami apa peran ini dilakukan dengan tepat sebelum memberikannya kepada mereka. kepada pengguna.

Dalam tutorial, Anda memberi pengguna userAdminAnyDatabaseperan yang pada dasarnya memberi pengguna kemampuan untuk mengelola pengguna dari semua basis data Anda. Apa yang Anda coba lakukan dengan pengguna Anda berada di luar definisi perannya.

The rootperan memiliki peran ini termasuk di dalamnya definisi serta readWriteAnyDatabase, dbAdminAnyDatabasedan peran lainnya sehingga superuser (pada dasarnya karena Anda dapat melakukan apa-apa dengan itu).

Anda dapat memeriksa definisi peran untuk melihat peran mana yang perlu Anda berikan kepada pengguna untuk menyelesaikan tugas-tugas tertentu. https://docs.mongodb.com/manual/reference/built-in-roles/ Tidak disarankan untuk membuat semua pengguna Anda yang super :)


Jadi, jika tidak root, maka peran apa yang Anda sarankan untuk menyelesaikan masalah?
Hendy Irawan

Halo, @HendyIrawan, saya sarankan Anda memutuskan apa yang sebenarnya Anda ingin agar setiap pengguna Anda dapat lakukan dan memberi mereka peran yang memungkinkan mereka melakukan hanya itu. Misalnya, jika Anda hanya ingin pengguna membaca (yang merupakan pertanyaan yang coba dilakukan dengan show collections) Anda harus memberikannya kemampuan dan tidak ada yang lain roles: [ { role: "read", db: "admin" } ]. Perhatikan bahwa peran di sini dibaca, ini khusus basis data dan Anda tidak dapat melakukan apa pun selain itu. Lihat tautan ini untuk peran lainnya docs.mongodb.com/manual/reference/built-in-roles
el Punch

Jadi jawaban untuk pertanyaan di sini (bukan "misalnya") adalah "dibaca"?
Hendy Irawan

Iya. Perhatikan bahwa pengguna hanya akan memiliki kemampuan untuk membaca db yang ditentukan.
el Punch

2

Ini pertanyaan sederhana.

  1. Sangat penting bahwa Anda harus mengganti target db TIDAK admin.

gunakan yourDB

  1. periksa otentikasi db Anda dengan

tunjukkan pengguna

  1. Jika Anda mendapatkan {} objek kosong itu adalah pertanyaan. Anda hanya perlu mengetik

db.createUser ({user: "yourUser", pwd: "password", peran: ["readWrite", "dbAdmin"]})

atau

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


0

Saya memiliki masalah yang sama di sini di lingkungan Windows: Saya telah menginstal Bitnami DreamFactory dan juga menginstal MongoDb lain yang dimulai pada boot sistem. Saya menjalankan MongoDbService saya (yang dimulai tanpa kesalahan) tetapi saya perhatikan setelah kehilangan banyak waktu bahwa saya sebenarnya terhubung dengan Layanan MongoDb Bitnami. Silakan, lihat apakah tidak ada contoh lain dari mongoDB yang berjalan di server Anda.

Semoga berhasil!


2
Saya tidak tahu mengapa jawaban ini diturunkan; ini adalah saran yang sah. Sebagai contoh, saya telah mengalami konsol manajemen yang menjalankan Tomcat di bawah tenda. Jika Anda memulai server lokal (jenis apa pun), Anda kemungkinan akan memeriksa apakah server itu berjalan dengan mencoba menyambungkannya. Koneksi pertama itu akan berhasil. Anda kemudian akan bergulat dengan server "tersembunyi" sebelum memeriksa log server Anda dan memperhatikan bahwa server Anda tidak dapat mengikat ke port yang diinginkan.
Paul

0

Selain itu, perhatikan bahwa jika klien shell mongo Anda gagal terhubung dengan benar ke mongodinstance, Anda dapat menerima kesalahan "Permission Denied" tersebut.

Pastikan klien Anda membuka koneksi dengan memeriksa port koneksi, tetapi juga bahwa port yang Anda gunakan mongodtidak digunakan. Anda dapat mengatur port yang berbeda dengan menggunakan --port <port>parameter di shell dan proses.


0

Saya mengalami masalah ini karena nama host di Kompas MongoDB saya menunjuk ke admin sebagai ganti proyek saya. Diperbaiki dengan menambahkan / projectname setelah nama host :) Coba ini:

  1. Pilih proyek Anda di situs web atlas MongoDB
  2. Hubungkan / Hubungkan dengan Kompas MongoDB
  3. Unduh Kompas / Pilih OS Anda
  4. Saya menggunakan Kompas 1.12 atau lebih baru
  5. Salin string koneksi di bawah Kompas 1.12 atau lebih baru.
  6. Buka MongoDB Compass / Connect (kiri atas) / Connect To
  7. Sambungan Koneksi terdeteksi / Ya /
  8. Tambahkan nama proyek Anda setelah nama host: cluster9-foodie.mongodb.net/ projectname
  9. Hubungkan & Menguji API dengan POSTMAN.
  10. Berhasil.

Gunakan string koneksi yang sama dalam kode Anda juga:

  1. Sebelum:
    • mongodb + srv: // projectname: password @ cluster9-foodie.mongodb.net / admin
  2. Setelah:
    • mongodb + srv: // projectname: password @ cluster9-foodie.mongodb.net / projectname

Semoga berhasil.


0

gunakan mydb
db.createUser ({user: "test", pwd: "secret", peran: ["readWrite", "dbAdmin"], passwordDigestor: "server"})


0

Setuju bahwa Anda harus mendapatkan autentikasi ke admin db dan memerlukan setidaknya peran dengan hak istimewa yang benar yang akan menghindari 'pengecualian host lokal' dari DB (ini untuk host mongoDB di lokasi), meskipun Anda sudah menyiapkan semuanya & masih mendapatkan pengecualian tidak sah pada hampir setiap perintah, saat mengakses mongoDB yang dibuat menggunakan Mongo Atlas , maka di sini adalah tempat di mana Anda mungkin tahu alasannya, mengapa:

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

dan juga periksa ini jika Anda meng-host mongoDB di 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" 
    ]
    }
    )

Terima kasih atas cuplikan kode ini, yang mungkin memberikan bantuan jangka pendek terbatas. Penjelasan yang tepat akan sangat meningkatkan nilai jangka panjangnya dengan menunjukkan mengapa ini adalah solusi yang baik untuk masalah ini, dan akan membuatnya lebih bermanfaat bagi pembaca masa depan dengan pertanyaan lain yang serupa. Harap edit jawaban Anda untuk menambahkan beberapa penjelasan, termasuk asumsi yang Anda buat.
Toby Speight

0

Saya mengikuti langkah-langkah ini pada Centos 7 untuk MongoDB 4.2. (Pengguna jarak jauh)

Perbarui file mongod.conf

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

Mulai iblis layanan MongoDB

systemctl start mongod

Buka shell MongoDB

mongo

Jalankan perintah ini pada shell

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

Pengguna root jarak jauh telah dibuat. Sekarang Anda dapat menguji koneksi database ini dengan menggunakan alat GUI MongoDB dari mesin dev Anda. Seperti Robo 3T


-10

Ini mungkin karena Anda belum menyetel noAuth = true di mongodb.conf

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

Setelah mengatur ini restart layanan menggunakan

layanan mongod restart


1
Pengguna mengatakan secara eksplisit bahwa ia ingin mulai menggunakan otorisasi sehingga ia membatalkan komentar auth = true. Mengapa Anda menyarankan untuk menonaktifkan otorisasi!?
Alex 75

Saya kira Anda tidak membaca masalahnya ... OP ingin auth, kombinasi respons s-hunter untuk mengatur pengguna dan jremi untuk menghubungkan ke konfigurasi khusus
ChrisN
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.