MongoDB Enterpriseは 、認証されたユーザーが属する LDAP グループに対する LDAP サーバーのクエリをサポートしています。 MongoDB は、返された各グループの LDAP 識別名(DN)をadminデータベースのロールにマッピングします。 MongoDB は、マップされたロールとそれに関連付けられた特権に基づいてユーザーを認可します。 詳細については、「 LDAP 認可」を参照してください。
MongoDB Enterprise はKerberos サービスを使用する認証をサポートしています。 Kerberos は、大規模なクライアント/サーバー システム向けの業界標準の認証プロトコルです。
このチュートリアルでは、Kerberos サーバーを通じて認証を実行し、プラットフォーム ライブラリ経由で Active Directory(AD)サーバーを通じて認可を実行するように MongoDB を構成する方法について説明します。
前提条件
AD の完全な説明は、このチュートリアルの範囲外です。このチュートリアルは、AD に関する事前の知識があることを前提としています。
MongoDB は、MongoDB サーバーとADとの間のバインディングに SASL メカニズムを使用することをサポートしています。 SASL、SASL メカニズム、または特定の SASL メカニズムの具体的なAD構成要件の詳細な説明は、このチュートリアルの範囲外です。 このチュートリアルでは、SASL とそれに関連する事柄に関する事前の知識があることを前提としています。
Kerberos 配置の セットアップと構成 については、このドキュメントの範囲外です。 このチュートリアルでは、MongoDBmongos 配置の各mongod } インスタンスと インスタンスに対して Kerberos サービス プリンシパル を構成し、かつmongod }mongos インスタンスと インスタンスごとに の有効な キータブ ファイル があることを前提としています。
レプリカセットとシャーディングされたクラスターの場合は、IP アドレスや修飾されていないホスト名ではなく、構成で完全修飾ドメイン名(FQDN)が使用されていることを確認してください。 Kerberos レルムを正しく解決し、接続できるようにするには、GSSAPI 用の FQDN を使用する必要があります。
MongoDB Enterprise を使用していることを確認するには、 --versionコマンドライン オプションをmongodまたはmongosに渡します。
mongod --versionこのコマンドの出力で string modules: subscriptionまたはmodules: enterpriseを探し、MongoDB Enterprise バイナリを使用していることを確認します。
Considerations
このチュートリアルでは、Kerberos 認証と AD 承認のための MongoDB の構成について説明します。
この手順を独自の MongoDB サーバーで実行するには、独自のインフラストラクチャ、特に Kerberos 構成、 ADクエリの構築、またはユーザーの管理に関して指定された手順を変更する必要があります。
トランスポート層のセキュリティ
デフォルトでは、MongoDB はMongoDBサーバーにバインドするときに TLS/SSL 接続を作成します。 これには、MongoDB サーバーのホストを、AD サーバーの証明機関(CA)証明書にアクセスできるように構成する必要があります。
このチュートリアルでは、必要なホスト構成に関する手順を説明します。
このチュートリアルでは、AD サーバーの CA 証明書にアクセスし、MongoDB サーバー上に証明書のコピーを作成できることを前提としています。
Active Directory スキーマの例
このチュートリアルでは、提供されたクエリ、構成、および出力の基礎として、次の例のADオブジェクトを使用します。 各オブジェクトには、可能な属性のサブセットのみが表示されます。
ユーザー オブジェクト
dn:CN=bob,CN=Users,DC=marketing,DC=example,DC=comuserPrincipalName: bob@marketing.example.commemberOf: CN=marketing,CN=Users,DC=example,DC=com
dn:CN=alice,CN=Users,DC=engineering,DC=example,DC=comuserPrincipalName: alice@engineering.example.commemberOf: CN=web,CN=Users,DC=example,DC=commemberOf: CN=PrimaryApplication,CN=Users,DC=example,DC=com
dn:CN=sam,CN=Users,DC=dba,DC=example,DC=comuserPrincipalName: sam@dba.example.commemberOf: CN=dba,CN=Users,DC=example,DC=commemberOf: CN=PrimaryApplication,CN=Users,DC=example,DC=com
dn:CN=joe,CN=Users,DC=analytics,DC=example,DC=comuserPrincipalName: joe@analytics.example.commemberof: CN=marketing,CN=Users,DC=example,DC=comグループ オブジェクト
dn:CN=marketing,CN=Users,DC=example,DC=commember:CN=bob,CN=Users,DC=marketing,DC=example,DC=commember:CN=joe,CN=Users,DC=analytics,DC=example,DC=com
dn:CN=engineering,CN=Users,DC=example,DC=commember:CN=web,CN=Users,DC=example,DC=commember:CN=dba,CN=users,DC=example,DC=com
dn:CN=web,CN=Users,DC=example,DC=commember:CN=alice,CN=Users,DC=engineering,DC=example,DC=com
dn:CN=dba,CN=Users,DC=example,DC=commember:CN=sam,CN=Users,DC=dba,DC=example,DC=com
dn:CN=PrimaryApplication,CN=Users,DC=example,DC=commember:CN=sam,CN=Users,DC=dba,DC=example,DC=commember:CN=alice,CN=Users,DC=engineering,DC=example,DC=comActive Directory の認証情報
このチュートリアルでは、AD サーバーでのクエリを実行するために、ユーザー名とパスワードを使用します。提供された認証情報は、AD サーバー上で security.ldap.userToDNMapping または security.ldap.authz.queryTemplate に関連するクエリをサポートするために十分な権限を持っている必要があります。
レプリカセット
MongoDB LDAP 認可では、レプリカセット内のすべてのmongodが少なくとも MongoDB 3.4.0 である必要があります。 以降に更新します。
シャーディングされたクラスター
MongoDB LDAP 認可では、シャーディングされたクラスター内のすべてのmongodとmongosが、少なくとも MongoDB 3.4.0以降である必要があります。
手順
MongoDB を実行しているサーバーの TLS/SSL を構成します。
TLS/SSL を介して AD (AD) サーバーに接続するには、mongod または mongos で AD サーバーの証明書発行者 (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サーバー間で送信されます。
(Windows のみ) MongoDB Windows Service にサービスプリンシパル名を割り当てます。
Windows オペレーティング システムで実行されている MongoDB サーバーの場合は、 setspn.exe を使用する必要があります を使用して、MongoDB サービスを実行しているアカウントにサービスプリンシパル名(SPN)を割り当てます。
setspn.exe -S <service>/<fully qualified domain name> <service account name>例
たとえば、 mongodがサービスアカウント名mongodb_dev@example.comを使用してmongodbserver.example.comでmongodbという名前のサービスとして実行する場合、SPN を割り当てるコマンドは次のようになります。
setspn.exe -S mongodb/mongodbserver.example.com mongodb_dev@example.com注意
Windows Server 2003 は setspn.exe -S をサポートしていません。setspn.exe の完全なドキュメントについては、setspn.exe を参照してください。
(Linux のみ) MongoDB サーバーのキータブ ファイルを作成します。
Linux プラットフォームで実行されている MongoDB サーバーの場合、そのサーバー上で実行されている MongoDB インスタンスに固有のキータブ ファイルのコピーがサーバーにあることを確認する必要があります。
MongoDB サービスを実行している Linux ユーザーに、キータブ ファイルに対する読み取り権限を付与する必要があります。 キータブ ファイルの場所の完全なパスをメモします。
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 ユーザーを管理するには、admin データベース上に、ロールを作成および管理できる少なくとも 1 つのロールを作成する必要があります。これは、userAdmin や userAdminAnyDatabase によって提供されるロールなどです。
ロールの名前は、 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 サーバーのホストとポートに設定します。ADインフラストラクチャにレプリケーション目的で複数のADサーバーが含まれている場合は、サーバーのホストとポートをカンマ区切りのリストとしてsecurity.ldap.serversに指定します。
例
activedirectory.example.net にある AD サーバーに接続するには、構成ファイルに次の項目を含めます。
security: ldap: servers: "activedirectory.example.net"MongoDB は、クエリを実行するには、 ADサーバーにバインドする必要があります。 デフォルトでは、MongoDB は単純な認証メカニズムを使用してMongoDBサーバーに自分自身をバインドします。
または、構成ファイル内で次の設定を構成して、SASL を使用して AD サーバーにバインドすることもできます。
security.ldap.bind.methodをsaslに設定security.ldap.bind.saslMechanismsは、ADサーバーがサポートするカンマ区切りの SASL メカニズムの文字列を指定します。
このチュートリアルでは、デフォルトのsimple LDAP 認証メカニズムを使用します。
Kerberos 認証用に MongoDB を構成します。
MongoDB 構成ファイルで、 security.authorizationをenabledに、 setParameter authenticationMechanismsをGSSAPIに設定します
Kerberos 経由の認証を有効にするには、 構成ファイル に以下を含めます。
security: authorization: "enabled"setParameter: authenticationMechanisms: "GSSAPI"認可用の 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.1941LDAP_MASTER の LDAP 固有の一致ルール OID が含まれています。この一致するルールは、LDAP 検索フィルターに対する AD 固有の拡張機能です。
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 ディレクトリ グループに基づいて、AD サーバーは CN=dba,CN=Users,DC=example,DC=com と CN=engineering,CN=Users,DC=example,DC=com を返します。
MongoDB は、返された各グループの識別名 (DN)をadminデータベースのロールにマッピングします。マッピングされたグループ 識別名 ごとに、その名前が 識別名 と完全に一致する既存のロールが admin データベース上にある場合、MongoDB はそのロールに割り当てられたロールと権限をユーザーに付与します。
マッチングルール LDAP_MATCHING_RULE_IN_CHAIN は、認証するユーザーの完全な 識別名 を提供する必要があります。Kerberos はユーザーのuserPrincipalName を使用して認証する必要があるため、受信したユーザー名を を使用して DN security.ldap.userToDNMappingに変換する必要があります。次のステップでは、queryTemplateをサポートするために、受信したユーザー名を変換する方法についてのガイダンスを提供します。
Active Directory 経由の認証用に受信したユーザー名を変換します。
MongoDB 構成ファイルで、`userToDNMapping ` をサポートするために、認証するユーザーが提供したユーザー名を ` AD ` 識別名に変換するように、` `queryTemplate を設定します。
例
次のuserToDNMapping構成では、指定されたユーザー名を取得するためにmatch正規表現フィルターを使用します。 MongoDB はクエリを実行する前に、取得されたユーザー名をldapQueryクエリ テンプレートに挿入します。
security: ldap: userToDNMapping: '[ { match : "(.+)", ldapQuery: "DC=example,DC=com??sub?(userPrincipalName={0})" } ]'指定されたサンプル構成を、配置に合わせて変更する必要があります。 たとえば、 ldapQueryのベースDNは、ユーザー エンティティを含むベースDNと一致する必要があります。 AD配置をサポートするには、他の変更が必要になる場合があります。
例
ユーザーはalice@ENGINEERING.EXAMPLE.COMとして認証します。 MongoDB は、 userToDNMappingで指定された変換を最初に適用します。 提供された構成に基づいて、MongoDB はmatchステージでユーザー名を取得し、LDAP クエリを実行します。
DC=example,DC=com??sub?(userPrincipalName=alice@ENGINEERING.EXAMPLE.COM)構成されたActive ディレクトリ ユーザーに基づいて、 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に置き換えます。
重要
userToDNMappingsubstitutionの パラメーターを使用してグループ名を変換する場合、置換の結果は RFC のエスケープされた文字列である必要があります。4514
クエリ認証情報を構成します。
MongoDB では、 ADサーバーでクエリを実行するために認証情報が必要です。
構成ファイル で次の設定を構成します。
security.ldap.bind.queryUserは、mongodmongosAD サーバーでクエリを実行するための Kerberos ユーザー または バインドを指定します。
security: ldap: bind: queryUser: "mongodbadmin@dba.example.com" queryPassword: "secret123"Windows MongoDB サーバーでは、security.ldap.bind.useOSDefaults を true に設定して、queryUser と queryPassword の代わりに OS ユーザーの認証情報を使用するようにできます。
queryUserには、MongoDB に代わってすべての LDAP クエリを実行する権限が必要です。
任意: 追加の構成設定を追加します。
構成に必要な追加オプションを含めます。 たとえば、リモート クライアントを使用して配置に接続する場合や、配置ノードを異なるホスト上で実行する場合は、 net.bindIp設定を指定します。
Kerberos 認証と Active Directory 認証を使用して MongoDB サーバーを起動します。
--configオプションを使用して MongoDB サーバーを起動し、この手順中に作成された構成ファイルへのパスを指定します。 MongoDB サーバーが現在実行中の場合は、適切な準備をしてサーバーを停止します。
Linux MongoDB Servers
Linux では、 KRB5_KTNAME環境変数を指定して、MongoDB サーバーのキータブ ファイルへのパスを指定する必要があります。
env KRB5_KTNAME <path-to-keytab> mongod --config <path-to-config-file>Microsoft Windows MongoDB Servers
Windows では、手順の前半で構成されたように、MongoDB サーバーをサービスプリンシパル アカウントとして起動する必要があります。
mongod.exe --config <path-to-config-file>MongoDB サーバーに接続します。
MongoDB サーバーに接続し、 userAdmin 、 userAdminAnyDatabase 、または同等の権限を持つカスタムロールを持つadminデータベースの MongoDB ロールに対応する直接または推移的なグループ メンバーシップを持つユーザーとして認証します。
mongoshを使用して MongoDB サーバーに認証し、次のオプションを設定します。
--hostで、MongoDB サーバーのホスト名が--portと MongoDB サーバーのポート--usernameユーザーのuserPrincipalName--passwordにユーザーのパスワードを入力します(または省略すると、mongoshはパスワードの入力を要求します)--authenticationMechanism次の行動をします:"GSSAPI"--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 --authenticationMechanisms="GSSAPI" --authenticationDatabase "$external" --host <hostname> --port <port>Windows MongoDBmongo.exemongosh 配置では、. の代わりに を使用する必要があります。
構成された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 グループ識別名 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 Active Directoryサーバーに移行します。
$external データベースでユーザーが構成された既存のインストールをアップグレードする場合、Kerberos 認証と 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: "GSSAPI,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: "GSSAPI"重要
指定されたサンプル構成は、 ADスキーマ、ディレクトリ構造、および構成と一致するように変更する必要があります。 配置には追加の構成ファイル オプションも必要になる場合があります。
ロールと特権の設定の詳細については、以下を参照してください。
テストと検証
構成手順を完了したら、 mongokerberosツールを使用して構成を検証できます。
mongokerberosは、MongoDB で使用するプラットフォームの Kerberos 構成を確認し、MongoDB クライアントからの Kerberos 認証が期待どおりに機能することをテストするのに便利な方法を提供します。 詳しくは、 mongokerberosのドキュメントを参照してください。
mongokerberos は MongoDB Enterprise でのみ利用可能です。