mongoへの認証ができない、「認証に失敗」


90

次の指示に従って、mongoの管理ユーザーを作成しました。

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

mongoクライアントから、私は認証できるように見えます:

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

しかし、他の方法では接続できません。例えば:

mongo -u admin -p SECRETPASSWORD

エラーを出します:

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

私は持っauth = trueていetc/mongod.confます。

何が欠けていますか?


1
たぶんMongoはlocalhostからの接続のみを受け入れるように設定されていますか?私のコンピューターからアクセスしようとしたときに、少なくとも私は本番のmongodbインスタンスを使用していた。
Akku 2013

そうは思いませんが、mongodと同じマシンから接続すると、そのエラーメッセージが表示されます。また、ユーザー名/パスワードを指定せずに接続し、db.authでユーザー名/パスワードを指定することもできます(最初の例)。
justkevin 2013

PS:db.changeUserPassword("admin", "password")各データベースのパスワードを変更します。
laggingreflex 2015

回答:


100

認証はデータベースレベルで管理されます。データベースを使用してシステムに接続しようとすると、mongoは実際に、コレクションで指定した資格情報をチェックします<database>.system.users。そのため、基本的に「test」に接続しようとすると、資格情報が検索され、test.system.users見つからないためにエラーが返されます(に格納されているためadmin.system.users)。すべてのデータベースから読み取りと書き込みを行う権限があるからといって、それらに直接接続できるわけではありません。

最初に資格情報を保持しているデータベースに接続する必要があります。試してください:

mongo admin -u admin -p SECRETPASSWORD

詳細については、http://docs.mongodb.org/manual/reference/privilege-documents/を確認してください


4
以下でも説明するように、別の回答では(投票した上位のものだけを見ていたので見逃しました)ログインする前に、ユーザー名とパスワードを一重引用符で囲む必要がありました
gsaslis

はい、二重引用符を使用すると、ばかばかしいbashはあらゆる種類の厄介なことを行う可能性があります。
moodboom

73

私もこのエラーを受け取りました。ユーザー認証データが保存されているデータベースを指定する必要がありました。

mongo -u admin -p SECRETPASSWORD --authenticationDatabase管理者

2017年11月18日更新:

mongo admin -u admin -p

より良いソリューションです。Mongoはパスワードの入力を要求します。これにより、クリアテキストのパスワードをシェルの履歴に入れないようにします。これは、ひどいセキュリティ対策です。


2
はい、この答えは機能します!これと@giloからの回答を組み合わせると、次のコマンドが機能します: "mongo MYDB -u admin -p SECRETPASSWORD --authenticationDatabase admin"
Tsung-Ting Kuo

38

mongoシェルをアップグレードする必要があるかもしれません。ローカルにmongoシェルのバージョン2.4.9があり、mongo 3データベースに接続しようとするとこのエラーが発生しました。シェルバージョンを3にアップグレードすると、問題が解決しました。


7
docに記載されているように、3.0より前のバージョンのmongoシェルは、アクセス制御を実施するMongoDBの3.0デプロイメントと互換性がありません。アクセス制御が必要な3.0 MongoDBデプロイメントがある場合は、3.0バージョンのmongoシェルを使用する必要があります。
Finch_Powers 2015

32

これは明らかなように見えるかもしれませんが、機能する前に、u / nとp / wを単一引用符で囲む必要がありました。

mongo admin -u 'user' -p 'password'


2
mongo -u <myuser> -p <mypasswdうまくいかなかったので、私はあなたの答えにつまずきました。adminここでなぜ違いが出るのですか?
Blz 2015年

2
mongoにデータベース管理者を使用するように指示します。別のデータベースを作成し、そのデータベースにユーザーを割り当てると、mongo <another_database> -u user -p password
Afriyandi Setiawan

どうもありがとうございます。これは本当に奇妙で、引用符も二重引用符も使用していませんでした。それはとてもばかげています。
さびた

20

MongoDB 3.0では、複数の認証メカニズムをサポートするようになりました。

  1. MongoDBチャレンジアンドレスポンス(SCRAM-SHA-1)-3.0のデフォルト
  2. MongoDBチャレンジアンドレスポンス(MONGODB-CR)-以前のデフォルト(<3.0)

新しいユーザーが作成された新しい3.0データベースから始めた場合、それらはSCRAM-SHA-1を使用して作成されているはずです。

したがって、その認証が可能なドライバーが必要になります。

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

既存のユーザーデータを使用してデータベースを2.xからアップグレードした場合、それらはまだMONGODB-CRを使用しており、ユーザー認証データベースをアップグレードする必要があります。

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

SCRAM-SHA-1で作成されたユーザーを使用してMongoDB 3.0に接続するには、認証データベースを指定する必要があり(コマンドラインmongoクライアントを介して)、ドライバーを使用する場合は他のメカニズムを使用します。

$> mongo -u USER -p PASSWORD --authenticationDatabase管理者

この場合、デフォルトでもある「admin」データベースが認証に使用されます。


この動作の変更は重要です。MongoDBの新しいバージョンとpymongoの古いバージョンを混在させると、つまづくからです。mongoインスタンスとすべてのmongoクライアントが最新であることを確認する必要があります。
i_grok 2016年

これは私のケースでした:1. mongo-java-driver-2.12.3.jarをmongo-java-driver-3.2.2.jarに変更しました2. MongoCredential.createMongoCRCredentialをMongoCredential.createCredentialに変更しました
nikolai.serdiuk

うん。開発者は私たちに「無効な認証方式」のような、より良いエラーを与えるためにいかに難しいか、それは次のようになります
バイロンホイットロック

13

表示された問題は、モンゴのドキュメントに記載された方法で作成されたユーザーは、そのユーザーが「userAdminAnyDatabase」と「dbAdminAnyDatabase」の役割を使用して作成された場合でも、デフォルトのデータベース(テスト)に接続する権限を持っていないということです。


同じ問題があります。彼らは、テストの代わりにadmin dbをデフォルトとして使用する方法かもしれません
Idan Shechter 2014年

13

これは私の問題を修正しました:

ターミナルシェルに移動し、と入力しmongoます。

次にと入力しuse db_nameます。

次に、次のように入力します。

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

また試してください: db.getUsers()

簡単なサンプル:

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

// MongoDB Connection Info
const url = 'mongodb://mongodb:dogmeatsubparflavour1337@stackoverflow.com: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);
  });

2
追加するには:1.最初にmongodb superadminで管理データベースにログインしますmongo 'mongodb://localhost:27017/admin' -u admin -p 。2.次にターゲットデータベースに切り替えます> use targetDb> db.createUser(...)
。3

3

別の可能性:ユーザーを作成したときに、誤って、または必要なuseデータベース以外のデータベースを使用していた可能性がありますadmin--authenticationDatabaseユーザーが実際に作成されたデータベースに設定する必要があります。

mongodbtestシェルを開いたときにデフォルトでデータベースに入れられるようですので、誤ってingしたの--authenticationDatabase testではなく、書き込む必要があり--authenticationDatabase adminますusetestあなたが実行したときdb.createUser(...)

mongodbインスタンスを実行しているマシンにアクセスできると想定すると、yは認証を無効にし/etc/mongod.confauthorizationセキュリティの下にネストされているコメント)、サーバーを再起動して実行できます。

mongo
show users

そして、あなたはこのようなものを得るかもしれません:

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

db値がに等しいことに注意してくださいtest。これは、ユーザーを作成したときに、最初にuse adminまたはを実行しなかったためuse desiredDatabaseNameです。したがって、次のようにしてユーザーを削除してdb.dropUser("myusername")から、目的のデータベースの下に別のユーザーを作成できます。

use desiredDatabaseName
db.createUser(...)

うまくいけば、それはこのようなもので初心者として私の立場にあった誰かを助ける。


3

MYSQlやほとんどのRDBMSとは異なり、MongoDBのセットアップは異なります。

組み込みの基本認証ユーザーは既にセットアップされていません。手動でセットアップする必要があります。Mongo.confに移動して認証を有効にする必要があります。許可しない場合は慎重に有効にしてください。そうしないと、mongoインスタンスの起動時にエラーがスローされます。次に、mongoサーバーが起動したかどうかを確認します。

次のステップは、Mongoでユーザーとして承認を有効にすることです。

rootアクセス権を持つユーザーを作成し、mongo auth configを変更する必要があります。

管理DBに切り替え:-

use admin

ルート権限を持つユーザーを作成します:-

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

mongo.confを変更して承認を有効にします。

security:
    authorization: "enabled"

MongoDBでのauthのセットアップに関するステップバイステップガイドをご覧ください。


2

これは特定のケースのようなものですが、私の問題で誰かがここに来た場合:

MongoHQでは、「パスワード」というフィールドが表示されますが、実際にはパスワードのハッシュにすぎません。新しいユーザーを追加し、別の場所にパスワードを保存する必要があります(MongoHQはパスワードを表示しないため)。


2

mongoシェルにログインする適切な方法は、

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


1

あなたもこれを試すことができます:-

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

この投稿で見つけました

ここで明らかにlocalhostは他のホストであることができ、/ adminは認証が適用された他のデータベースであることができます


0

mongoサーバーに接続しているクライアントのmongoバージョンを確認します。

私の場合、mongoサーバーはバージョンMongo4.0.0でしたが、私のクライアントはバージョン2.4.9でした。mongoのバージョンを更新して、mongo cliを更新します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.