Overview
このガイドでは、MongoDB Enterprise Edition でのみ使用可能な各認証メカニズムを使用して MongoDB で認証する方法を学習できます。
MongoDB Enterprise Edition の最新バージョンでは、次のメカニズムを使用できます。
別のメカニズムを使用して認証するには、認証メカニズムに関するガイドをご覧ください。MongoDBクラスターへの接続を確立する方法の詳細については、 「 MongoDBへの接続 」ガイドを参照してください。
認証メカニズムを指定する
次のいずれかを使用して MongoDB に接続するときに、認証メカニズムと認証情報を指定できます。
接続string
MongoCredentialファクトリー メソッド
接続string (接続 URIとも呼ばれます)は、 MongoDBクラスターへの接続と認証の方法を指定します。
接続文字列 を使用して認証するには、接続string stringに設定を含め、それを MongoClients.create() メソッドに渡して MongoClient をインスタンス化します。 Connection String接続string を使用して認証する構文を確認するには、{2 タブを選択します。
あるいは、 MongoCredentialクラスを使用して認証の詳細を指定することもできます。 MongoCredentialクラスには、認証メカニズムと認証情報を含む インスタンスを構築する静的ファクトリー メソッドが含まれています。 MongoCredentialヘルパー クラスを使用する場合は、 MongoClientの構築時に接続設定を構成するためにMongoClientSettings.Builderクラスを使用する必要があります。 MongoCredentialを使用して認証する構文を表示するには、 MongoCredentialタブを選択します。
これらのクラスとメソッドの詳細については、次の API ドキュメントを参照してください。
メカニズム
Kerberos (GSSAPI)
汎用セキュリティ サービス API( GSSAPI )認証メカニズムにより、ユーザーはユーザーのプリンシパル名を使用して Kerberos サービスで認証できます。
注意
ドライバーは GSSAPI RFC-4652 SASL メカニズムを使用して認証するため、メソッドは Kerberos ではなく GSSAPI認証メカニズムを参照します。
次のコード スニペットは、次のプレースホルダーを使用して認証メカニズムを指定する方法を示しています。
principal_username: URL エンコードされたプリンシパル名(例:"username%40REALM.ME"hostname: クライアントがアクセスできる MongoDB 配置のネットワーク アドレスport: MongoDB 配置のポート番号
この認証メカニズムを指定するための手順とサンプル コードについては、以下の [ ] タブまたは [Connection String ] タブを選択してください。MongoCredential
接続stringを使用して GSSAPI 認証メカニズムを指定するには、次の手順に従います。
authMechanismURL パラメータに値GSSAPIを割り当てます(任意)
authSourceURL パラメータに値$externalを割り当てます
注意
GSSAPIメカニズムを指定する場合、 authSourceを$external以外の値に割り当てることはできません。
MongoClientをインスタンス化するコードは次のようになります。
MongoClient mongoClient = MongoClients.create("<principal_username>@<hostname>:<port>/?authSource=$external&authMechanism=GSSAPI");
MongoCredentialクラスを使用して GSSAPI 認証メカニズムを指定するには、 createGSSAPICredential()メソッドを使用します。 MongoClientをインスタンス化するコードは次のようになります。
MongoCredential credential = MongoCredential.createGSSAPICredential(<principal_username>); MongoClient mongoClient = MongoClients.create( MongoClientSettings.builder() .applyToClusterSettings(builder -> builder.hosts(Arrays.asList(new ServerAddress("<hostname>", <port>)))) .credential(credential) .build());
Kerberosチケットを取得するには、GSSAPI Javaライブラリは、 邦土と KDC(Key Distributor)システム プロパティを指定する必要があります。次の例のサンプル設定を参照してください。
java.security.krb5.realm=MYREALM.ME java.security.krb5.kdc=mykdc.myrealm.me
Kerberos の設定によっては、次の追加のMongoCredentialメカニズム プロパティを 1 つ以上指定する必要がある場合があります。
SERVICE_NAMECANONICALIZE_HOST_NAMEJAVA_SUBJECTJAVA_SASL_CLIENT_PROPERTIESJAVA_SUBJECT_PROVIDER
重要
次の GSSAPI プロパティは、 MongoCredentialを使用してのみ指定できます。
JAVA_SUBJECTJAVA_SASL_CLIENT_PROPERTIESJAVA_SUBJECT_PROVIDER
これらを指定する方法については、 MongoCredentialタブを選択してください。
GSSAPI 追加プロパティの 1 つを指定するには、次の形式を使用して接続string にURL パラメーターとして含めます:<PROPERTY_NAME>:<value>
GSSAPI と追加のプロパティを使用してMongoClientをインスタンス化するコードは、次のようになります。
MongoClient mongoClient = MongoClients.create("<principal_username>@<hostname>:<port>/?authSource=$external&authMechanism=GSSAPI&authMechanismProperties=SERVICE_NAME:myService");
GSSAPI 追加プロパティの 1 つを指定するには、 MongoCredentialインスタンスでwithMechanismProperty()メソッドを呼び出し、プロパティ名と値をパラメーターとして渡します。 MongoCredentialクラスで定義されているプロパティ名定数を使用します。
[ SERVICE_NAME_KEY ] タブまたは [ Java_SUBJECT_KEY ] タブを選択して、GSSAPI と選択した プロパティを使用するMongoCredentialをインスタンス化するためのサンプル コードを確認します。
MongoCredential credential = MongoCredential.createGSSAPICredential(<principal_username>); credential = credential.withMechanismProperty(MongoCredential.SERVICE_NAME_KEY, "myService");
LoginContext loginContext = new LoginContext(<LoginModule implementation from JAAS config>); loginContext.login(); Subject subject = loginContext.getSubject(); MongoCredential credential = MongoCredential.createGSSAPICredential(<principal_username>); credential = credential.withMechanismProperty(MongoCredential.JAVA_SUBJECT_KEY, subject);
デフォルトでは、Java ドライバーはMongoClientインスタンスごとに Kerberos チケットをキャッシュします。 配置でMongoClientインスタンスを頻繁に作成および破棄する必要がある場合は、デフォルトの Kerberos チケット キャッシュ動作を プロセスごとにキャッシュすることでパフォーマンスを向上させることができます。
プロセスごとにKerberosチケットをキャッシュするには、MongoCredential 認証メカニズムを使用する必要があります。接続string認証メカニズムでは JAVA_SUBJECT_PROVIDER メカニズムのプロパティがサポートされていないためです。 プロセスごとに Kerberos チケットをキャッシュする場合は、その方法について詳しくはMongoCredentialタブを選択してください。
プロセスによって Kerberos チケットをキャッシュには、JAVA_SUBJECT_PROVIDER メカニズムプロパティを指定し、MongoCredentialインスタンスにKerberosSubjectProviderを指定する必要があります。プロセスごとに Kerberos チケットをキャッシュようにJavaドライバーを構成するコードは次のようになります。
/* all MongoClient instances sharing this instance of KerberosSubjectProvider will share a Kerberos ticket cache */ String myLoginContext = "myContext"; MongoCredential credential = MongoCredential.createGSSAPICredential(<principal_username>); /* login context defaults to "com.sun.security.jgss.krb5.initiate" if unspecified in KerberosSubjectProvider */ credential = credential.withMechanismProperty(MongoCredential.JAVA_SUBJECT_PROVIDER_KEY, new KerberosSubjectProvider(myLoginContext));
注意
Windowsでは、Oracle の JRE は、 Windows Active Directory およびシングル サインオンの実装との相互運用性を制限する GSSAPI の実装で、SSI ではなく LSA を使用します。詳しくは、次の記事を参照してください。
LDAP (PLAIN)
MongoDB Enterprise Edition 3.4 以降で利用可能です。
ディレクトリ サーバーのユーザー名とパスワードを使用して、LDAP(Lightweight Directory Access Protocol)サーバーで認証できます。
Tip
認証メカニズムは、PLAIN LDAPRFC-4616 で定義されている PLAIN 簡易認証とセキュリティ層(SASL)を使用して認証するため、 ではなく という名前が付けられています。
この認証メカニズムを指定するには、authMechanism パラメータをPLAIN LDAPに設定し、 接続string に ユーザー名とパスワードを含めます。
次のコード スニペットは、次のプレースホルダーを使用して認証メカニズムを指定する方法を示しています。
username: LDAP ユーザー名password: LDAP ユーザーのパスワードhostname: クライアントがアクセスできる MongoDB 配置のネットワーク アドレスport: MongoDB 配置のポート番号
この認証メカニズムを指定するための手順とサンプル コードについては、以下の [ ] タブまたは [Connection String ] タブを選択してください。MongoCredential
LDAP接続 を使用して (PLAIN)認証メカニズムを指定するには、string
authMechanismURL パラメータに値PLAINを割り当てます(任意)
authSourceURL パラメータに値$externalを割り当てます
注意
PLAINメカニズムを指定する場合、 authSourceを$external以外の値に割り当てることはできません。
MongoClientをインスタンス化するコードは次のようになります。
MongoClient mongoClient = MongoClients.create("<username>:<password>@<hostname>:<port>/?authSource=$external&authMechanism=PLAIN");
MongoCredentialクラスを使用して LDAP(PLAIN)認証メカニズムを指定するには、 createPlainCredential()メソッドを使用します。 MongoClientをインスタンス化するコードは次のようになります。
MongoCredential credential = MongoCredential.createPlainCredential(<username>, "$external", <db_password>); MongoClient mongoClient = MongoClients.create( MongoClientSettings.builder() .applyToClusterSettings(builder -> builder.hosts(Arrays.asList(new ServerAddress("<hostname>", <port>)))) .credential(credential) .build());
MONGODB-OIDC
重要
MONGODB-OIDC 認証メカニズムでは、Linux プラットフォーム上で MongoDB Server v 7.0以降を実行する必要があります。
次のセクションでは、MONGODB-OIDC 認証メカニズムを使用してさまざまなプラットフォームに認証する方法について説明します。
MONGODB-OIDC 認証メカニズムの詳細については、 MongoDB ServerMongoDB Serverマニュアルの 「 OpenID Connect 認証 」 と 「 パラメーター 」 を参照してください。
Azure IMDS
アプリケーションがAzure VM 上で実行される場合、またはAzure Instance Metadata Service( IMDS)を使用する場合は、 Javaドライバーに組み込まれているAzureサポートを使用してMongoDBを認証できます。
Azure IMDS OIDC 認証は、MongoCredential を使用するか、 接続stringの一部として指定できます。
Connection StringMongoCredential対応する構文を表示するには、 タブまたは タブから を選択します。
次のコード内の<percent-encoded audience>プレースホルダーを、MongoDB 配置に構成されたオーディエンス サーバー パラメータのパーセント エンコードされた値に置き換えます。
カンマ( , )文字とそのエンコーディング( %2C )は予約されており、これらの文字を値で使用すると、ドライバーはカンマをキーと値のペアの区切り文字として解釈します。 MongoCredentialタブに示されているように、 MongoCredentialインスタンスではカンマを含む値を指定する必要があります。
MongoClient mongoClient = MongoClients.create( "mongodb://<db_username>@<hostname>:<port>/?" + "?authMechanism=MONGODB-OIDC" + "&authMechanismProperties=ENVIRONMENT:azure,TOKEN_RESOURCE:<percent-encoded audience>");
<db_username>プレースホルダーを、Azure が管理する IdP またはエンタープライズ アプリケーションのクライアント ID またはアプリケーション ID に置き換えます。 <audience>プレースホルダーを、MongoDB 配置に構成されたaudienceサーバー パラメータの値に置き換えます。
MongoCredential credential = MongoCredential.createOidcCredential("<db_username>") .withMechanismProperty("ENVIRONMENT", "azure") .withMechanismProperty("TOKEN_RESOURCE", "<audience>"); MongoClient mongoClient = MongoClients.create( MongoClientSettings.builder() .applyToClusterSettings(builder -> builder.hosts(Arrays.asList(new ServerAddress("<hostname>", <port>)))) .credential(credential) .build());
GCP IMDS
アプリケーションがGoogle Compute Engine VM で実行される場合、またはGCPインスタンス メタデータ サービス を使用する場合は、 Javaドライバーに組み込まれているGCPサポートを使用してMongoDBを認証できます。
GCP IMDS OIDC 認証は、MongoCredential を使用するか、接続stringの一部として指定できます。
Connection StringMongoCredential対応する構文を表示するには、 タブまたは タブから を選択します。
次のコード内の<percent-encoded audience>プレースホルダーを、MongoDB 配置に構成されたオーディエンス サーバー パラメータのパーセント エンコードされた値に置き換えます。
カンマ( , )文字とそのエンコーディング( %2C )は予約されており、これらの文字を値で使用すると、ドライバーはカンマをキーと値のペアの区切り文字として解釈します。 MongoCredentialタブに示されているように、 MongoCredentialインスタンスではカンマを含む値を指定する必要があります。
MongoClient mongoClient = MongoClients.create( "mongodb://<hostname>:<port>/?" + "authMechanism=MONGODB-OIDC" + "&authMechanismProperties=ENVIRONMENT:gcp,TOKEN_RESOURCE:<percent-encoded audience>");
<audience>プレースホルダーを、MongoDB 配置に構成されたaudienceサーバー パラメータの値に置き換えます。
MongoCredential credential = MongoCredential.createOidcCredential() .withMechanismProperty("ENVIRONMENT", "gcp") .withMechanismProperty("TOKEN_RESOURCE", "<audience>"); MongoClient mongoClient = MongoClients.create( MongoClientSettings.builder() .applyToClusterSettings(builder -> builder.hosts(Arrays.asList(new ServerAddress("<hostname>", <port>)))) .credential(credential) .build());
カスタム コールバック
Java ドライバーでは、Azure Functions や Azure Kubernetes Service(AKS)を含むすべてのプラットフォームで組み込みサポートを提供していません。 代わりに、OIDC を使用してこれらのプラットフォームから認証するためのカスタム コールバックを定義する必要があります。 そのためには、次のコード例に示すように、 "OIDC_CALLBACK"認証プロパティを使用します。
MongoCredential credential = MongoCredential.createOidcCredential(null) .withMechanismProperty("OIDC_CALLBACK", (context) -> { String accessToken = ... return new OidcCallbackResult(accessToken); });
"OIDC_CALLBACK"プロパティの値は、 OidcCallbackContextをパラメータとして受け入れ、 OidcCallbackResultを返すOidcCallback関数インターフェースの Lambda またはその他の実装である必要があります。
次の例では、サンプル コールバックを使用して、ローカル ファイル システム内の"access-token.dat"という名前のファイルから OIDC トークンを検索します。
MongoCredential credential = MongoCredential.createOidcCredential(null) .withMechanismProperty("OIDC_CALLBACK", (context) -> { string accessToken = new String(Files.readAllBytes(Paths.get("access-token.dat")); return new OidcCallbackResult(accessToken); }); MongoClient mongoClient = MongoClients.create( MongoClientSettings.builder() .applyToClusterSettings(builder -> builder.hosts(Arrays.asList(new ServerAddress("<hostname>", <port>)))) .credential(credential) .build());