MongoDB - usuário administrador não autorizado

200

Estou tentando adicionar autorização ao meu MongoDB.
Estou fazendo tudo isso no Linux com o MongoDB 2.6.1.
Meu arquivo mongod.conf está no antigo formato de compatibilidade
(foi assim que veio com a instalação).

1) Criei um usuário administrador conforme descrito aqui em (3)

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

2) Eu editei mongod.conf descomentando esta linha

auth = true

3) Finalmente reiniciei o serviço mongod e tentei fazer o login com:

/usr/bin/mongo localhost:27017/admin -u sa -p pwd

4) Posso conectar, mas diz isso ao conectar.

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) Agora parece que esse sausuário que eu criei não tem permissões.

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 >>>

Qual é o problema? Repeti todo esse procedimento três vezes e
acho que fiz tudo conforme especificado nos documentos do MongoDB. Mas isso não funciona.
Eu esperava que esse sausuário estivesse autorizado a fazer qualquer coisa para
poder criar outros usuários e conceder permissões mais específicas.

peter.petrov
fonte
20
Isso é muito chato ou mal documentado. Eu estava lutando lá. No final, eu tenho um usuário com o papel global "raiz" ans ainda não pode fazer algumas coisas como executar comandos ...
ToBe

Respostas:

471

Eu também estava coçando a cabeça com o mesmo problema e tudo funcionou depois que eu defini a função como raiz ao adicionar o primeiro usuário administrador.

use admin
db.createUser(
  {
    user: 'admin',
    pwd: 'password',
    roles: [ { role: 'root', db: 'admin' } ]
  }
);
exit;

Se você já criou o adminusuário, pode alterar a função da seguinte maneira:

use admin;
db.grantRolesToUser('admin', [{ role: 'root', db: 'admin' }])

Para obter uma referência completa das configurações de autenticação, consulte as etapas que compilei após horas de pesquisa na Internet.

caçador
fonte
154
WTF ?! perdeu uma hora para uma coisa estúpida como esta. Por que eles colocam documentação em userAdminAnyDatabasevez de root?
Akostadinov 04/04
15
a idéia é que você primeiro crie um usuário usado apenas para administrar outros usuários (portanto, a função que começa com "userAdmin") e somente depois crie seus usuários normais. isso meio que faz sentido, mas eu não entendi direito da primeira vez também ... @akostadinov
TomTasche 5/17
10
Isto não funcionou para mim no MongoDB v3.4.7:db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])
user124384
2
@Cerin Este código DID trabalho para mim: db.grantRolesToUser('admin',[{ role: "root", db: "admin" }]), e isso me deixa confuso. Não estou autorizado a executar um comando e, no entanto, posso executar um comando para me tornar root e, em seguida, executar esse comando. Muito estranho: S
2
para aqueles em que db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])fez não trabalho, certifique-se de voltar para use admin... tive o mesmo problema, uma vez que eu mudei de volta funcionou como um charme
esko22
37

É um pouco confuso - acredito que você precisará se permitir readWrite para consultar um banco de dados. Um usuário com dbadmin ou useradmin pode administrar o banco de dados (incluindo a concessão de direitos adicionais), mas não pode executar consultas ou gravar dados.

conceda a si mesmo readWrite e você ficará bem -

http://docs.mongodb.org/manual/reference/built-in-roles/#readWrite

John Petrone
fonte
Não tenho certeza se essa resposta é relevante para a pergunta, mas de qualquer forma fornece informações incorretas. A função dbOwner inclui a função readWrite
Andy Triggs
10
a resposta está correta - as funções dbadmin e useradmin (que é sobre o que o pôster original perguntou) não incluem readWrite. O dbOwner faz, mas não é isso que o pôster original estava usando e estava perguntando.
John Petrone 26/09
3
Você está absolutamente correto. Desculpas. Eu havia passado muito tempo discutindo papéis e fiquei confuso.
Andy Triggs
Para que você possa ter um usuário administrador para acessar o servidor mongodb real e depois ter outros para bancos de dados específicos?
K - A toxicidade no SO está crescendo.
32

Talvez um exemplo rápido de como alterar um usuário atual seja útil para alguém. Era isso que eu estava realmente procurando.

Seguindo o conselho de @JohnPetrone eu adicionei função readWrite ao meu usuário administrador com grantRolesToUser

> use admin
> db.grantRolesToUser("admin",["readWrite"])
> show collections
system.users
system.version
Bart C
fonte
26

Você pode tentar: Usar o sinalizador --authenticationDatabase ajuda.

mongo --port 27017 -u "admin" -p "password" --authenticationDatabase "admin"
jremi
fonte
8

Eu sei que esta resposta está chegando muito tarde neste tópico, mas espero que você verifique.

O motivo pelo qual você obtém esse erro é baseado na função específica que você concedeu ao usuário, que você reuniu até agora, e sim em atribuir a esse usuário a função root resolverá seu problema, mas você deve primeiro entender o que essas funções fazem exatamente antes de concedê-las para os usuários.

No tutorial, você concedeu ao usuário o userAdminAnyDatabase função que basicamente oferece ao usuário a capacidade de gerenciar usuários de todos os seus bancos de dados. O que você estava tentando fazer com o usuário estava fora da definição de função.

O rootpapel tem esse papel incluído na definição, bem como no readWriteAnyDatabase,dbAdminAnyDatabase e outros papéis tornando-se um superusuário (basicamente porque você pode fazer qualquer coisa com ele).

Você pode verificar as definições de função para ver quais funções você precisará fornecer aos usuários para concluir determinadas tarefas. https://docs.mongodb.com/manual/reference/built-in-roles/ Não é recomendável tornar todos os seus usuários super :)

el Punch
fonte
Então, se não a raiz, qual o papel que você sugere para resolver o problema?
Hendy Irawan
Olá @HendyIrawan, sugiro que você decida o que exatamente deseja que cada um de seus usuários possa fazer e dê a eles a função que lhes permite fazer apenas isso. Por exemplo, se você deseja apenas que um usuário leia (que é o que a pergunta tenta fazer show collections), você deve dar a ele essa capacidade e nada mais roles: [ { role: "read", db: "admin" } ]. Observe que a função aqui é lida, é específica do banco de dados e você não pode fazer nada além disso. Confira este link para outras funções docs.mongodb.com/manual/reference/built-in-roles
el Punch
Portanto, a resposta para a pergunta aqui (não "por exemplo") é "lida"?
precisa
Sim. Observe que o usuário só poderá ler o db especificado.
El-Punch
2

É uma pergunta simples.

  1. É importante que você deva mudar o destino db NOT admin.

use yourDB

  1. verifique sua autenticação db

mostrar usuários

  1. Se você receber um {} objeto vazio, essa é a questão. Você só precisa digitar

db.createUser ({user: "yourUser", pwd: "password", papéis: ["readWrite", "dbAdmin"]})

ou

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

cocoTW
fonte
0

Eu tive um problema semelhante aqui em um ambiente Windows: instalei o Bitnami DreamFactory e ele também instala outro MongoDb iniciado na inicialização do sistema. Eu estava executando meu MongoDbService (que foi iniciado sem nenhum erro), mas notei, depois de perder muito tempo, que estava de fato conectando-me ao Serviço MongoDb do Bitnami. Por favor, dê uma olhada se não houver outra instância do mongoDB em execução no seu servidor.

Boa sorte!

ibirite
fonte
2
Não sei por que essa resposta foi rebaixada; esta é uma sugestão legítima. Por exemplo, encontrei um console de gerenciamento que estava executando o Tomcat sob o capô. Se você iniciar um servidor local (de qualquer tipo), provavelmente verificará se está executando, tentando se conectar a ele. Essa primeira conexão terá sucesso. Você lutará com o servidor "oculto" antes de verificar os logs do servidor e perceber que o servidor não pôde se conectar à porta desejada.
Paul
0

Além disso, observe que, se o seu cliente mongo shell não conseguir se conectar corretamente à mongodinstância, você poderá receber esses erros "Permissão negada".

Verifique se o seu cliente abre uma conexão verificando a porta de conexão, mas também se a porta em que você está usando mongodnão está em uso. Você pode definir uma porta diferente usando o --port <port>parâmetro no shell e no processo.

Nick L.
fonte
0

Eu tive esse problema porque o nome do host no meu MongoDB Compass estava apontando para o administrador do meu projeto. Corrigido adicionando o / projectname após o hostname :) Tente o seguinte:

  1. Escolha seu projeto no site do atlas do MongoDB
  2. Conectar / Conectar com o MongoDB Compass
  3. Baixar Compass / Escolha seu SO
  4. Usei o Compass 1.12 ou posterior
  5. Copie a cadeia de conexão no Compass 1.12 ou posterior.
  6. Abra o MongoDB Compass / Connect (canto superior esquerdo) / Connect To
  7. Cadeia de conexão detectada / Sim /
  8. Anexe o nome do seu projeto após o nome do host: cluster9-foodie.mongodb.net/ projectname
  9. Conecte e teste a API com o POSTMAN.
  10. Ter sucesso.

Use a mesma cadeia de conexão no seu código também:

  1. Antes:
    • mongodb + srv: // nome do projeto : senha @ cluster9-foodie.mongodb.net / admin
  2. Depois de:
    • mongodb + srv: // projectname: password @ cluster9-foodie.mongodb.net / projectname

Boa sorte.

Mr. Dang
fonte
0

use mydb
db.createUser ({usuário: "teste", pwd: "segredo", funções: ["readWrite", "dbAdmin"], passwordDigestor: "servidor"})

user1797498
fonte
0

Concordou que você deve se autenticar no admin db e precisa de pelo menos uma função com privilégios corretos, o que evitaria a 'exceção de host local' do DB (isto é para o local hospedado no mongoDB), embora você tenha tudo no lugar e ainda recebendo exceções não autorizadas em quase todos os comandos, enquanto acessa o mongoDB que foi criado usando o Mongo Atlas , então aqui é o lugar onde você pode saber o motivo, por que:

/dba/219003/not-authorized-on-admin-to-execute-command-mongodb-atlas-m0-free-tier-cluster?newreg=471a9a26108243d78d4ca74a87e7a115

e verifique também se você já hospedou o mongoDB no mongo Atlas :

https://docs.atlas.mongodb.com/unsupported-commands/

Quem sou eu
fonte
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" 
    ]
    }
    )
Prathmesh Bijjargi
fonte
Obrigado por este trecho de código, que pode fornecer ajuda limitada a curto prazo. Uma explicação adequada melhoraria bastante seu valor a longo prazo, mostrando por que essa é uma boa solução para o problema e a tornaria mais útil para futuros leitores com outras perguntas semelhantes. Por favor edite sua resposta para adicionar alguma explicação, incluindo as suposições que você fez.
Toby Speight
0

Segui estas etapas no Centos 7 para o MongoDB 4.2. (Usuário remoto)

Atualizar arquivo mongod.conf

vi /etc/mongod.conf
   net:
     port: 27017
     bindIp: 0.0.0.0 
   security:
     authorization: enabled

Inicie o demon de serviço do MongoDB

systemctl start mongod

Shell MongoDB aberto

mongo

Execute este comando no shell

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

Usuário raiz remoto foi criado. Agora você pode testar essa conexão com o banco de dados usando qualquer ferramenta MongoDB GUI da sua máquina dev. Like Robo 3T

M. Hamza Rajput
fonte
-10

Isso pode ocorrer porque você não definiu noAuth = true no mongodb.conf

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

Após definir isso, reinicie o serviço usando

reinicialização do mongod de serviço

Buminda
fonte
1
O usuário diz explicitamente que deseja começar a usar a autorização e, assim, descomentou auth = true. Por que você sugere desativar a autorização!?
Alex 75
Eu acho que você não leu o problema ... OP quer auth, uma combinação da resposta do s-hunter para definir o usuário e o jremi para conectar-se a uma configuração personalizada
ChrisN