MongoDBを本番環境にデプロイする場合、セキュリティと可用性を最大化するために、SSL対応の地理分散レプリカセット構成を使用することを強くお勧めします。 ScaleGridには、SSLを設定するための2つのオプションがあります。
1つのオプションは、独自のCA署名SSL証明書を購入し、MongoDBサーバーで構成することです。アプリケーションがパブリックネットワークを介して本番データベースに接続している場合は、[email protected]に連絡して詳細を確認してください。
ただし、デフォルトでは、新しいクラスターのノードを作成するときに、SSLの自己署名証明書を構成します。これにより、余分なコストが回避され、正しく構成されていれば同様に安全になります。ただし、これは、MongoDBドライバーが証明書チェーンを検証するために何らかの支援を必要としていることを意味します。
自己署名証明書を処理する場合、一部の開発者は検証を完全に回避し、セキュリティを大幅に侵害します。このブログ投稿では、公式のC#MongoDBドライバーを使用して、SSLの自己署名証明書で構成されたMongoDBサーバーに安全に接続するための2つの方法を紹介します。いくつかの簡単な手順で、サーバー証明書を検証し、接続を安全に保つために必要な情報をドライバーに提供できます。
MongoDB SSLをC#アプリケーションに接続する方法クリックしてツイート前提条件
続行する前に
- アプリケーションがScaleGridデプロイメントに接続できることを確認してください。アプリケーションをScaleGridデプロイメントに接続するための一般的な手順を確認するには、MongoDB接続のヘルプドキュメントを参照してください。
- MongoDBドライバーをインストールする必要があります。 C#MongoDB.Driverをインストールして使用する手順を確認するには、MongoDBドライバーのドキュメントを参照してください。
注:すべてのコードサンプルは、MongoDBDriverv2.8.1と.NETFrameworkv4.6.1を使用してテストされています。ただし、適度に新しいバージョンの.NETFrameworkとMongoDBドライバーで動作するはずです。
忘れないでください…コードサンプルのファイルパスと接続URLを独自のファイルパスとURLに変更します。それ以外の場合、コードサンプルは機能しません。変更が必要な箇所については、コードサンプルの太字部分をご覧ください。 例: |
方法1:ScaleGrid証明書をWindowsトラストストアに追加する
C#および.NET Frameworkで自己署名証明書を使用する最も簡単な方法の1つは、Windowsトラストストアに証明書を「信頼されたルート」として追加することです。方法は次のとおりです。
- ScaleGridUIからCA証明書をダウンロードします。
- PowerShellプロンプトを開く–すべてのユーザーのtrusted-rootとして証明書を追加する場合は、管理モードで開く必要があります。
- 次のコマンドを実行するか、Microsoft管理コンソールを使用してこれを実行します。:
- 現在のユーザーのみに追加するには:
Import-Certificate -FilePath <path-to-downloaded-CA-Cert.cer> -CertStoreLocation 'Cert:\CurrentUser\Root'
- すべての人のために追加するには:
Import-Certificate -FilePath <path-to-downloaded-CA-Cert.cer> -CertStoreLocation Cert:\LocalMachine\Root'
以上です。これで、自己署名証明書はすべてのデフォルトの検証に合格し、MongoDBクライアントを作成する準備が整いました。
var connURL = "mongodb://admin:<password>@<host1>,<host2>:27017/admin?replicaSet=<ReplicaSetName>&ssl=true"; var client = new MongoClient(connURL);
方法2:カスタム検証コールバックの使用
WindowsトラストストアへのScaleGrid証明書の追加には2つの問題があります。
- 設定は、マシンで実行されているすべてのプログラムに適用されます。これはセキュリティの脆弱性である可能性があります。
- これは、マシンごとに1回実行する必要があります。コードを新しいサーバーに移動すると、突然機能しなくなる可能性があります。これにより、メソッドに人為的エラーが発生しやすくなります。
したがって、自己署名証明書を使用して接続するための推奨される方法は、証明書を検証するカスタム検証コールバックを使用することです。これを行う方法は次のとおりです。
- CA証明書をダウンロードして、アプリケーションがアクセスできる場所に保存します(通常はデータディレクトリになります)。
- アプリケーションから、この証明書を読み取り、MongoDBサーバーから受け取った証明書と一致させることができます。
- または、証明書の暗号化ハッシュを保存することもできます。証明書を読み取って照合する代わりに、受信した証明書に対して暗号化ハッシュを計算し、結果を照合することができます。
これは、CA証明書がcaCert.cerという名前でbinディレクトリに保存されているサンプルプログラムです。 MongoDBサーバーに存在するすべてのデータベースのリストを出力するだけです:
using MongoDB.Bson; using MongoDB.Driver; using System; using System.Collections.Generic; using System.Linq; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Threading.Tasks; namespace TestMongoDB { class Program { static void Main(string[] args) { var connURL = "mongodb:<password>//admin:@<host1>,<host2>:27017/admin?replicaSet=<Replica-Set-Name>&ssl=true"; var clientSettings = MongoClientSettings.FromUrl(new MongoUrl(connURL)); clientSettings.UseSsl = true; clientSettings.VerifySslCertificate = true; clientSettings.SslSettings = new SslSettings(); clientSettings.SslSettings.ServerCertificateValidationCallback = ValidateServerCertficate; var client = new MongoClient(clientSettings); using (IAsyncCursor cursor = client.ListDatabases()) { while (cursor.MoveNext()) { foreach (var doc in cursor.Current) { Console.WriteLine(doc["name"]); // database name } } } } private static bool ValidateServerCertficate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors sslPolicyErrors) { bool certMatch = false; // Assume failure switch(sslPolicyErrors) { case SslPolicyErrors.None: Console.WriteLine("No validation errors - accepting certificate"); certMatch = true; break; case SslPolicyErrors.RemoteCertificateChainErrors: Console.WriteLine("Failed to validate certificate chain. Most likely a self-signed certificate"); if (chain.ChainElements.Count == 1 && chain.ChainStatus[0].Status == X509ChainStatusFlags.UntrustedRoot) //It is a self-signed certificate, so chain length will be 1. { X509Certificate savedCert = X509Certificate.CreateFromCertFile("caCert.cer"); if (savedCert.Equals(cert)) //This verifies that the issuer and serial number matches. You can also use a cryptographic hash, or match the two certificates byte by byte. { Console.WriteLine("The certificates match"); certMatch = true; } } break; default: Console.WriteLine("Name mismatch or remote-cert not available. Rejecting connection"); break; } return certMatch; } } }
トラブルシューティング
SSL対応のMongoDBデプロイメントへの接続に問題がある場合は、デバッグのヒントをいくつか紹介します。
- まず、アプリケーションが実行されているサーバーから実際にMongoDBサーバーに接続できることを確認します。これを行う最も簡単な方法は、クライアントマシンにmongoシェルをインストールすることです。 Linuxでは、MongoDBサーバー全体をインストールする必要はありません。シェルのみをインストールすることを選択できます。シェルが利用可能になったら、サーバーへの接続を試みるために提供されている「コマンドライン構文」を使用してみてください。
- mongoシェルを介して接続できない場合は、クライアントマシンがMongoDBサーバーのポート27017に到達できないことを意味します。セキュリティグループ、VPC、ScaleGridファイアウォールの設定を調べて、クライアントマシンとサーバーマシンの間に接続があることを確認します。
- ネットワーク接続が正しい場合、次に確認することは、MongoDBサーバーのバージョンと互換性のあるバージョンのMongoDBドライバーと.NETFrameworkを使用していることです。
- ドライバーのバージョンが正しいことを確認した場合は、上記の例と同様に、サンプルのC#プログラムをデバッグモードで実行してみてください。ステップバイステップの実行は、ルートが問題を引き起こすのに役立ちます。
- それでもインスタンスへの接続に問題がある場合は、support @ scalegrid.ioに連絡して、上記のトラブルシューティング手順の詳細な結果と、使用しているC#およびMongoドライバーの正確なバージョンをお知らせください。
ScaleGridを初めて使用し、このチュートリアルを試してみたい場合は、30日間の無料トライアルにサインアップして、プラットフォームを探索し、MongoDBをC#アプリケーションに接続してテストしてください。 。