sql >> データベース >  >> NoSQL >> MongoDB

MongoDBでユーザーと認証を管理する方法


    はじめに

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

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

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



    前提条件

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


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

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

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

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

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


    必要な権限

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

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

    • viewUser 特権アクション

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

    • createUser 特権アクション
    • grantRole 特権アクション

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

    • changeOwnPassword 自分のアカウントのパスワードを変更するための特権アクション
    • changeOwnCustomData 自分のアカウントのカスタムデータを変更するための特権アクション
    • changePassword 他のユーザーのパスワードを変更するための特権アクション
    • changeCustomData 他のユーザーのカスタムデータを変更するための特権アクション

    このガイドでは役割管理については説明しません。そのため、grantRole およびrevokeRole 特権アクションは必要ありません。

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

    • dropUser 特権アクション



    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内 オブジェクト。

    tomという新しいユーザーを作成するには パスワードをhellothereに設定します db.createUser()を使用して空のroles配列を使用 メソッドには、次のように入力できます:

    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内でパスワードをインラインで明示的に定義しました。 物体。パスワードがログに記録されて取得できないようにするには、代わりにpasswordPrompt()を使用できます。 user内のメソッド コマンドの実行時に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"        ]}

    オプションで、追加のargsを含めることができます 次のキーをtrueに設定することにより、必要な追加情報を指定できるオブジェクト :

    • 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() methodは、変更するアカウントのユーザー名とアカウントの新しいパスワードの2つの引数を取ります。

    たとえば、ユーザーtomのパスワードを変更するには adminで認証されました secretpasswordへのデータベース 、次のように入力できます:

    use admindb.changeUserPassword("tom", "secretpassword")

    db.createUser()と同じように メソッドでは、passwordPrompt()を使用できます パスワードをインラインで提供する代わりに、2番目の引数のメソッド。コマンドの実行時にMongoDBはパスワードの入力を求めるプロンプトを表示します:

    use admindb.changeUserPassword("tom", passwordPrompt())
    Enter password:


    他のユーザーアカウントの詳細をどのように変更しますか?

    ユーザーアカウントに関連付けられている他の情報を変更するには、db.updateUser()を使用できます。 方法。詳細を更新する前に、必ずユーザーの認証データベースに切り替えてください。

    db.updateUser() このメソッドでは、ユーザー名を指定してから、更新するデータを含むオブジェクトを指定する必要があります。更新することを選択したフィールドはすべて新しい情報に完全に置き換えられるため、新しい情報を追加するだけの場合は、元のデータと新しいデータをオブジェクトに含めるようにしてください。

    変更情報とともにコマンドに含めるオブジェクトには、さまざまなフィールドを含めることができます。それらを調べてみましょう:

    • customData :ユーザーアカウントに関連付けられる任意のデータ。
    • roles :ユーザーに付与される役割。多くの場合、db.grantRolesToUser()を使用することをお勧めします およびdb.revokeRolesFromUser() 役割を個別に追加および削除できるため、このキーで更新するのではなく、役割のメンバーシップを制御する方法。
    • pwd :ユーザーのパスワード。 db.ChangeUserPassword()の使用 更新が必要なフィールドがそれだけの場合は、通常、メソッドの方が簡単です。
    • authenticationRestrictions :ユーザーが接続または接続できるIPアドレスを制限できるアカウントの制限を指定します。このキーの値は、clientSourceを定義するオブジェクトまたは配列です。 およびまたはserverAddress 、有効なIPアドレスまたは範囲を指定する配列が含まれています。認証制限に関するMongoDBドキュメントで詳細を確認してください。
    • mechanisms :資格情報に使用される特定の認証メカニズム。 SCRAM-SHA-1のいずれかまたは両方に設定できます またはSCRAM-SHA-256 、ただし、新しいパスワードが現在提供されていない場合にのみ、現在のメカニズムのサブセットに変更できます。
    • passwordDigestor :ユーザーのパスワードを処理するコンポーネントを指定します。 serverのいずれかになります (デフォルト)またはclient

    例として、tomを更新できます adminに対して認証するアカウント 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のユーザー管理と認証の構成により、サーバーに接続できるユーザーとそのユーザープロパティを制御できます。次の記事では、ユーザー管理の承認部分に取り組むことで、ユーザーが持つアクセスのレベルを制限する方法について説明します。




    1. MongooseError [MongooseServerSelectionError]:52.6.250.237:27017への接続<monitor>が閉じられました

    2. 集計フレームワークで完全なタイムスタンプが指定されている場合、日付で集計するにはどうすればよいですか?

    3. マングースの重みによる全文検索

    4. phpredisのmulti()呼び出し内の各呼び出しは、redisへの新しいネットワークラウンドトリップになりますか?