Overview
このガイドでは、TLS(Transport Layer Security)プロトコルを使用してMongoDBデプロイへの接続を保護する方法を説明します。
TLS を使用してMongoDBデプロイに接続するには、次の手順を実行する必要があります。
Mongo::Clientで TLS 接続を有効にします。クライアント TLS 証明書を指定します。
サーバーの TLS 証明書を検証するための証明機関(CA)証明書を指定します。
MongoDBTLS 用の 配置の構成方法については、 マニュアルの「 TLS 構成ガイド MongoDB Server」を参照してください。
注意
このページでは、TLS/SSL に関する事前の知識と、有効な証明書にアクセスすることを前提としています。TLS/SSL、PKI(公開鍵基盤)証明書、CAについての詳細な説明は、このドキュメントの範囲外です。TLS の詳細については、 Wikipedia の トランスポート層セキュリティ に関するエントリを参照してください。
TLS の有効化
MongoDBデプロイへの接続に TLS を有効にするには、次の方法があります。
新しい
Mongo:Clientオブジェクトで、sslオプションをtrueに設定します。接続文字列で
tlsオプションをtrueに設定します。
注意
SSL 命名規則
Rubyドライバー v2.6 以降でサポートされているすべてのMongoDB Serverバージョンは TLS のみを実装します。 2.6 と は SSL を使用しません。
過去の理由で、 Rubyドライバーは TLS オプションの前に tls ではなく ssl を付けます。Rubyドライバー バージョン 3.0 以降では、 Rubyオプション名に tls プレフィックスが使用されます。
証明書を構成するには、次のオプションを指定する必要があります。
ssl_cert: MongoDBデプロイへの接続を検証するために使用される証明ファイル。ssl_key: MongoDBデプロイへの接続を確認するために使用される秘密キーファイル。ssl_ca_cert: MongoDBデプロイからクライアントに渡された証明書を検証するために使用される連結された CA 証明書を含むファイル。このオプションに値を指定しない場合、ドライバーはデフォルトのシステム ルート証明書ストアを信頼アンカーとして使用します。
次の例では 、TLS 証明書と対応する秘密キーが別々のファイルに提供されています。
client = Mongo::Client.new(["<hostname>:<port>"], ssl: true, ssl_cert: 'path/to/client.crt', ssl_key: 'path/to/client.key', ssl_ca_cert: 'path/to/ca.crt' )
単一のファイルで TLS 証明書と秘密キーの両方を指定できますが、証明書と秘密キーオプションの両方を指定する必要があります。次の例では、TLS 証明書と秘密キーの両方が同じ client.pemファイルで定義されています。
client = Mongo::Client.new(["<hostname>:<port>"], ssl: true, ssl_cert: 'path/to/client.pem', ssl_key: 'path/to/client.pem', ssl_ca_cert: 'path/to/ca.crt', )
証明書を構成するには、次の URI オプションを指定する必要があります。
tlsCertificateKeyFile: MongoDBデプロイへの接続を検証するために使用される証明書とキーファイルを含むファイル。tlsCAFile: MongoDBデプロイからクライアントに渡された証明書を検証するために使用される連結された CA 証明書を含むファイル。このオプションに値を指定しない場合、ドライバーはデフォルトのシステム ルート証明書ストアを信頼アンカーとして使用します。
client = Mongo::Client.new( "mongodb://<hostname>:<port>/?tls=true&tlsCertificateKeyFile=path%2fto%2fclient.pem&tlsCAFile=path%2fto%2fca.crt")
証明書と鍵を含むファイルの拡張子は通常、``.ct`` または .pem です。
URI オプション値はパーセント エンコードされる必要があります。これは、例パス内のスラッシュ(/)に適用され、%2f としてエンコードされます。
クライアント TLS 証明書の指定
Rubyドライバーには、異なるデータ型またはオブジェクト型で TLS 証明書、キー、CA 証明書を指定するための複数のオプションが用意されています。
TLS 証明書
TLS 証明書を指定するには、次のいずれかのオプションを指定できます。
オプション名 | データ/オブジェクト タイプを受け入れ | 説明 |
|---|---|---|
|
| MongoDBデプロイへの接続を検証するために使用される証明ファイルのパス。 |
|
| MongoDBデプロイへの接続を検証するために使用される証明書オブジェクト。 |
|
| MongoDBデプロイへの接続を検証するために使用される PEM でエンコードされた証明書を含む string 。 |
TLS 秘密キー
TLS秘密キーを指定するには、次のいずれかのオプションを指定できます。
オプション名 | データ/オブジェクト タイプを受け入れ | 説明 |
|---|---|---|
|
| MongoDBデプロイへの接続を確認するために使用される秘密キーファイルのパス。 |
|
| MongoDBデプロイへの接続を検証するために使用される秘密キーオブジェクト。 |
|
| 秘密キーのパスフレーズ。 |
|
| MongoDBデプロイへの接続を検証するために使用される PEM でエンコードされた秘密キーを含む string 。 |
TLS CA 証明書
TLS CA 証明書を指定するには、次のいずれかのオプションを指定できます。
オプション名 | データ/オブジェクト タイプを受け入れ | 説明 |
|---|---|---|
|
| MongoDBデプロイからクライアントに渡された証明書を検証するために使用される連結された CA 証明書を含むファイルパス。 |
|
| MongoDBデプロイからクライアントに渡された証明書を検証するために使用される CA 証明書を表すオブジェクトの配列。 |
|
| MongoDBデプロイからクライアントに渡された証明書を検証するために使用される 1 つの PEM でエンコードされた CA 証明書を含む string 。 |
TLS コンテキストの変更
TLS 構成をカスタマイズする必要がある場合は、ネイティブRuby Procオブジェクトを Mongo.tls_context_hooks 配列に追加することで TLS コンテキスト フックを設定できます。Mongo::Client インスタンスを作成する前に、Procオブジェクトを配列に追加してください。
次のコード例では、TLS で使用される唯一の暗号として AES256-SHA 暗号を有効にします。
Mongo.tls_context_hooks.push( Proc.new { |context| context.ciphers = ["AES256-SHA"] } )
Rubyドライバー TLS コンテキスト オプションは、SSL のネイティブRuby処理に基づいています。利用可能な TLS コンテキスト オプションの詳細については、SSLContext のRubyドキュメントを参照してください。
OCSP 検証
サーバーによって提供された証明書に OCSP エンドポイント URI が含まれている場合、ドライバーはデフォルトで指定されたエンドポイントに OCSP(Online Certificate Status Protocol、オンライン証明書ステータス プロトコル)リクエストを発行して、証明書の有効性を確認します。
OCSP エンドポイント チェックを無効にするには、クライアントの作成時に :ssl_verify_ocsp_endpoint Rubyオプションを false に設定するか、tlsDisableOCSPEndpointCheck URI オプションを true に設定します。
注意
JRuby は OCSP 検証をサポートしていません
JRuby は OCSP エンドポイント URI を正しく公開しないため、ドライバーは基礎となるアプリケーションが JRuby で実行される場合、OCSP エンドポイントをチェックしません。
注意
Let's Encrypt OCSP の廃止
Let's Encrypt は新しい証明書の OCSP サポートを終了しました。Let's Encrypt が発行した新しい証明書に OCSP 応答者 URL が含まれていない場合があります。OCSP 失効チェックは、証明書に OCSP URI が含まれている場合にのみ発生するため、OCSP URL がないことは予想され、MongoDB 配置に必ずしも問題があることを意味しません。
AllowInsecureTls
TLS が有効になっている場合、 Rubyドライバーはサーバーが提示した証明書を自動的に検証します。コードをテストするときは、この検証を無効にできます。これは安全でない TLSと呼ばれます。
安全でない TLS が有効になっている場合、ドライバーは X. 509証明書の提示のみを必要としサーバー。 次のいずれかに当てはまる場合でも、ドライバーは証明書を受け入れます。
サーバーのホスト名と証明書のサブジェクト名(またはサブジェクトの別名)が一致しません。
証明書の有効期限が切れているか、まだ有効ではありません。
証明書のチェーン内に信頼できるルート証明書がありません。
証明書の目的がサーバー識別には無効です。
注意
安全でない TLS が有効になっている場合でも、クライアントとサーバー間の通信は TLS で暗号化されます。
安全でない TLS を有効にするには、sslVerifyクライアントオプションまたは tlsInsecure URI オプションを true に設定します。
client = Mongo::Client.new(["<hostname>:<port>"], ssl: true, ssl_verify: false )
client = Mongo::Client.new('mongodb://<hostname>:<port>/?tls=true&tlsInsecure=true')
同様に、次のオプションを設定して、証明書またはホスト名の検証を無効にすることもできます。
ssl_verify_certificate: オプションをfalseに設定して、証明書の検証を無効にします。ssl_verify_hostname: オプションをfalseに設定して、ホスト名検証を無効にします。
tlsAllowInvalidCertificates: オプションをtrueに設定して、証明書の検証を無効にします。tlsAllowInvalidHostnames: オプションをtrueに設定して、ホスト名の検証を無効にします。
警告
本番環境では安全でない TLS を使用しないでください
本番環境では安全でない TLS は常に無効にしてください。
実稼働環境で安全でない TLS を有効にすると、アプリケーションが安全でなくなり、有効なクライアントインスタンスとみなされる期限切れの証明書や外部プロセスに対して脆弱になる可能性があります。
API ドキュメント
このガイドで説明する型とメソッドの詳細については、次のAPIドキュメントを参照してください。