読者です 読者をやめる 読者になる 読者になる

望月いちろうのREADME.md

書き溜めておいた技術記事や旅行記のバックアップです。

MongoDB で TLS / SSL通信 を有効化させる方法

MongoDB セキュリティ

MongoDBで複数のインスタンスを利用したり、外部のアプリケーションからデータベースを参照するときがある。このとき、 サーバー間の情報のやり取りを暗号化するのが常識です。

バージョンについて

MongoDBの古いバージョンではSSL通信をサポートしていないことがあります。少なくとも最新バージョンの3.2ではSSL通信に完全に対応しているのでそれを利用すべきでしょう。

アプリケーションのSSL対応

アプリケーションの利用するプログラミング言語が最新型のSSL通信に対応しているか確認してください。少なくともPython, Java, RubyやNode.jsといった一般的な言語であれば大丈夫でしょう。

SSLの認証局について

もし実運用で利用する際は公式の認証局の発行した署名付き暗号鍵を利用すべきですが、ここではテスト用にオレオレ証明書(利用者自身で署名した証明書)を利用したいと思います。

注意すべきなのはMongoDBはSSL通信の暗号化自体はチェックしてもその証明書の正当性はチェックしないということです。ですから証明書の期限が切れてしまってもMongoDBは特に警告することなしに通信を実行します。これはセキュリティの観点から好ましくないことですので注意すべきでしょう。

ただしmongoなどのMongoDBクライアントはデフォルトの設定で証明書が不正なものであった場合はエラーを吐いて接続を行いません。どうしても自己署名の証明書を利用したいなどの場合は--sslAllowInvalidCertificatesのオプションをつけることで利用が可能です。現在はLet's Encryptなどの無料サービスがあるので極力自己署名の証明書は避けるべきでしょう。

証明書の発行

ここではテストのために自己署名証明書(オレオレ証明書)を利用してみたいと思います。

cd /etc/ssl/
openssl req -newkey rsa:2048 -new -x509 -days 365 -nodes -out mongodb-cert.crt -keyout mongodb-cert.key

openssl req のオプションについて

オプション 引数 例の説明
-new なし 新規に鍵を作成
-newkey rsa:2048 rsa2048ビットの秘密鍵を指定
-day 365 証明書の有効期限を365日にする
-out mongo_test_cert.crt 証明書署名要求ファイルの名前をmongo_test_cert.crtに指定
-keyout mongo_test_cert.key 出力される秘密鍵の名前をmongo_test_cert.key
-x509 無し X.509形式の証明書署名要求ファイルを作成する

このじてんで証明書署名要求ファイルと秘密鍵ファイルが作成されました。

次は公開鍵ファイルを作成します

cat mongodb-cert.key mongodb-cert.crt > mongo_test.pem

証明書署名要求・秘密鍵・公開鍵の作成が完了しました。

MongoDBをSSLモードで起動する(暗号化のみ)

mongodでMongoDBのインスタンスを立ち上げるときに以下のコマンドを追加してください。 --sslPEMKeyFileで公開鍵のパスを指定します。ここでは/etc/ssl/mongo_test.pemですね。

mongod --sslMode requireSSL --sslPEMKeyFile /etc/ssl/mongo_test.pem 

--sslModeの引数について

設定 説明
requireSSL SSL通信を必ず有効化する
allowSSL SSL通信を有効化する
preferSSL 可能な限りSSL通信を有効化する。

SSL通信を有効化した際にクライアント側でもSSLについてのオプションを指定することを忘れないでください。 例えば、mongoでSSL通信を行う場合はオプション--sslを指定します。

mongo --ssl 

MongoDBをSSLモードで起動する(証明書付き)

この場合は認証局から発行された証明書チェーンデータ(.ca)を用意する必要があります。また、公開鍵も当然署名つきであることが要求されます。 証明書チェーンデータのパスは--sslCAFileで指定します。ここでは/etc/ssl/certifi.pemですね。

mongod --sslMode requireSSL --sslPEMKeyFile /etc/ssl/mongo_test.pem --sslCAFile /etc/ssl/certifi.pem