はじめに
ユーザーと認証の管理は、MongoDB サーバーを管理する上で最も重要な管理タスクの一部です。サーバーがユーザーとアプリケーションを適切に識別し、正しく認証できない接続または操作を拒否できるように構成されていることを確認する必要があります。
これらの要件を管理するには、サーバーに必要なユーザーを決定し、それらのアカウントを作成できる必要があります。このプロセスの一環として、新しい ID を使用して外部アクセスを許可するように認証の詳細を設定できます。
このガイドでは、ユーザーアカウントの作成、表示、および削除の方法について説明します。アカウントの認証を設定する方法と、ユーザーパスワードを変更する必要がある場合に資格情報を更新する方法について説明します。
MongoDB を使用している場合は、Prisma のMongoDB コネクタをチェックしてください!Prisma Client を使用すると、本番環境の MongoDB データベースを自信を持って管理できます。
MongoDB と Prisma の使用を開始するには、ゼロから始めるガイド、または既存のプロジェクトに追加する方法をチェックしてください。
前提条件
このガイドに従うには、適切な特権を持つMongoDBサーバーのアカウントが必要です。
使用するコマンドとメソッド
MongoDB 内でユーザーを作成、変更、削除し、認証を設定するために必要なコアメソッドは次のとおりです。
db.createUser
: 新しい MongoDB ユーザーアカウントを作成するdb.updateUser
: ユーザーアカウントの詳細を更新するdb.changeUserPassword
: ユーザーアカウントで使用されるパスワードを変更するdb.dropUser
: MongoDB ユーザーアカウントを削除する
さらに、次のデータベースコマンドは、システム上のユーザーに関する情報を見つけるのに役立ちます。
db.runCommand('usersInfo')
: 1 つ以上の MongoDB ユーザーアカウントに関する情報を表示する
必要な特権
上記のコマンドを実行するには、多くの異なる特権アクションを持つアカウントで MongoDB にログインする必要があります。必要な特定の特権は、使用する必要があるコマンドによって異なります。
他のユーザーに関する情報を取得するには、現在のユーザーが次の特権アクションを有効にする必要があります。
新しいユーザーを作成するには、現在のユーザーが次の特権アクションを有効にする必要があります。
ユーザーのパスワードまたはアカウントの詳細を変更するには、次の特権が必要になる場合があります。
changeOwnPassword
特権アクション:自分自身のアカウントパスワードを変更する場合changeOwnCustomData
特権アクション:自分自身のアカウントのカスタムデータを変更する場合changePassword
特権アクション:他のユーザーのパスワードを変更する場合changeCustomData
特権アクション:他のユーザーのカスタムデータを変更する場合
このガイドではロール管理については説明しないため、grantRole
および revokeRole
特権アクションは必要ありません。
ユーザーアカウントを削除するには、現在のユーザーが次の特権アクションを有効にする必要があります。
MongoDB がユーザーと認証を実装する方法の理解
アカウントの作成と管理を開始する前に、MongoDB がこの情報をどのように定義および保存するかを理解しておくと役立ちます。
MongoDB では、ユーザーアカウントは、特定認証データベースとアカウントユーザー名の組み合わせです。認証データベースは、ユーザーが定義されているデータベースにすぎず、スコープまたは権限の制限を意味するものではありません。認証データベースは、他のデータを管理するために使用される通常のデータベースであり、特別な専用データベースではありません。
ユーザーアカウント名は、認証データベース内で一意である必要があります。ただし、同じユーザー名を別の認証データベースで再利用して、新しい個別ユーザーアカウントを作成できます。
この設計の結果として、アカウントはユーザー名と認証データベースを含めることによってのみ正確に識別できます。アカウントを認証するには、アカウントに関連付けられた資格情報を提供できる必要もあります。これは通常パスワードですが、証明書の場合もあります。
ユーザーを作成するには?
MongoDB がユーザーアカウントをどのように概念化するかを見てきたので、新しいユーザーを作成する方法について説明できます。ガイドに従うには、適切な特権を持つユーザーで MongoDB サーバーにログインすることを忘れないでください。
新しいユーザーを作成するには、まず新しいユーザーの認証データベースとして使用するデータベースに切り替える必要があります。
まず、システムにすでに構成されているデータベースのリストを取得するには、次のように入力します。
show dbs
admin 0.000GBconfig 0.000GBlocal 0.000GB
ユーザーが関連付けられるデータベースに use
コマンドを使用して切り替えます。
use admin
switched to db admin
新しいユーザーを作成するには、db.createUser()
メソッドまたは createUser
データベースコマンドを使用できます。いずれの方法でも、ユーザー名(user
フィールド)、パスワード(pwd
フィールド)、およびユーザーを追加する必要があるロールの配列(roles
キー)を user
オブジェクト内で渡す必要があります。
db.createUser()
メソッドを使用して、パスワードが hellothere
に設定され、空のロール配列を持つ tom
という名前の新しいユーザーを作成するには、次のように入力します。
db.createUser({user: "tom",pwd: "hellothere",roles: []})
Successfully added user: { "user" : "tom", "roles" : [ ] }
createUser
データベースコマンドを使用した同じ操作は、次のようになります。
db.runCommand({createUser: "tom",pwd: "hellothere",roles: []})
Successfully added user: { "user" : "tom", "roles" : [ ] }
2 つの異なるオプションは非常によく似ているため、今後は可能な場合はデータベースメソッドのみを表示します。ただし、データベースコマンド構文を使用したい場合は、関連する各コマンドをMongoDB コマンドリファレンスドキュメントで見つけることができます。
上記のコマンドでは、user
オブジェクト内でパスワードをインラインで明示的に定義しました。パスワードがログに記録されて取得可能になるのを防ぐために、代わりに user
ドキュメント内で passwordPrompt()
メソッドを使用して、コマンドの実行時に MongoDB にパスワードの入力をインタラクティブに求めることができます。パスワードは表示されないため、コマンド履歴はクリーンになります。
db.createUser({user: "tom",pwd: passwordPrompt(),roles: []})
Enter password:Successfully added user: { "user" : "tom", "roles" : [ ] }
TLS/SSL が有効になっていない場合、パスワードはプレーンテキストでサーバーに送信されることに注意してください。
既存のユーザーを表示するには?
次に、既存のユーザーに関する情報を見つける方法を見てみましょう。
複数のユーザーを返すには、db.getUsers()
メソッドを使用して、現在のデータベース内のすべてのユーザーを表示できます。まず、クエリ対象のデータベースに切り替えます。
use admin
次に、db.getUsers()
メソッドを使用して、現在のデータベースに関連付けられているすべてのユーザーを返します。
db.getUsers()
[{"_id" : "admin.root","userId" : UUID("f5ded238-19c9-4886-b649-711ec36993cb"),"user" : "root","db" : "admin","roles" : [{"role" : "root","db" : "admin"}],"mechanisms" : ["SCRAM-SHA-1","SCRAM-SHA-256"]},{"_id" : "admin.tom","userId" : UUID("e7a0abde-a9f9-412a-bfd5-eb11fda41fd3"),"user" : "tom","db" : "admin","roles" : [ ],"mechanisms" : ["SCRAM-SHA-1","SCRAM-SHA-256"]}]
さらに各ユーザーの資格情報情報を表示するには、showCredentials
キーを true
に設定したオブジェクトをメソッドに渡します。
use admindb.getUsers({showCredentials: true})
[{"_id" : "admin.root",. . ."credentials" : {"SCRAM-SHA-1" : {"iterationCount" : 10000,"salt" : "WpB0H4f7dG8XlCDyaVzarA==","storedKey" : "b11nA1+mGo3+Tr8P//u3NEdJLHk=","serverKey" : "3xE8o663hjqySrMCQcXjSxmjmhk="},"SCRAM-SHA-256" : {"iterationCount" : 15000,"salt" : "UtsfNRedf2ek5tbWFoGs2g52U0H7Na44wV4rYA==","storedKey" : "mz9/qHnI79pNAIQm0MZTKZ0U3qFk0xhUDd2grvKtMdI=","serverKey" : "c/sA4j+I/29Ea1y07zxoMcBgHFoYTUAa6luX3Z9sToQ="}},. . .},{"_id" : "admin.tom",. . ."credentials" : {"SCRAM-SHA-1" : {"iterationCount" : 10000,"salt" : "qCbxWQSGt3QoN3S1aM5AEg==","storedKey" : "hypim5+m2wqbS1gc47o2itc7jew=","serverKey" : "h9myNoSvY2015yqvw3UldmJzZCg="},"SCRAM-SHA-256" : {"iterationCount" : 15000,"salt" : "lNtIVL79J8FF+uPaFfRMwPK079gfLEUrsQe3Qg==","storedKey" : "u8pgn3OJiZxIwEL7ryZkoAF5bnMefQEEsZDTXNDCTRY=","serverKey" : "BmmfVeikSA0DN1aZmyZP9NXi5owxGr1ZRmVX2XH8qVg="}},. . .}]
特定の基準に一致するユーザーをクエリするには、一致条件を定義する filter
キーを定義するオブジェクトを渡すことができます。
たとえば、root
ロールを持つ現在のデータベース内のすべてのユーザーに関する情報を取得するには、次のように入力できます。
use admindb.getUsers({filter: {"roles.role": "root"}})
[{"_id" : "admin.root","userId" : UUID("f5ded238-19c9-4886-b649-711ec36993cb"),"user" : "root","db" : "admin","roles" : [{"role" : "root","db" : "admin"}],"mechanisms" : ["SCRAM-SHA-1","SCRAM-SHA-256"]}]
特定のユーザーを取得するには、代わりに db.getUser()
メソッドを使用できます。これは db.getUsers()
メソッドのように機能しますが、単一のユーザーを返します。オブジェクトをメソッドに渡す代わりに、取得するユーザー名を含む文字列を渡します。
use admindb.getUser("tom")
{"_id" : "admin.tom","userId" : UUID("e7a0abde-a9f9-412a-bfd5-eb11fda41fd3"),"user" : "tom","db" : "admin","roles" : [ ],"mechanisms" : ["SCRAM-SHA-1","SCRAM-SHA-256"]}
オプションで、次のキーを true
に設定して、必要な追加情報を指定できる追加の args
オブジェクトを含めることができます。
showCredentials
: 通常の出力に加えて資格情報情報を表示します。showPrivileges
: 通常の出力に加えて特権情報を表示します。showAuthenticationRestrictions
: 通常の出力に加えて、アカウントの認証制限を表示します。
たとえば、上記のすべての情報を提供するように MongoDB に指示するには、次のように入力できます。
use admindb.getUser("tom",{showCredentials: true,showPrivileges: true,showAuthenticationRestrictions: true})
{"_id" : "admin.tom","userId" : UUID("e7a0abde-a9f9-412a-bfd5-eb11fda41fd3"),"user" : "tom","db" : "admin","mechanisms" : ["SCRAM-SHA-1","SCRAM-SHA-256"],"credentials" : {"SCRAM-SHA-1" : {"iterationCount" : 10000,"salt" : "qCbxWQSGt3QoN3S1aM5AEg==","storedKey" : "hypim5+m2wqbS1gc47o2itc7jew=","serverKey" : "h9myNoSvY2015yqvw3UldmJzZCg="},"SCRAM-SHA-256" : {"iterationCount" : 15000,"salt" : "lNtIVL79J8FF+uPaFfRMwPK079gfLEUrsQe3Qg==","storedKey" : "u8pgn3OJiZxIwEL7ryZkoAF5bnMefQEEsZDTXNDCTRY=","serverKey" : "BmmfVeikSA0DN1aZmyZP9NXi5owxGr1ZRmVX2XH8qVg="}},"roles" : [ ],"inheritedRoles" : [ ],"inheritedPrivileges" : [ ],"inheritedAuthenticationRestrictions" : [ ],"authenticationRestrictions" : [ ]}
MongoDB ユーザーのパスワードを変更するには?
ユーザーのパスワードを変更するには、db.changeUserPassword()
メソッドを使用できます。ここでも、コマンドを実行する前に、ユーザーの認証データベースに切り替える必要があります。
db.changeUserPassword()
メソッドは、変更するアカウントのユーザー名とアカウントの新しいパスワードの 2 つの引数を取ります。
たとえば、admin
データベースで認証されたユーザー tom
のパスワードを secretpassword
に変更するには、次のように入力します。
use admindb.changeUserPassword("tom", "secretpassword")
db.createUser()
メソッドと同様に、2 番目の引数にパスワードをインラインで指定する代わりに、passwordPrompt()
メソッドを使用できます。 MongoDB は、コマンドが実行されるとパスワードの入力を求めます。
use admindb.changeUserPassword("tom", passwordPrompt())
Enter password:
他のユーザーアカウントの詳細を変更するには?
ユーザーアカウントに関連付けられた他の情報を変更するには、db.updateUser()
メソッドを使用できます。ユーザーの詳細を更新する前に、必ずユーザーの認証データベースに切り替えてください。
db.updateUser()
メソッドでは、ユーザー名を指定し、更新するデータを含むオブジェクトを提供する必要があります。更新することを選択したフィールドはすべて新しい情報に完全に置き換えられるため、新しい情報のみを追加する場合は、オブジェクトに元のデータと新しいデータの両方を含めるようにしてください。
変更情報を含むコマンドに含めるオブジェクトには、さまざまなフィールドを含めることができます。それらを見ていきましょう。
customData
: ユーザーアカウントに関連付ける任意のデータ。roles
: ユーザーに付与されるロール。db.grantRolesToUser()
およびdb.revokeRolesFromUser()
メソッドを使用してロールメンバーシップを制御する方が、ロールを個別に追加および削除できるため、このキーで更新するよりも優れていることがよくあります。pwd
: ユーザーのパスワード。db.ChangeUserPassword()
メソッドを使用する方が、更新する必要があるフィールドがパスワードのみの場合は通常は簡単です。authenticationRestrictions
: ユーザーが接続できる IP アドレスまたは接続元の IP アドレスを制限できるアカウントの制限を指定します。このキーの値は、clientSource
またはserverAddress
を定義するオブジェクトまたは配列であり、有効な IP アドレスまたは範囲を指定する配列が含まれています。詳細については、MongoDB ドキュメントの認証制限を参照してください。mechanisms
: 資格情報に使用する特定の認証メカニズム。SCRAM-SHA-1
またはSCRAM-SHA-256
のいずれかまたは両方に設定できますが、新しいパスワードが現在提供されていない場合は、現在のメカニズムのサブセットにのみ変更できます。passwordDigestor
: ユーザーのパスワードを処理するコンポーネントを指定します。server
(デフォルト) またはclient
のいずれかを指定できます。
例として、admin
データベースに対して認証を行う tom
アカウントを更新して、authenticationRestrictions
フィールドを変更することにより、サーバー自体をホストする同じコンピューターからのみログインできるようにすることができます。
use admindb.updateUser("tom", {authenticationRestrictions: [ {clientSource: ["127.0.0.1", "::1"],serverAddress: ["127.0.0.1", "::1"]} ]})
ここで、MongoDB にユーザーに関する関連情報を表示するように要求すると、アカウントの追加の制限が表示されます。
use admindb.getUser("tom", {showAuthenticationRestrictions: true})
{"_id" : "admin.tom","userId" : UUID("e7a0abde-a9f9-412a-bfd5-eb11fda41fd3"),"user" : "tom","db" : "admin","mechanisms" : ["SCRAM-SHA-1","SCRAM-SHA-256"],"roles" : [ ],"authenticationRestrictions" : [{"clientSource" : ["127.0.0.1","::1"],"serverAddress" : ["127.0.0.1","::1"]}],"inheritedRoles" : [ ],"inheritedPrivileges" : [ ],"inheritedAuthenticationRestrictions" : [ ]}
これらの制限を取り消すには、空の配列でコマンドを再度実行できます。
use admindb.changeUser("tom", {authenticationRestrictions: []})
MongoDB ユーザーを削除するには?
MongoDB ユーザーアカウントを削除するには、db.dropUser()
メソッドを使用できます。削除する前に、必ずユーザーの認証データベースに接続してください。
db.dropUser()
メソッドを実行するには、削除するユーザーの名前を指定する必要があります。
db.dropUser("tom")
削除に成功すると、MongoDB は true
を返します。
true
アカウントが現在のデータベースに存在しない場合、代わりに false
を返します。
結論
MongoDB のユーザー管理と認証構成により、サーバーに接続できるユーザーとそのユーザープロパティを制御できます。次の記事では、ユーザー管理の認可部分に取り組むことで、ユーザーが持つアクセスレベルを制限する方法について説明します。
MongoDB を使用している場合は、Prisma のMongoDB コネクタをチェックしてください!Prisma Client を使用すると、本番環境の MongoDB データベースを自信を持って管理できます。
MongoDB と Prisma の使用を開始するには、ゼロから始めるガイド、または既存のプロジェクトに追加する方法をチェックしてください。
FAQ
MongoDB で既存のユーザーを一覧表示するには、db.getUsers()
メソッドを使用して、現在のデータベース内のすべてのユーザーを表示できます。
構文は次のようになります。
use admindb.getUsers()
db.getUsers()
の詳細について。
MongoDB でデータベース管理者ユーザーを作成するには、admin
データベースで db.createUser()
メソッドを使用する必要があります。
以下は、データベース管理者を作成するために使用する構文を示しています。
use admindb.createUser({ user: "tom",pwd: "hellothere",roles:[{role: "dbAdmin" , db:"admin"}]})
MongoDB ユーザーを削除するには、db.dropUser()
メソッドを使用できます。これは admin
データベースで行う必要があり、構文は次のようになります。
use admindb.dropUser("tom")
MongoDB 内の既存のすべてのユーザーのリストを取得するには、db.getUsers()
メソッドを使用できます。
基本的な構文は次のようになります。
use admindb.getUsers()
特定のユーザーをクエリするには、showPrivileges
arg
を true
に設定して db.getUser()
メソッドを使用できます。
基本的な構文は次のようになります。
use admindb.getUser("tom",{showPrivileges: true,})