@keybus

Исчезли БД MongoDB?

Доброго времени суток! Я пытался настроить доступ к бд по логину/паролю. Создал пользователя, под которым у меня не удалось авторизоваться, позже его "не существовало" в бд admin. После чего пропали все бд, созданные мною...

Кто-нибудь знает, что произошло в этой ситуации?
  • Вопрос задан
  • 296 просмотров
Решения вопроса 1
Lobotomist
@Lobotomist
Software Developer
Если сделать как вы описали - авторизация происходит успешно. Вероятно, где-то в процессе настройки, либо авторизации была допущена ошибка - например, пользователь создан не в той базе или что-то еще.

Листинг моей проверки
docker volume create testvol

docker run --rm --name test-mongo -v "testvol:/data/db" -d mongo
docker exec -it test-mongo mongo
use testDb;
db.createCollection("testCollection");
use admin;

db.createRole({
role: "Admin",
privileges: [{
resource: {
db: "testDb",
collection: "testCollection"
},
actions: ["anyAction", "internal"]
}],
roles: []
});

db.createUser({
user: "Admin",
pwd: "testpasswd",
roles: ["Admin"]
});

db.adminCommand({"listDatabases":1, "filter": {"name": "testDb"}, "nameOnly": true});
// { "databases" : [ { "name" : "testDb" } ], "ok" : 1 }
docker stop test-mongo

docker run --rm -v "testvol:/data/db" --name test-mongo -d mongo --auth

docker exec -it test-mongo mongo
db.adminCommand({"listDatabases":1, "filter": {"name": "testDb"}, "nameOnly": true});
//{
//        "ok" : 0,
//        "errmsg" : "command listDatabases requires authentication",
//        "code" : 13,
//        "codeName" : "Unauthorized"
//}

use admin;
db.auth("Admin", "testpasswd");
// 1
db.adminCommand({"listDatabases":1, "filter": {"name": "testDb"}, "nameOnly": true});
// { "databases" : [ { "name" : "testDb" } ], "ok" : 1 }


При отключенной авторизации все базы данных должны быть вам видны по идее. Возможно, созданный пользователь как-то мешает их видеть в админках, через которые вы проверяете, так что используйте команду `listDatabases` для чистоты эксперимента. Запустите базу с отключенной авторизацией, проверьте, что база есть. Если ее нет - вероятно тут уже проблема не связанная с авторизацией - напишите тут об этом. Найдите, где у вас создан пользователь Admin и удалите его.

docker run --rm -v "testvol:/data/db" --name test-mongo -d mongo
docker exec -it test-mongo mongo

use admin;
// switched to db admin
db.getUsers();
// [{ "_id" : "admin.Admin", ...
db.dropUser("Admin");
// true


После этого можно настроить пользователя заново. Возможно, имеет смысл создать "суперпользователя" - пользователя, под которым вы сможете администрировать базу без необходимости перезапускать сервер с отключенной авторизацией. Ведь пользователю Admin вы выдаете права только на одну коллекцию, а не на инстанс и он, я так понимаю, не сможет ни создать дополнительных бд, ни коллекций, ни пользователей.
Для этого можно использовать роль root, например.

И уже под этим пользователем продолжайте настройку.

Отмечу, что насчет разрешений, которые вы выдаете вашему пользователю написано:
> Do not assign this action unless it is absolutely necessary.

Стоит ему выдать ровно те разрешения, которые ему необходимы для текущей работы, а остальное делать из-под "суперпользователя".
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы