Сменить пароль администратора монго на арбитре

У меня есть набор реплик mongoDB, который имеет 3 БД - ПЕРВИЧНЫЙ / ВТОРИЧНЫЙ + Арбитр. Все 3 были установлены одинаково - это означает, что они имеют базу данных администратора с паролем по умолчанию.

Теперь я хочу изменить пароли по умолчанию. На первичном / вторичном это работало хорошо.

mongo admin -u admin -p <password> --authenticationDatabase=admin
db.changeUserPassword("admin",<new password>)

Однако - в арбитре это не работает (даже после добавления rs.slaveOK() в ПЕРВИЧНОМ)

Я собираюсь:

2016-12-01T00:18:51.408-0800 E QUERY    [thread1] Error: Updating user failed: not master :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.updateUser@src/mongo/shell/db.js:1319:15
DB.prototype.changeUserPassword@src/mongo/shell/db.js:1323:9
@(shell):1:1

Любые идеи, как изменить пароль администратора арбитра?

1 ответ

Решение

Как вы входите в арбитр?

Как и в MongoDB 3.4, арбитры в наборе реплик не реплицируют никаких данных (включая информацию о пользователе / ​​роли). Следствием этого является то, что вы обычно можете войти в арбитр через исключение localhost, если это не было специально отключено установкой enableLocalhostAuthBypass в false,

Существует соответствующий запрос функции, который вы можете поднять / просмотреть: SERVER-5479: Арбитр в наборе аутентифицированных реплик должен разрешать и требовать входа / авторизации для операций только для администратора.

Что если у арбитра были пользовательские данные до того, как они были добавлены в набор реплик?

В вашем конкретном случае кажется, что ваш арбитр уже имел некоторые данные аутентификации до mongod был настроен как член набора реплик. Это не ожидаемое (или поддерживаемое) развертывание, поэтому для удаления или обновления данных аутентификации необходимо запустить арбитр в качестве автономного сервера.

Чтобы удалить любую информацию о пользователе:

  1. Останови арбитра.
  2. Запустите арбитр на другом порту без --replSet, --keyfile, или же --auth параметры, гарантирующие, что другие члены набора реплик не смогут подключиться к арбитру, пока вы вносите изменения в автономном режиме.

    Например: mongod --dbpath /path/to/data --port 28000 --fork

  3. Аутентификация теперь должна быть отключена. Использовать mongo оболочка, чтобы уронить admin база данных:

    mongo localhost:28000/admin --eval 'db.dropDatabase()'
    
  4. Отключить арбитр, например:

    mongo localhost:28000/admin --eval 'db.shutdownServer()'
    
  5. Запустите арбитр с вашей обычной конфигурацией.

Вы также можете изменить пароль (вместо admin база данных), но это может сбивать с толку, поскольку от арбитров не ожидается получения пользовательских данных. Результат проверки подлинности против арбитра не определен, и в будущем реализация SERVER-5479 вряд ли будет поддерживать ранее существующие данные об арбитрах. Как только информация о пользователе / ​​роли будет реплицирована на арбитров, ожидается, что данные будут согласованными.

Я опаздываю на вечеринку, но с SERVER-32205 удаление базы данных администратора запрещено. Так что обходной путь, предложенный Stennie, к сожалению, больше не работает (начиная с версии 3.6.3). Тем не менее, существует даже более простой обходной путь, если большая часть набора реплик еще не запущена:

  • отключить арбитр
  • удалите содержимое папки db: rm -rf [your-data-folder]/db/*
  • начать арбитр

Арбитр автоматически присоединится к набору реплик. Пока включено исключение localhost (с помощью параметра enableLocalhostAuthBypass), вы можете подключаться к арбитру (только) из localhost и выполнять команды mongodb на арбитре.

Другие вопросы по тегам