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
Це дуже дратує або погано документується. Я там боровся. Зрештою, у мене є користувач із глобальною «кореневою» роллю і досі не можу робити такі речі, як виконувати команди ...
ToBe

Відповіді:


476

Я також чухав голову навколо тієї самої проблеми, і все працювало після того, як я встановив роль root, коли додав першого користувача адміністратора.

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?
акостадінов

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" }])і це мене бентежить. Мені не дозволено запускати команду, і все ж я можу виконати команду, щоб зробити собі root, а потім виконати цю команду. Дуже дивно: S

2
для тих, у кого db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])не працювало, переконайтеся, що ви переключились на use admin…, мав те саме питання, як тільки я переключився назад, він спрацював як шарм
esko22

37

Це трохи заплутано - я вважаю, що вам потрібно буде дозволити собі readWrite для запиту бази даних. Користувач з dbadmin або useradmin може адмініструвати базу даних (включаючи надання собі додаткових прав), але не може виконувати запити або записувати дані.

тому дайте собі readWrite, і вам буде добре -

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


Я не впевнений, що ця відповідь стосується питання, але в будь-якому випадку вона дає неправильну інформацію. Роль dbOwner включає роль readWrite: docs.mongodb.org/manual/reference/built-in-roles/#dbOwner
Енді

10
відповідь правильна - ролі dbadmin та useradmin (про що запитував оригінальний плакат) не включають readWrite. DbOwner робить, але це не те, чим користувався оригінальний плакат і про що питав.
Джон Петроне

3
Ви абсолютно праві. Вибачення. Я провів занадто довгі розгублені ролі і збився з пантелику.
Енді Триггс,

Отже, ви можете мати користувача адміністратора для доступу до фактичного сервера mongodb, а потім мати інших для конкретних баз даних?
K - Токсичність в SO зростає.

32

Можливо, комусь буде корисний приклад того, як змінити поточного користувача. Це те, що я насправді шукав.

Дотримуючись поради @JohnPetrone, я додав роль readWrite моєму користувачеві адміністратора з grantRolesToUser

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

26

Ви можете спробувати: Використання прапора --authenticationDatabase допомагає.

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

9

Я знаю, що ця відповідь надто пізно в цій темі, але я сподіваюся, що ви це перевірите.

Причина, за якою ви отримуєте цю помилку, ґрунтується на конкретній ролі, яку ви надали користувачеві, яку ви вже зібрали, і так, надаючи цьому користувачеві роль root вирішить вашу проблему, але спочатку ви повинні зрозуміти, що саме ці ролі виконують, перш ніж надавати їх для користувачів.

У підручнику ви надали користувачеві userAdminAnyDatabaseроль, яка в основному дає користувачеві можливість керувати користувачами всіх ваших баз даних. Те, що ви намагалися зробити зі своїм користувачем, було поза його визначенням ролі.

rootРоль грає цю роль , включивши в нього визначення, а також readWriteAnyDatabase, dbAdminAnyDatabaseі інші ролі , роблячи його суперкористувача ( в основному через те , що ви можете зробити що - небудь з ним).

Ви можете переглянути визначення ролей, щоб побачити, які ролі вам знадобляться, щоб користувачі могли виконати певні завдання. https://docs.mongodb.com/manual/reference/built-in-roles/ Не рекомендується робити всіх своїх користувачів суперами :)


Отже, якщо не root, то яку роль ви пропонуєте для вирішення проблеми?
Хенді Іраван

Привіт, @HendyIrawan, я б запропонував вам вирішити, що саме ви хочете, щоб кожен з ваших користувачів міг це зробити, і надайте їм роль, яка дозволяє їм робити це тільки. Наприклад, якщо ви хочете лише, щоб користувач читав (що саме питання намагається зробити show collections), ви повинні надати йому цю здатність і нічого іншого roles: [ { role: "read", db: "admin" } ]. Зауважте, що роль тут читається, це специфічна база даних, і ви нічого не можете зробити, окрім цього. Перегляньте це посилання на інші ролі docs.mongodb.com/manual/reference/built-in-roles
el Punch

Отже, відповідь на питання тут (а не "наприклад") - "прочитане"?
Хенді Іраван

Так. Зауважте, що користувач матиме змогу лише читати вказаний db.
el Punch

2

Це просте запитання.

  1. Важливо, що ви повинні переключити цільовий db NOT адмін.

використовувати вашDB

  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 не вдається правильно підключитися до mongodекземпляра, ви можете отримати такі помилки "Відхилено дозвіл".

Переконайтесь, що ваш клієнт відкриває з'єднання, перевіривши порт з'єднання, але також, що порт, який ви використовуєте mongod, не використовується. Ви можете встановити інший порт, використовуючи --port <port>параметр і в оболонці, і в процесі.


0

У мене виникла ця проблема через те, що ім'я хоста в моєму MongoDB Compass вказувало на адміністратора замість мого проекту. Виправлено додаванням / ім'я проекту після імені хоста :) Спробуйте це:

  1. Виберіть проект на веб-сайті атласу MongoDB
  2. Підключення / підключення за допомогою MongoDB Compass
  3. Завантажте компас / виберіть ОС
  4. Я використовував компас 1,12 або новішої версії
  5. Скопіюйте рядок підключення в компас 1.12 або пізнішої версії.
  6. Відкрийте MongoDB Compass / Connect (вгорі ліворуч) / Connect to
  7. Виявлено рядок з'єднання / Так /
  8. Додайте назву свого проекту до імені хоста: cluster9-foodie.mongodb.net/ назви проекту
  9. Підключіть і випробували API з POSTMAN.
  10. Досягати успіху.

Використовуйте ту саму рядок з'єднання у своєму коді:

  1. Перед:
    • mongodb + srv: // ім'я проекту: пароль @ cluster9-foodie.mongodb.net / admin
  2. Після:
    • mongodb + srv: // ім'я проекту: пароль @ cluster9-foodie.mongodb.net / ім'я проекту

Удачі.



0

Домовились, що вам потрібно отримати автентифікацію для адміністрування 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' } ]
  }
);

Створений віддалений користувач root. Тепер ви можете протестувати це підключення до бази даних, використовуючи будь-який інструмент MongoDB GUI з вашої розроблювальної машини. Як 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

Я думаю, ви не прочитали проблему ... ОП хоче auth, поєднання відповіді s-мисливця для встановлення користувача та jremi's для підключення до власної конфігурації
ChrisN
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.