ネイティブ LDAP による自己管理型 Active Directory を使用したユーザーの認証と承認
MongoDB Enterprise は、Active Directory(AD)などの指定された LDAP(Lightweight Directory Access Protocol)サービスへのプロキシ認証と認可リクエスト用のプラットフォーム LDAP ライブラリ経由のサポートを提供します。
このチュートリアルでは、プラットフォーム ライブラリ経由で Active Directory(AD)サーバーを介して認証と認可を実行するように MongoDB を構成する方法について説明します。
注意
libldap
にリンクされた MongoDB 4.2 Enterprise バイナリ(RHEL で実行している場合など)の場合、 libldap
へのアクセスは同期され、パフォーマンスおよびレイテンシのコストが発生します。
libldap_r
にリンクされた MongoDB 4.2 Enterprise バイナリの場合、前の MongoDB バージョンから動作に変更はありません。
前提条件
重要
続行する前に、次の内容について十分に理解してください。
ADの完全な説明は、このチュートリアルの範囲外です。 このチュートリアルは、 ADに関する事前の知識がある を前提としています。
MongoDB は、MongoDB サーバーとADとの間のバインディングに SASL メカニズムを使用することをサポートしています。 SASL、SASL メカニズム、または特定の SASL メカニズムの具体的なAD構成要件の詳細な説明は、このチュートリアルの範囲外です。 このチュートリアルでは、SASL とそれに関連する事柄に関する事前の知識があることを前提としています。
内部ノード認証の構成
クラスターの LDAP 認証または認可を設定する前に、内部ノード認証を設定する必要があります。
Considerations
このチュートリアルでは、 AD 認証と承認のための MongoDB の構成について説明します。
独自の MongoDB サーバーでこの手順を実行するには、特定のインフラストラクチャ、特に Active Directory 構成、 ADクエリの構築、またはユーザーの管理に関して指定された手順を変更する必要があります。
トランスポート層のセキュリティ
デフォルトでは、MongoDB はMongoDBサーバーにバインドするときに TLS/SSL 接続を作成します。 これには、MongoDB サーバーのホストを、AD サーバーの証明機関(CA)証明書にアクセスできるように構成する必要があります。
このチュートリアルでは、必要なホスト構成に関する手順を説明します。
このチュートリアルでは、AD サーバーの CA 証明書にアクセスし、MongoDB サーバー上に証明書のコピーを作成できることを前提としています。
usernames
$external
認証ユーザー(Kerberos、LDAP、または x.509 ユーザー)でクライアント セッションと因果整合性の保証を使用するには、ユーザー名を 10k バイトより大きくすることはできません。
Active Directory スキーマの例
このチュートリアルでは、提供されたクエリ、構成、および出力の基礎として、次の例のADオブジェクトを使用します。 各オブジェクトには、可能な属性のサブセットのみが表示されます。
ユーザー オブジェクト
dn:CN=bob,CN=Users,DC=marketing,DC=example,DC=com userPrincipalName: bob@marketing.example.com memberOf: CN=marketing,CN=Users,DC=example,DC=com dn:CN=alice,CN=Users,DC=engineering,DC=example,DC=com userPrincipalName: alice@engineering.example.com memberOf: CN=web,CN=Users,DC=example,DC=com memberOf: CN=PrimaryApplication,CN=Users,DC=example,DC=com dn:CN=sam,CN=Users,DC=dba,DC=example,DC=com userPrincipalName: sam@dba.example.com memberOf: CN=dba,CN=Users,DC=example,DC=com memberOf: CN=PrimaryApplication,CN=Users,DC=example,DC=com dn:CN=joe,CN=Users,DC=analytics,DC=example,DC=com userPrincipalName: joe@analytics.example.com memberof: CN=marketing,CN=Users,DC=example,DC=com
グループ オブジェクト
dn:CN=marketing,CN=Users,DC=example,DC=com member:CN=bob,CN=Users,DC=marketing,DC=example,DC=com member:CN=joe,CN=Users,DC=analytics,DC=example,DC=com dn:CN=engineering,CN=Users,DC=example,DC=com member:CN=web,CN=Users,DC=example,DC=com member:CN=dba,CN=users,DC=example,DC=com dn:CN=web,CN=Users,DC=example,DC=com member:CN=alice,CN=Users,DC=engineering,DC=example,DC=com dn:CN=dba,CN=Users,DC=example,DC=com member:CN=sam,CN=Users,DC=dba,DC=example,DC=com dn:CN=PrimaryApplication,CN=Users,DC=example,DC=com member:CN=sam,CN=Users,DC=dba,DC=example,DC=com member:CN=alice,CN=Users,DC=engineering,DC=example,DC=com
Active Directory の認証情報
このチュートリアルでは、ユーザー名とパスワードを使用して、 ADサーバーでクエリを実行します。 提供された認証情報には、 security.ldap.userToDNMapping
またはsecurity.ldap.authz.queryTemplate
に関連するクエリをサポートするために、AD サーバー上で十分な特権が必要です。
レプリカセット
MongoDB LDAP 認可では、レプリカセット内のすべてのmongod
が少なくとも MongoDB 3.4.0 である必要があります。 以降に更新します。
シャーディングされたクラスター
MongoDB LDAP 認可では、シャーディングされたクラスター内のすべてのmongod
とmongos
が、少なくとも MongoDB 3.4.0以降である必要があります。
手順
MongoDB を実行しているサーバーの TLS/SSL を構成する
TLS/SSL 経由でAD (AD)サーバーに接続するには、 mongod
またはmongos
がADDサーバーの証明機関(CA)証明書にアクセスする必要があります。
Linux では、 ldap.conf
ファイルのTLS_CACERT
またはTLS_CACERTDIR
オプションを使用して、 ADサーバーの CA 証明書を指定します。
プラットフォームのパッケージ マネージャーは、MongoDB Enterprise のlibldap
依存関係をインストール中にldap.conf
ファイルを作成します。 構成ファイルまたは参照されるオプションに関する完全なドキュメントについては、 ldap.conf を参照してください 。
Microsoft Windows では、プラットフォームの認証情報管理ツールを使用して、 ADサーバーの証明機関(CA)証明書をロードします。 具体的には、 Windowsのバージョンによって異なります。 ツールを使用するには、ご使用のWindowsバージョン向けのドキュメントを参照してください。
mongod
またはmongos
がAD CA ファイルにアクセスできない場合、Active Directory サーバーへの TLS/SSL 接続を作成できません。
オプションとして、 security.ldap.transportSecurity
をnone
に設定して、TLS/SSL を無効にします。
警告
transportSecurity
をnone
に設定すると、ユーザー認証情報を含むプレーンテキスト情報が MongoDB とADサーバー間で送信されます。
MongoDB サーバーに接続します。
}--port
オプションと オプションを使用してmongosh
--host
を使用して MongoDB サーバーに接続します。
mongosh --host <hostname> --port <port>
MongoDB サーバーが現在認証を強制している場合は、 userAdmin
またはuserAdminAnyDatabase
によって提供されるロール管理特権を持つユーザーとして、 admin
データベースで認証を受ける必要があります。 MongoDB サーバーの設定された認証メカニズムに適した--authenticationMechanism
を含めます。
mongosh --host <hostname> --port <port> --username <user> --password <pass> --authenticationDatabase="admin" --authenticationMechanism="<mechanism>"
ユーザー管理ロールを作成します。
ADを使用して MongoDB ユーザーを管理するには、 userAdmin
やuserAdminAnyDatabase
によって提供されるロールを作成および管理できるロールを、 admin
データベースに少なくとも 1 つ作成する必要があります。
ロールの名前は、 ADグループの識別名と完全に一致する必要があります。 グループには、ノードとして少なくとも 1 人のADユーザーが必要です。
使用可能なActive Directory グループがある場合、次の操作は実行されます。
ADグループ
CN=dba,CN=Users,DC=example,DC=com
に対して という名前のロールを作成し、admin
データベースのuserAdminAnyDatabase
ロールを割り当てます。
var admin = db.getSiblingDB("admin") admin.createRole( { role: "CN=dba,CN=Users,DC=example,DC=com", privileges: [], roles: [ "userAdminAnyDatabase" ] } )
あるいは、ユーザーがユーザー管理特権を付与する必要があるデータベースごとにuserAdmin
ロールを付与することもできます。 これらのロールは、ロールの作成と管理に必要な特権を提供します。
重要
最小特権の原則 を適用することを検討してください MongoDB ロール、 AD グループ、またはグループ メンバーシップを構成する場合。
MongoDB の構成ファイルを作成します。
MongoDB構成ファイルは、 .conf
ファイル拡張子を持つプレーンテキストの YAML ファイルです。
既存の MongoDB デプロイをアップグレードする場合は、現在の構成ファイルをコピーし、そのコピーから作業します。
(Linux のみ) これが新しい配置で、プラットフォームのパッケージ マネージャーを使用して MongoDB Enterprise をインストールした場合、インストールには
/etc/mongod.conf
のデフォルト構成ファイルが含まれます。 そのデフォルトの構成ファイルを使用するか、そのファイルのコピーを使用して操作します。そのようなファイルが存在しない場合は、
.conf
拡張子を持つ空のファイルを作成し、その新しい構成ファイルを操作します。
Active Directory に接続するように MongoDB を構成します。
MongoDB 構成ファイルで、security.ldap.servers
AD サーバーのホストとポートに設定します。MongoDBインフラストラクチャにレプリケーション目的で複数のMongoDBサーバーが含まれている場合は、サーバーのホストとポートをカンマ区切りのリストとしてsecurity.ldap.servers
に指定します。
また、 security.authorization
をenabled
に、 setParameter
authenticationMechanisms
をPLAIN
に設定して、LDAP 認証を有効にする必要があります。
例
activedirectory.example.net
にあるADサーバーに接続するには、構成ファイルに次の内容を含めます。
security: authorization: "enabled" ldap: servers: "activedirectory.example.net" setParameter: authenticationMechanisms: 'PLAIN'
MongoDB は、クエリを実行するには、 ADサーバーにバインドする必要があります。 デフォルトでは、MongoDB は単純な認証メカニズムを使用してMongoDBサーバーに自分自身をバインドします。
または、構成ファイルで次の設定を構成し、 SASL
を使用してMongoDBサーバーにバインドすることもできます。
security.ldap.bind.method
をsasl
に設定は、 AD サーバーがサポートするカンマ区切りの SASL
security.ldap.bind.saslMechanisms
メカニズムの を指定します。string
このチュートリアルでは、デフォルトのsimple
LDAP 認証メカニズムを使用します。
認可用の LDAP クエリ テンプレートを構成します。
MongoDB 構成ファイルで、 をsecurity.ldap.authz.queryTemplate
RFC4516 に設定 形式の LDAP クエリ URL テンプレート。
テンプレートでは、次のいずれかを使用できます。
{USER}
プレースホルダーを使用して、認証されたユーザー名を LDAP クエリ URL に置き換えます。{PROVIDED_USER}
指定されたユーザー名(つまり、認証または LDAP 変換の前)を LDAP クエリに置き換えるためのプレースホルダー。
注意
RFC4515 の完全な説明 、 RFC4516 、または AD クエリは、このチュートリアルの範囲外です。このチュートリアルで提供されているqueryTemplate
は 例のみであり、特定のAD配置には適用されない可能性があります。
例
次のクエリ テンプレートでは、再帰的なグループ メンバーシップに従って、 {USER}
をメンバーとしてリストするすべてのグループが返されます。 この LDAP クエリでは、グループ オブジェクトがmember
属性を使用して完全なユーザー識別名(DN)を保存し、ユーザー メンバーシップを追跡することを前提としています。 クエリには、 1.2.840.113556.1.4.1941
LDAP_MATCHING_RULE_IN_CHAIN の LDAP 固有の一致ルール OID が含まれています 。この一致するルールは、LDAP 検索フィルターに対するAD固有の拡張機能です。
警告
ADリストに多数のグループが含まれている場合、再帰的なmember:1.2.840.113556.1.4.1941
フィルターによってパフォーマンスが大幅に低下する可能性があります。
security: ldap: authz: queryTemplate: "DC=example,DC=com??sub?(&(objectClass=group)(member:1.2.840.113556.1.4.1941:={USER}))"
クエリ テンプレートを使用すると、MongoDB は LDAP サーバーをクエリするために、 {USER}
を認証されたユーザー名に置き換えます。
たとえば、ユーザーはCN=sam,CN=Users,DC=dba,DC=example,DC=com
として認証します。 MongoDB はqueryTemplate
に基づいて LDAP クエリを作成し、 {USER}
トークンを認証済みまたは変換されたユーザー名に置き換えます。 Active Directory サーバーは、ユーザーを直接または推移的にリストするグループに対して、再帰的なグループ検索を実行します。 Active Directory グループに基づいて、 ADサーバーは次のグループを返します。
CN=dba,CN=Users,DC=example,DC=com
CN=engineering,CN=Users,DC=example,DC=com
CN=PrimaryApplication,CN=Users,DC=example,DC=com
MongoDB は返された各グループDNをadmin
データベースのロールにマッピングします。 マッピングされたグループDNごとに、名前がDNと完全に一致する既存のロールがadmin
データベースに存在する場合、MongoDB はそのロールに割り当てられたロールと特権をユーザーに付与します。
一致ルールLDAP_MATCHING_RULE_IN_CHAIN
には、認証ユーザーの完全なDNを指定する必要があります。 ユーザーがuser
principal name
などの異なるユーザー名形式を使用して認証する場合は、 を使用して受信ユーザー名を DN security.ldap.userToDNMapping
に変換する必要があります。
オプション: Active Directory 経由の認証用に受信したユーザー名を変換する
ユーザーが完全な LDAP DN ではないユーザー名で認証される場合は、LDAP 認証または認可をサポートするためにユーザー名を変換する必要がある場合があります。 MongoDB は、認証と認可の両方に変換されたユーザー名を使用します。
MongoDB 構成ファイルで、userToDNMapping
queryTemplate
を に設定して、認証ユーザーの指定されたユーザー名を、 をサポートするように AD DN に変換します。
例
queryTemplate
が構成された場合、ユーザーは完全な LDAP DN で認証する必要があります。 ユーザーが代わりにuserPrincipalName
を使用して認証する場合は、指定されたユーザー名を完全な LDAP DN に変換するために変換を適用する必要があります。
次のuserToDNMapping
構成では、指定されたユーザー名を取得するためにmatch
正規表現フィルターを使用します。 MongoDB はクエリを実行する前に、取得されたユーザー名をldapQuery
クエリ テンプレートに挿入します。
security: ldap: userToDNMapping: '[ { match : "(.+)", ldapQuery: "DC=example,DC=com??sub?(userPrincipalName={0})" } ]'
Active Directory サーバーは、一致するuserPrincipalName
を持つユーザー オブジェクトに関連付けられた完全な LDAP DN を返します。 MongoDB は、この変換されたユーザー名を認証と認可に使用できます。
指定されたサンプル構成を、配置に合わせて変更する必要があります。 たとえば、 ldapQuery
のベースDNは、ユーザー エンティティを含むベースDNと一致する必要があります。 AD配置をサポートするには、他の変更が必要になる場合があります。
例
ユーザーはalice@ENGINEERING.EXAMPLE.COM
として認証します。 MongoDB は、 userToDNMapping
で指定された変換を最初に適用します。 提供された構成に基づいて、MongoDB はmatch
ステージでユーザー名を取得し、LDAP クエリを実行します。
DC=example,DC=com??sub?(userPrincipalName=alice@ENGINEERING.EXAMPLE.COM)
構成されたActive Directory ユーザーに基づいて、 ADサーバーはCN=alice,CN=Users,DC=engineering,DC=example,DC=com
を返す必要があります。
次に、MongoDB はqueryTemplate
で構成された LDAP クエリを実行し、 {USER}
トークンを変換されたユーザー名CN=alice,CN=Users,DC=engineering,DC=example,DC=com
に置き換えます。
重要
userToDNMapping
substitution
の パラメーターを使用してグループ名を変換する場合、置換の結果は RFC4514 である 必要string があります エスケープされた 。
クエリ認証情報を構成します。
MongoDB では、 ADサーバーでクエリを実行するために認証情報が必要です。
構成ファイル で次の設定を構成します。
security.ldap.bind.queryUser
は、 ADサーバーでクエリを実行するための Active Directory ユーザー としてmongod
またはmongos
バインドを指定します。security.ldap.bind.queryPassword
は、指定されたqueryUser
のパスワードを指定します。
security: ldap: bind: queryUser: "mongodbadmin@dba.example.com" queryPassword: "secret123"
Windows MongoDB サーバーでは、 security.ldap.bind.useOSDefaults
をtrue
に設定すると、 queryUser
とqueryPassword
の代わりにOSユーザーの認証情報を使用できます。
queryUser
には、MongoDB に代わってすべての LDAP クエリを実行する権限が必要です。
任意: 追加の構成設定を追加します。
配置に必要な追加の構成オプションを追加します。 たとえば、任意のstorage.dbPath
を指定するか、デフォルトのnet.port
数値を変更できます。
mongod
とmongos
は、デフォルトで localhost にバインドされます。 配置のノードが異なるホスト上で実行されている場合、またはリモート クライアントを配置に接続する場合は、 net.bindIp
設定を指定する必要があります。
Active Directory 認証と認可で MongoDB サーバーを起動します。
--config
オプションを使用して MongoDB サーバーを起動し、この手順中に作成された構成ファイルへのパスを指定します。 MongoDB サーバーが現在実行中の場合は、適切な準備をしてサーバーを停止します。
mongod --config <path-to-config-file>
Windows MongoDB 配置では、 mongod
ではなくmongod.exe
を使用する必要があります
MongoDB サーバーに接続します。
MongoDB サーバーに接続し、 userAdmin
、 userAdminAnyDatabase
、または同等の権限を持つカスタムロールを持つadmin
データベースの MongoDB ロールに対応する直接または推移的なグループ メンバーシップを持つユーザーとして認証します。
mongosh
を使用して MongoDB サーバーに認証し、次のオプションを設定します。
--host
で、MongoDB サーバーのホスト名が--port
と MongoDB サーバーのポート--username
にユーザーのユーザー名を設定--password
にユーザーのパスワードを設定--authenticationMechanism
次の行動をします:'PLAIN'
--authenticationDatabase
次の行動をします:'$external'
例
この手順では、必要な権限を持つadmin
データベースのdn:CN=dba,CN=Users,DC=example,DC=com
ロールを構成しました。 このロールは、 ADグループに対応します。 構成されたAD ユーザーに基づいて、ユーザーsam@dba.example.com
として認証し、必要な権限を受け取ることができます。
mongosh --username sam@DBA.EXAMPLE.COM --password --authenticationMechanism 'PLAIN' --authenticationDatabase '$external' --host <hostname> --port <port>
Windows MongoDB 配置では、 mongosh
ではなくmongo.exe
を使用する必要があります
構成されたActive Directory ユーザーの場合、ユーザーは正常に認証され、適切な権限を受け取ります。
注意
既存の$external
以外のユーザーとして認証する場合は、 --authenticationMechanism
を SCRAM 認証メカニズムに設定します(例: 必要に応じてSCRAM-SHA-1
またはSCRAM-SHA-256
を使用します)。 これには、MongoDB サーバーのsetParameter
authenticationMechanisms
にSCRAM-SHA-1
および/またはSCRAM-SHA-256
が含まれている必要があります。
返された AD グループをマッピングするためのロールを作成します。
MongoDB 認証に使用するADサーバー上のグループごとに、MongoDB サーバーのadmin
データベースに一致するロールを作成する必要があります。
例
次の操作では、 ADグループ DN CN=PrimaryApplication,CN=Users,DC=example,DC=com
にちなんで命名されたロールが作成され、そのグループに適切なロールと特権が割り当てられます。
db.getSiblingDB("admin").createRole( { role: "CN=PrimaryApplication,CN=Users,DC=example,DC=com", privileges: [], roles: [ { role: "readWrite", db: "PrimaryApplication" } ] } )
構成されたActive Directory グループの場合、MongoDB はsam@DBA.EXAMPLE.COM
またはalice@ENGINEERING.EXAMPLE.COM
として認証するユーザーに、 PrimaryApplication
データベースでreadWrite
ロールを付与します。
注意
admin
データベースでロールを管理するには、 admin
のuserAdmin
を持つユーザー、 userAdminAnyDatabase
、または同等の権限を持つ のカスタムロールとして認証される必要があります。
既存のユーザーを から$external
ActiveDirectoryサーバーに移行する
$external
データベースで構成されたユーザーを使用して既存のインストールをアップグレードする場合は、 AD認証および認可用に MongoDB を構成した後にアクセスを確保するために、各ユーザーに対して次の要件を満たす必要があります。
ユーザーは、 ADサーバー上に対応するユーザー オブジェクトがあります。
ユーザーは、 ADサーバー上の適切なグループのメンバーシップを持っています。
MongoDB には、認可されたユーザーが特権を保持するように、ユーザーのADグループに対して という名前の
admin
データベース上のロールが含まれています。
例
次のユーザーが$external
データベースに存在します。
{ user : "joe@ANALYTICS.EXAMPLE.COM", roles: [ { role : "read", db : "web_analytics" }, { role : "read", db : "PrimaryApplication" } ] }
ユーザーがADグループCN=marketing,CN=Users,DC=example,DC=com
に属していると仮定すると、次の操作は適切な特権を持つ一致するロールを作成します。
db.getSiblingDB("admin").createRole( { role: "CN=marketing,CN=Users,DC=example,DC=com", privileges: [], roles: [ { role: "read", db: "web_analytics" } { role: "read", db: "PrimaryApplication" } ] } )
構成されたqueryTemplate
に基づいて、MongoDB は、CN=marketing,CN=Users,DC=example,DC=com
グループの直接または推移的なメンバーシップを持つすべてのユーザーに、read
web_analytics
データベースとPrimaryApplication
データベースで 操作を実行することを許可します。
重要
対応するADグループに対してロールを構成する場合、そのグループのメンバーシップを持つすべてのユーザーが、割り当てられたロールと特権を受け取ることができることを覚えておいてください。 最小特権の原則 を適用することを検討してください MongoDB ロール、 AD グループ、またはグループ メンバーシップを構成する場合。
$external
以外のデータベースのユーザーによる MongoDB へのアクセスを引き続き許可する場合は、SCRAM 認証メカニズム(例: { setParameter
authenticationMechanisms
構成オプションのSCRAM-SHA-1
および/またはSCRAM-SHA-256
)。 例:
setParameter: authenticationMechanisms: "PLAIN,SCRAM-SHA-1,SCRAM-SHA-256"
または、上記の手順に従って、 $external
以外のユーザーをADDに移行します。
この手順では、次の構成ファイルが作成されます。
security: authorization: "enabled" ldap: servers: "activedirectory.example.net" bind: queryUser: "mongodbadmin@dba.example.com" queryPassword: "secret123" userToDNMapping: '[ { match: "(.+)", ldapQuery: "DC=example,DC=com??sub?(userPrincipalName={0})" } ]' authz: queryTemplate: "DC=example,DC=com??sub?(&(objectClass=group)(member:1.2.840.113556.1.4.1941:={USER}))" setParameter: authenticationMechanisms: "PLAIN"
指定されたサンプル構成は、Active Directory スキーマ、ディレクトリ構造、および構成と一致するように変更する必要があります。 配置には追加の構成ファイル オプションも必要になる場合があります。
ロールと特権の設定の詳細については、以下を参照してください。