изменить пароль администратора mongo на арбитре

У меня есть набор реплик 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

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

2
задан 1 December 2016 в 11:30
2 ответа

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

Как и в MongoDB 3.4, арбитры в наборе реплик не работают. реплицировать любые данные (включая детали пользователя / роли). Из этого следует, что обычно вы можете войти в систему арбитра через исключение локального хоста , если это не было специально отключено путем установки 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 вряд ли будет поддерживать ранее существовавшие данные об арбитрах. После того, как информация о пользователе / ​​роли реплицируется арбитрам, ожидается, что данные будут согласованными.

4
ответ дан 3 December 2019 в 09:32

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

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

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

1
ответ дан 3 December 2019 в 09:32

Теги

Похожие вопросы