Não é possível autenticar no mongo, “falha de autenticação”

90

Criei um usuário administrador para mongo usando estas instruções:

http://docs.mongodb.org/manual/tutorial/add-user-administrator/

No cliente mongo, parece que posso autenticar:

> use admin
switched to db admin
> db.auth('admin','SECRETPASSWORD');
1
>

Mas não consigo conectar de outra maneira. Por exemplo:

mongo -u admin -p SECRETPASSWORD

dá o erro:

JavaScript execution failed: Error: 18 { code: 18, ok: 0.0, errmsg: "auth fails" } at src/mongo/shell/db.js:L228

Eu tenho auth = trueem etc/mongod.conf.

o que estou perdendo?

justkevin
fonte
1
Talvez o Mongo esteja configurado para aceitar apenas conexões de localhost? Isso pelo menos aconteceu comigo usando nossa instância mongodb de produção ao tentar acessá-lo do meu computador.
Akku
Acho que não, recebo essa mensagem de erro ao conectar da mesma máquina que mongod. Além disso, permite-me conectar sem fornecer um nome de usuário / senha e, em seguida, fornecer um nome de usuário / senha com db.auth (meu primeiro exemplo).
justkevin
PS: db.changeUserPassword("admin", "password")para alterar a senha de cada banco de dados.
laggingreflex

Respostas:

100

A autenticação é gerenciada no nível do banco de dados. Quando você tenta se conectar ao sistema usando um banco de dados, o mongo verifica as credenciais que você forneceu na coleção <database>.system.users. Então, basicamente quando você está tentando se conectar ao "teste", ele procura as credenciais em test.system.userse retorna um erro porque não consegue localizá-las (porque elas estão armazenadas em admin.system.users). Ter o direito de ler e escrever em todos os bancos de dados não significa que você pode se conectar diretamente a eles.

Você deve primeiro se conectar ao banco de dados que contém as credenciais. Experimentar:

mongo admin -u admin -p SECRETPASSWORD

Para obter mais informações, consulte http://docs.mongodb.org/manual/reference/privilege-documents/

gilo
fonte
4
como também é mencionado abaixo, em outra resposta (mas não entendi, pois só olhei os mais votados), eu precisei adicionar aspas simples ao redor do nome de usuário e senha, antes de poder fazer o login
gsaslis
Sim, se você usar aspas duplas, o bash idiota possivelmente fará todos os tipos de coisas desagradáveis.
moodboom
73

Também recebi este erro, o que eu precisava era especificar o banco de dados onde os dados de autenticação do usuário estavam armazenados:

mongo -u admin -p SECRETPASSWORD --authenticationDatabase admin

Atualização em 18 de novembro de 2017:

mongo admin -u admin -p

é a melhor solução. O Mongo solicitará sua senha, dessa forma você não colocará sua senha em texto não criptografado no histórico do shell, o que é uma prática de segurança terrível.

Chad E.
fonte
2
Sim, essa resposta funciona! Combinando isso com a resposta de @gilo, o seguinte comando funciona para mim: "mongo MYDB -u admin -p SECRETPASSWORD --authenticationDatabase admin"
Tsung-Ting Kuo
38

Você pode precisar atualizar seu shell mongo. Eu tinha a versão 2.4.9 do shell mongo localmente e recebi este erro ao tentar me conectar a um banco de dados mongo 3. Atualizar a versão do shell para 3 resolveu o problema.

lmyers
fonte
7
Conforme declarado no documento: As versões do shell mongo anteriores à 3.0 não são compatíveis com as implantações 3.0 do MongoDB que reforçam o controle de acesso. Se você tiver uma implementação do MongoDB 3.0 que requer controle de acesso, deverá usar as versões 3.0 do shell mongo.
Finch_Powers
32

Sei que pode parecer óbvio, mas também tive que usar uma aspa simples entre u / n e p / w antes de funcionar

mongo admin -u 'usuário' -p 'senha'

user3609666
fonte
2
Tropecei na sua resposta porque mongo -u <myuser> -p <mypasswdnão estava funcionando. Por que adminfaz a diferença aqui?
blz
2
diz ao mongo para usar o administrador do banco de dados. se você criar outro banco de dados e atribuir um usuário a esse banco de dados, será mongo <outro banco de dados> -u usuário -p senha
Afriyandi Setiawan
Muito obrigado. Isso é realmente estranho, eu estava usando aspas e não estava funcionando. Isso é tão bobo.
enferrujado
20

No MongoDB 3.0, agora ele oferece suporte a vários mecanismos de autenticação.

  1. Desafio e resposta do MongoDB (SCRAM-SHA-1) - padrão em 3.0
  2. Desafio e resposta do MongoDB (MONGODB-CR) - padrão anterior (<3.0)

Se você começou com um novo banco de dados 3.0 com novos usuários criados, eles teriam sido criados usando SCRAM-SHA-1.

Portanto, você precisará de um driver capaz dessa autenticação:

http://docs.mongodb.org/manual/release-notes/3.0-scram/#considerations-scram-sha-1-drivers

Se você tivesse um banco de dados atualizado do 2.x com dados de usuário existentes, eles ainda estariam usando o MONGODB-CR e o banco de dados de autenticação do usuário teria que ser atualizado:

http://docs.mongodb.org/manual/release-notes/3.0-scram/#upgrade-mongodb-cr-to-scram

Agora, conectar-se ao MongoDB 3.0 com usuários criados com SCRAM-SHA-1 é necessário para especificar o banco de dados de autenticação (via cliente mongo de linha de comando) e usar outros mecanismos se estiver usando um driver.

$> mongo -u USUÁRIO -p SENHA --authenticationDatabase admin

Nesse caso, o banco de dados "admin", que também é o padrão, será usado para a autenticação.

Lee Parayno
fonte
Essa mudança de comportamento é importante, pois me deixou confuso ao misturar uma nova versão do MongoDB e uma versão antiga do pymongo. Você precisa garantir que sua instância mongo e todos os clientes mongo estejam atualizados.
i_grok
Este foi o meu caso: 1. Alterei mongo-java-driver-2.12.3.jar para mongo-java-driver-3.2.2.jar 2. MongoCredential.createMongoCRCredential para MongoCredential.createCredential
nikolai.serdiuk
ugh. quão difícil seria para os desenvolvedores nos fornecerem um erro melhor como "método de autenticação inválido"
Byron Whitlock
13

Ele aparece o problema é que um usuário criado através do método descrito na documentação mongo não tem permissão para se conectar ao banco de dados padrão (teste), mesmo se o usuário foi criado com o "userAdminAnyDatabase" e papéis "dbAdminAnyDatabase".

justkevin
fonte
tem o mesmo problema. Pode ser uma maneira de usar o banco de dados do administrador como padrão em vez de teste
Idan Shechter
13

Isso resolveu meu problema:

Vá para o terminal do terminal e digite mongo.

Então digite use db_name .

Em seguida, digite:

 db.createUser(
   {
     user: "mongodb",
     pwd: "dogmeatsubparflavour1337",
     roles: [ { role: "dbOwner", db: "db_name" } ]
   }
 )

Tente também: db.getUsers()

Amostra rápida:

const MongoClient = require('mongodb').MongoClient;

// MongoDB Connection Info
const url = 'mongodb://mongodb:[email protected]:27017/?authMechanism=DEFAULT&authSource=db_name';
// Additional options: https://docs.mongodb.com/manual/reference/connection-string/#connection-string-options

// Use Connect Method to connect to the Server
MongoClient.connect(url)
  .then((db) => {
    console.log(db);
    console.log('Casually connected correctly to server.');
    // Be careful with db.close() when working asynchronously
    db.close();
  })
  .catch((error) => {
    console.log(error);
  });
agm1984
fonte
2
Para adicionar: 1. Faça login no banco de dados admin com mongodb superadmin primeiro: mongo 'mongodb://localhost:27017/admin' -u admin -p 2. Em seguida, mude para o banco de dados de destino: > use targetDb 3. Em seguida, adicione o usuário> db.createUser(...)
daniel.widyanto
3

Outra possibilidade: ao criar o usuário, você pode estar acidentalmente useacessando um banco de dados diferente adminou diferente daquele que deseja. Você precisa definir --authenticationDatabaseo banco de dados no qual o usuário foi realmente criado.

mongodbparece colocá-lo no testbanco de dados por padrão quando você abre o shell, então você precisa escrever --authenticationDatabase testmais do que --authenticationDatabase adminse você acidentalmente foram useing testquando você executoudb.createUser(...) .

Supondo que você tenha acesso à máquina que está executando a instância mongodb, y poderia desativar a autorização /etc/mongod.conf(comentário authorizationque está aninhado na segurança) e, em seguida, reiniciar o servidor e executar:

mongo
show users

E você pode obter algo assim:

{
    "_id" : "test.myusername",
    "user" : "myusername",
    "db" : "test",
    "roles" : [
        {
            "role" : "dbOwner",
            "db" : "mydatabasename"
        }
    ],
    "mechanisms" : [
        "SCRAM-SHA-1",
        "SCRAM-SHA-256"
    ]
}

Observe que o dbvalor é igual test. Isso porque, quando criei o usuário, não executei primeiro use adminou use desiredDatabaseName. Assim, você pode excluir o usuário com db.dropUser("myusername")e, em seguida, criar outro usuário no banco de dados desejado, como:

use desiredDatabaseName
db.createUser(...)

Espero que ajude alguém que estava na minha posição como um novato com essas coisas.


fonte
3

Ao contrário do MYSQl e da maioria dos RDBMS, o MongoDB tem uma configuração diferente.

Ele não vem com o usuário de autenticação básica embutido já configurado. Você precisa configurar manualmente. Você precisa ir para Mongo.conf e habilitar a Autorização. Habilite-o com cuidado, caso contrário, ocorrerá um erro ao iniciar sua instância do mongo. Você então verifica se o seu servidor mongo foi iniciado ou não.

A próxima etapa é ativar a autorização no Mongo como usuário: -

Precisamos criar um usuário que tenha acesso root e alterar a configuração de autenticação do mongo.

Mudar para Admin DB: -

use admin

Criar usuário com privilégio de raiz: -

 db.createUser({user:"admin",
                     pwd:"admin",
                    roles:[{role:"root",
                             db:"admin"
                            }] });

Altere seu mongo.conf para ativar a autorização: -

security:
    authorization: "enabled"

Siga este guia passo a passo para configurar a autenticação no MongoDB.

Sanjay-Dev
fonte
2

É um caso meio específico, mas caso alguém chegue aqui com o meu problema:

No MongoHQ, ele mostrará um campo chamado "senha", mas na verdade é apenas o hash da senha. Você terá que adicionar um novo usuário e armazenar a senha em outro lugar (porque o MongoHQ não a mostrará para você).

maxko87
fonte
2

A maneira correta de fazer o login no shell mongo é

mongo localhost: 27017 -u 'uuuuu' -p '> xxxxxx' --authenticationDatabase dbname

Moh .S
fonte
1

Você também pode tentar isso: -

mongo localhost:27017/admin -u admin -p SECRETPASSWORD

Encontrei nesta postagem

Aqui obviamente o localhost pode ser algum outro host e o / admin pode ser algum outro banco de dados no qual a autenticação foi aplicada

Kelsnare
fonte
0

Verifique a versão mongo do cliente de onde estamos conectando ao servidor mongo.

No meu caso, o servidor mongo era da versão Mongo4.0.0, mas meu cliente era da versão 2.4.9. Atualize a versão do mongo para atualizar o mongo cli.

Sandy
fonte