web-dev-qa-db-ja.com

MongoDBはプレーンテキストのパスワードを実際に格納していませんか?

http://docs.mongodb.org/meta-driver/latest/legacy/implement-authentication-in-driver/ のドキュメントによると:

次に、ドライバーは、認証するデータベースに対して認証コマンドを実行します。 authenticateコマンドの構文は次のとおりです。

_db.runCommand( { authenticate : 1, user : <username>, nonce : <nonce>, key : <digest> }
_

_<username>_は、データベースのsystem.usersコレクションのユーザー名です。

_<nonce>_は、前のgetnonceステップから返されたナンスです。

_<digest>_は、MD5メッセージダイジェストの16進エンコーディングです。

MD5メッセージダイジェストは、_<nonce>_、_<username>_、_<password_digest>_の連結のMD5ハッシュです。

_<password_digest>_は、データベースの_<username>_コレクションの_system.users_に関連付けられているpwdフィールドの値です。 pwdMD5( <username> + ":mongo:" + <password_text> )の16進エンコーディングです。

これは、ドライバーがデータベース接続のクライアントの一部であるため、ハッシュは実際にはクライアント側で行われることを意味します。認証するために、クライアントはパスワードの知識ではなく、格納されているハッシュの知識を示す必要はありません。したがって、実際のパスワードは保存されたハッシュであり、これはたまたま何かをハッシュして生成されたものです。その実際のパスワードは、_system.users_のpwdフィールドにプレーンテキストで格納されます。

私はそれを間違って読んでいますか?この認証を保護する方法はありますか?

5
Svante

ある意味、それは正しいと考えることができます。

MongoDBのドキュメントから私が理解したことから、db.addUser()はすでにハッシュされたパスワードを渡すことを期待しています。これは、関数の documentation からはっきりとわかります。ここで、pwdフィールドの予期されるデータ型はhashです。

私はこれをMongoDBと読み、システムがデータベースへのユーザーの登録または認証の前にハッシュを実行することを期待しています。これは、MongoDBユーザーがパスワードハッシュを手動で入力する可能性が最も低いと考える場合に意味があります。これらのユーザーアカウントの使用例は、アプリケーションの認証資格情報として使用されるため、パスワードはどこかで構成ファイルに確実に保存されます。

MongoDBの エンタープライズバージョン は、認証にKerberosの使用をサポートしています。 Kerberosを設定する手順は documentations にもあります。これをセキュリティ要素として本当に心配している場合は、Kerberosの設定を検討する必要があります。

4
user10211

MongoDBはパスワードをプレーンテキストで保存しません。 MongoDB 3.0以降、MontDBのデフォルトの認証メカニズムはソルトチャレンジレスポンス認証メカニズム(SCRAM)です。 Scramは、SCRAM-SHA-1とSCRAM-SHA-256の両方のハッシュメカニズムをサポートしています。

そうは言っても、ドライバーを介してデータベースとやり取りする場合、これらはハッシュされたパスワードを受け入れることが多いため、プレーンテキスト形式でデータベースとの間で送受信されることはありません。開発者はDBサーバー内で使用されているのと同じアルゴリズムを使用して、最後にハッシュを実行する必要があるため、これは開発者に追加の責任を課します。幸いなことに、これらはほぼすべてのプログラミング言語で簡単に利用できます。

System.usersコレクションをクエリすると、次のようなドキュメントが返されます。

{
  "_id": "admin.123",
  "user": "123",
  "db": "admin",
  "credentials": {
    "SCRAM-SHA-1": {
      "iterationCount": 10000,
      "salt": "f9SdPCCcBOwk71/xDkj6Sw==",
      "storedKey": "83mNhTYctOdlYsL1sbnfpiA0uxw=",
      "serverKey": "09H9aEKKufaoCDxqUkHntx6EqrE="
    }
  },
  "roles": []
}

Navicat for MongoDB などの優れたDB管理ツールを使用して、ユーザーやその他のコレクションを詳しく調べることができます。 3つの形式(ツリー、JSON、グリッド)でドキュメントを表示できます。

Navicat Views

それがあなたの質問に答えることを願っています。

奪う

1
Rob Gravelle