共有

はじめに

ユーザーと認証の管理は、MongoDBサーバーを管理する上で最も重要な管理タスクの一部です。サーバーがユーザーとアプリケーションを適切に識別し、正しく認証できない接続や操作を拒否できるように構成されていることを確認する必要があります。

これらの要件を管理するには、サーバーが必要とするユーザーを決定し、それらのアカウントを作成できる必要があります。このプロセスの一部として、新しいIDを使用して外部アクセスを許可するように認証詳細を設定できます。

このガイドでは、ユーザーアカウントの作成、表示、削除の方法について説明します。アカウントの認証を設定する方法と、ユーザーパスワードを変更する必要があるときに資格情報を更新する方法について詳しく説明します。

前提条件

このガイドに沿って進めるには、適切な権限を持つMongoDBサーバー上のアカウントが必要です。

使用するコマンドとメソッド

MongoDB内でユーザーを作成、変更、削除し、認証を設定するために必要な主要なメソッドは次のとおりです。

  • db.createUser:新しいMongoDBユーザーアカウントを作成する
  • db.updateUser:ユーザーアカウントの詳細を更新する
  • db.changeUserPassword:ユーザーアカウントで使用されるパスワードを変更する
  • db.dropUser:MongoDBユーザーアカウントを削除する

さらに、システム上のユーザーに関する情報を見つけるのに役立つ次のデータベースコマンドがあります。

  • db.runCommand('usersInfo'):1つ以上のMongoDBユーザーアカウントに関する情報を表示する

必要な権限

上記のコマンドを実行するには、複数の異なる特権アクションを持つアカウントでMongoDBにログインする必要があります。必要な特定の権限は、使用する必要があるコマンドによって異なります。

他のユーザーに関する情報を取得するには、現在のユーザーに次の特権アクションが有効になっている必要があります。

新しいユーザーを作成するには、現在のユーザーに次の特権アクションが有効になっている必要があります。

ユーザーのパスワードまたはアカウントの詳細を変更するには、次の特権が必要になる場合があります。

このガイドではロール管理については扱いませんので、grantRoleおよびrevokeRole特権アクションは不要です。

ユーザーアカウントを削除するには、現在のユーザーに次の特権アクションが有効になっている必要があります。

MongoDBがユーザーと認証をどのように実装しているかを理解する

アカウントの作成と管理を開始する前に、MongoDBがこの情報をどのように定義し、保存しているかを理解するのに時間を割くことが役立ちます。

MongoDBでは、ユーザーアカウントはアカウントのユーザー名と特定の認証データベースの組み合わせです。認証データベースは、ユーザーが定義されているデータベースに過ぎず、スコープや権限の制限を意味するものではありません。認証データベースは、他のデータを管理するために使用される通常のデータベースであり、特別な専用データベースではありません。

ユーザーアカウント名は、その認証データベース内で一意である必要があります。ただし、同じユーザー名を別の認証データベースで再利用して、新しい個別のユーザーアカウントを作成することができます。

この設計の結果、アカウントはユーザー名と認証データベースを含めることによってのみ正確に識別できます。アカウントに認証するには、アカウントに関連付けられた資格情報を提供できる必要もあります。これは通常パスワードですが、証明書の場合もあります。

ユーザーはどのように作成しますか?

MongoDBがユーザーアカウントをどのように概念化しているかを見たので、新しいユーザーを作成する方法について説明できます。このガイドに沿って進めるには、適切な権限を持つユーザーでMongoDBサーバーにログインしてください。

新しいユーザーを作成するには、まず、新しいユーザーの認証データベースとして使用したいデータベースに切り替える必要があります。

まず、システムに既に構成されているデータベースのリストを、以下のように入力して取得できます。

show dbs
admin 0.000GB
config 0.000GB
local 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 admin
db.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 admin
db.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 admin
db.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 admin
db.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 admin
db.changeUserPassword("tom", "secretpassword")

db.createUser()メソッドと同様に、2番目の引数にパスワードをインラインで指定する代わりに、passwordPrompt()メソッドを使用できます。コマンドが実行されると、MongoDBはパスワードの入力を促します。

use admin
db.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 admin
db.updateUser("tom", {
authenticationRestrictions: [ {
clientSource: ["127.0.0.1", "::1"],
serverAddress: ["127.0.0.1", "::1"]
} ]
})

さて、MongoDBにユーザーに関する関連情報の表示を求めると、アカウントの追加制限が表示されます。

use admin
db.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 admin
db.changeUser("tom", {
authenticationRestrictions: []
})

MongoDBユーザーを削除するにはどうすればよいですか?

MongoDBユーザーアカウントを削除するには、db.dropUser()メソッドを使用できます。削除する前に、ユーザーの認証データベースに接続していることを確認してください。

db.dropUser()メソッドを実行するには、削除したいユーザーの名前を指定する必要があります。

db.dropUser("tom")

削除が成功すると、MongoDBはtrueを返します。

true

現在のデータベースにアカウントが存在しなかった場合、代わりにfalseを返します。

まとめ

MongoDBのユーザー管理と認証設定により、誰がサーバーに接続できるか、およびそのユーザープロパティを制御できます。次の記事では、ユーザー管理の承認部分を取り上げ、ユーザーが持つアクセスレベルを制限する方法について説明します。

FAQ

MongoDBで既存のユーザーを一覧表示するには、db.getUsers()メソッドを使用して現在のデータベース内のすべてのユーザーを表示できます。

構文は次のようになります。

use admin
db.getUsers()

db.getUsers()の詳細はこちら。

MongoDBでデータベース管理者ユーザーを作成するには、adminデータベースでdb.createUser()メソッドを使用します。

以下に、データベース管理者を作成するための構文を示します。

use admin
db.createUser(
{ user: "tom",
pwd: "hellothere",
roles:[{role: "dbAdmin" , db:"admin"}]})

MongoDBユーザーを削除するには、db.dropUser()メソッドを使用できます。これはadminデータベースで行う必要があり、構文は次のようになります。

use admin
db.dropUser("tom")

MongoDBで既存のすべてのユーザーのリストを取得するには、db.getUsers()メソッドを使用できます。

基本的な構文は次のようになります。

use admin
db.getUsers()

特定のユーザーをクエリするには、db.getUser()メソッドをshowPrivileges argtrueに設定して使用できます。

基本的な構文は次のようになります。

use admin
db.getUser("tom",
{
showPrivileges: true,
})
著者について
Justin Ellingwood

ジャスティン・エリングウッド

ジャスティンは2013年からデータベース、Linux、インフラストラクチャ、開発者ツールについて執筆しています。現在は妻と2匹のウサギとベルリンに住んでいます。彼は通常、三人称で書く必要がないため、関係者全員にとって安心です。
© . All rights reserved.