はじめに
ユーザーと認証の管理は、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
オブジェクト内に渡す必要があります。
空のロール配列でパスワードをhellothere
に設定したtom
という新しいユーザーをdb.createUser()
メソッドを使用して作成するには、次のように入力します。
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
を定義するオブジェクトまたは配列です。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()
特定のユーザーをクエリするには、db.getUser()
メソッドをshowPrivileges
arg
をtrue
に設定して使用できます。
基本的な構文は次のようになります。
use admindb.getUser("tom",{showPrivileges: true,})