MongoDBにTLS/SSLで接続する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、菊池です。

MongoDB に接続する際にTLS/SSLを有効にする方法を調べてみました。

概要

クライアントがMongoDBへ接続する際の通信をTLS/SSLで暗号化します。クライアント認証/サーバ認証を行うことも可能ですが、今回は暗号化のみが目的ということで自己署名証明書を作成して実施しました。

詳細は公式ドキュメントを併せて参照してください。

環境はAmazon Linux、MongoDBはバージョン3.4.2を使用しています。

また、前提としてopensslがインストールされている必要があります。(Amazon Linuxはインストール済み)

やってみた

1. MongoDBインストール

まずはMongoDBをインストールします。yumでインストールするため、/etc/yum.repos.d/mongodb-org-3.4.repoに以下を記述します。

[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc

yumコマンドでMongoDB一式をインストールします。

# yum install -y mongodb-org

2. 秘密鍵/証明書の作成

opensslで秘密鍵と証明書を作成します。

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

作成した秘密鍵/証明書を結合してpemファイルを作成します。

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

3. MongoDBの設定・起動

続いてMongoDB側の設定です。設定ファイル/etc/mongod.confを以下のように記述しました。

systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

storage:
  dbPath: /data/db
  journal:
    enabled: true

processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongodb/mongod.pid  # location of pidfile

net:
  port: 27017
  ssl:
    mode: requireSSL
    PEMKeyFile: /etc/ssl/mongodb.pem

net:の項目でSSLを必須として、作成したpemファイルを指定します。

準備ができたらサーバを起動します。

# service mongod start
Starting mongod:                                           [  OK  ]

4. クライアントから接続

クライアントからmongoshellで接続します。TLS/SSLを使う場合には--sslを使用します。また、今回は自己署名証明書を使うため、証明書の検証でエラーとならないよう、--sslAllowInvalidCertificatesをつけて接続します。

$ mongo --ssl --host 172.31.28.253 --sslAllowInvalidCertificates
MongoDB shell version v3.4.2
connecting to: mongodb://172.31.28.253:27017/
2017-02-26T04:08:00.738+0000 W NETWORK  [thread1] SSL peer certificate validation failed: self signed certificate
2017-02-26T04:08:00.738+0000 W NETWORK  [thread1] The server certificate does not match the host name. Hostname: 172.31.28.253 does not match CN: mongo.local
MongoDB server version: 3.4.2
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
       	http://docs.mongodb.org/
Questions? Try the support group
       	http://groups.google.com/group/mongodb-user
Server has startup warnings:
2017-02-26T04:05:15.194+0000 I STORAGE  [initandlisten]
2017-02-26T04:05:15.194+0000 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2017-02-26T04:05:15.194+0000 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2017-02-26T04:05:15.237+0000 I CONTROL  [initandlisten]
2017-02-26T04:05:15.237+0000 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2017-02-26T04:05:15.237+0000 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2017-02-26T04:05:15.237+0000 I CONTROL  [initandlisten]
2017-02-26T04:05:15.237+0000 I CONTROL  [initandlisten]
2017-02-26T04:05:15.237+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2017-02-26T04:05:15.237+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2017-02-26T04:05:15.237+0000 I CONTROL  [initandlisten]
>
> version()
3.4.2
>

署名書の警告などが出ていますが、接続できました!

最後に

今回はmongoshellを利用して接続しましたが、アプリケーションで実装する場合には各言語のドライバーを参照しましょう。

MongoDBへのアクセスをTLS/SSLで暗号化することで、インターネットを経由する場合などでも盗聴リスクを軽減することができます。ただし、MongoDBやopensslの脆弱性による攻撃リスクなどもありますので、DBを直接インターネットに開放するのはできるだけ避けるのがよいでしょう。やむをえず直接開放する場合には、IPアドレス制限や適切な認証を組みわせることで安全性を高めましょう。