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пользователю будет разрешено делать все, чтобы
он мог затем создавать других пользователей и давать им более конкретные разрешения.

peter.petrov
источник
20
Это очень раздражает или плохо документировано. Я боролся там. В конце концов, у меня есть пользователь с глобальной «корневой» ролью, и он по-прежнему не может делать некоторые вещи, например, выполнять команды ...
ToBe

Ответы:

473

Я также ломал голову над той же проблемой, и все работало после того, как я установил роль как 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' }])

Для полной ссылки настройки аутентификации, см. Шаги, которые я скомпилировал после нескольких часов исследований в Интернете.

s-охотник
источник
154
WTF ?! потерял час на такую ​​глупость. Почему они помещают в документацию userAdminAnyDatabaseвместо root?
Акостадинов
15
Идея состоит в том, что вы сначала создаете пользователя, который используется только для администрирования других пользователей (следовательно, роль начинается с «userAdmin»), а только затем создаете ваших обычных пользователей. это имеет смысл, но с первого раза я тоже не понял ... @akostadinov
TomTasche
10
Это не сработало для меня в 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... была такая же проблема, как только я переключился обратно, это сработало как
чудо
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, а затем иметь других для определенных баз данных?
К - Токсичность в СО растет.
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"
jremi
источник
8

Я знаю, что этот ответ будет опубликован в этой теме очень поздно, но я надеюсь, что вы его проверите.

Причина, по которой вы получаете эту ошибку, основана на конкретной роли, которую вы предоставили пользователю, которую вы уже собрали, и да, предоставление этому пользователю роли 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
Таким образом, ответ на вопрос здесь (не «например») «читать»?
Хенди Ираван
Да. Обратите внимание, что пользователь будет иметь возможность только читать указанный дБ.
el Punch
2

Это простой вопрос.

  1. Важно, чтобы вы переключили целевой db, а не admin.

использовать свой DB

  1. проверьте вашу аутентификацию БД по

показать пользователям

  1. Если вы получили {} пустой объект, это вопрос. Вам просто нужно ввести

db.createUser ({пользователь: "yourUser", pwd: "пароль", роли: ["readWrite", "dbAdmin"]})

или

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

cocoTW
источник
0

У меня была похожая проблема здесь, в среде Windows: я установил Bitnami DreamFactory, и он также устанавливает другую MongoDb, которая запускается при загрузке системы. Я запускал свой MongoDbService (который был запущен без каких-либо ошибок), но, потеряв много времени, заметил, что фактически подключаюсь к службе MongoDb в Битнами. Пожалуйста, посмотрите, нет ли на вашем сервере другого экземпляра mongoDB.

Удачи!

Ибирите
источник
2
Я не знаю, почему этот ответ был отклонен; это законное предложение. Например, я столкнулся с консолью управления, на которой работал Tomcat. Если вы запустите локальный сервер (любого типа), вы, скорее всего, проверите его, попытавшись подключиться к нему. Это первое соединение будет успешным. Затем вы будете бороться со «скрытым» сервером, прежде чем проверять логи вашего сервера и замечать, что ваш сервер не может привязаться к нужному порту.
Пол
0

Кроме того, обратите внимание, что если ваш клиент оболочки mongo не может правильно подключиться к mongodэкземпляру, вы можете получить такие ошибки «Отказано в доступе».

Убедитесь, что ваш клиент открывает соединение, проверив порт соединения, но также и то, что используемый вами порт mongodне используется. Вы можете установить другой порт, используя --port <port>параметр как в оболочке, так и в процессе.

Ник Л.
источник
0

У меня была эта проблема, потому что имя хоста в моем MongoDB Compass указывало на admin вместо моего проекта. Исправлено путем добавления / имя проекта после имени хоста :) Попробуйте это:

  1. Выберите свой проект на веб-сайте MongoDB atlas
  2. Подключение / Подключение с MongoDB Compass
  3. Скачать компас / выбрать ОС
  4. Я использовал Компас 1.12 или позже
  5. Скопируйте строку подключения под Компас 1.12 или выше.
  6. Открыть MongoDB Compass / Подключиться (вверху слева) / Подключиться к
  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

использовать mydb
db.createUser ({пользователь: "тест", pwd: "секрет", роли: ["readWrite", "dbAdmin"], passwordDigestor: "сервер"})

user1797498
источник
0

Согласился с тем, что вам необходимо пройти аутентификацию на уровне администратора базы данных, и ему нужна как минимум роль с правильными привилегиями, которые позволят избежать «исключения локального хоста» из БД (это для локального хостинга 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" 
    ]
    }
    )
Пратмешь Биджарги
источник
Спасибо за этот фрагмент кода, который может предоставить некоторую ограниченную краткосрочную помощь. Правильное объяснение значительно улучшило бы его долгосрочную ценность, показав, почему это хорошее решение проблемы, и сделало бы его более полезным для будущих читателей с другими, похожими вопросами. Пожалуйста, измените свой ответ, чтобы добавить некоторые объяснения, в том числе предположения, которые вы сделали.
Тоби Спейт
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 с вашего компьютера разработчика. Лайк Робо 3Т

М. Хамза Раджпут
источник
-10

Это может быть потому, что вы не установили noAuth = true в mongodb.conf

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

После настройки перезапустите сервис, используя

перезапуск службы mongod

Buminda
источник
1
Пользователь явно говорит, что он хочет начать использовать авторизацию, поэтому он раскомментировал auth = true. Почему вы предлагаете отключить авторизацию!?
Алекс 75
Я полагаю, вы не читали проблему ... OP хочет auth, комбинацию ответов s-hunter для установки пользователя и jremi для подключения к пользовательской конфигурации
ChrisN