MongoDBへの外部接続は、設定自体は簡単です。
ただし、注意しないと不正アクセスを受ける可能があります。
この記事では、そのあたりに注意した設定方法を解説しています。
本記事の内容
- MongoDBの設定ファイル変更
- MongoDBの設定ファイル反映
- ファイアウォールでポート開放
- MongoDBへの外部接続確認
それでは、上記に沿って解説していきます。
MongoDBの設定ファイル変更
大前提として、MongoDBはインストールしておいてください。
次の記事でUbuntuへのインストールを解説しています。
aptコマンドでインストールした場合、設定ファイルは次の場所にあります。
/etc/mongod.conf
まずは、バックアップを取っておきます。
$ sudo cp /etc/mongod.conf /etc/mongod.conf.org
では、設定ファイルを変更します。
今回は、外部接続を許可することが目的です。
そのための設定に絞って対応します。
この場合に注目するべき項目は、次の3つです。
- net.port
- net.bindIp
- security.authorization
それぞれを下記で説明します。
net.port
net部分は、次の値がデフォルトの設定となっています。
# network interfaces net: port: 27017 bindIp: 127.0.0.1
net.portは、MongoDBが利用するポートの設定です。
デフォルトは、上記にあるように27017となります。
変更したければ、変更しましょう。
デフォルトのポートを変更することも、セキュリティ対策の一つと言えます。
net.bindIp
外部接続を許可するホストのIPを設定します。
デフォルトは、上記にあるようにローカルホストが対象です。
複数を指定する場合は、「,」カンマ区切りで指定します。
bindIp: 127.0.0.1,192.168.11.1,192.168.11.2
すべてのホストを対象にする場合は、以下のように設定します。
bindIp: 0.0.0.0
security.authorization
ユーザー認証の有効・無効を設定します。
デフォルトでは、「disabled」です。
デフォルト設定は、無効ということになります。
つまり、ユーザー認証なしでMongoDBに接続できます。
デフォルトでは、項目自体が存在していません。
#security:
ユーザー認証を有効にしたいなら、以下のように設定します。
security: authorization: enabled
ユーザー認証を有効にする場合、認証用のユーザー作成は必須となります。
ここでは、ユーザー作成については説明しません。
まとめ
求めるセキュリティのレベルで設定内容は、変わってきます。
まずは、各自が求めるセキュリティのレベルを決めましょう。
決めた上で、私は次の設定を行います。
# network interfaces net: port: 27017 bindIp: 0.0.0.0 #security:
全ホストへ開放しているのに、ユーザー認証は無効化のままです。
この設定は、危険過ぎますね。
ただし、他でセキュリティを確保すれば問題はありません。
ファイアウォールやhosts.allowで制限すれば、危険ではなくなります。
結局、どこでホスト制限を行うかだけの話になります。
個人的には、各ソフトウェアレベルでのホスト制限は不要と考えています。
それ以外の場所において、一括で管理すべきだということです。
各ソフトウェアで制限していたら、管理がバラバラになってしまいます。
以上、 MongoDBの設定ファイル変更についての説明でした。
次は、 MongoDBの設定ファイル変更を反映させていきます。
MongoDBの設定ファイル反映
MongoDBの設定ファイル変更を反映するには、MongoDBを再起動する必要があります。
MongoDBの再起動は、次のコマンドで行います。
$ sudo systemctl restart mongod
上記を実行したら、起動状況を確認しておきます。
$ sudo systemctl status mongod ● mongod.service - MongoDB Database Server Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2021-06-11 20:31:35 JST; 5s ago Docs: https://docs.mongodb.org/manual Main PID: 27190 (mongod) Memory: 155.7M CGroup: /system.slice/mongod.service └─27190 /usr/bin/mongod --config /etc/mongod.conf 6月 11 20:31:35 ubuntu-focal systemd[1]: Started MongoDB Database Server.
「Active: active」とあるので、問題なく再起動できています。
以上、 MongoDBの設定ファイル反映について説明しました。
次は、ファイアウォールの開放を行います。
ファイアウォールでポート開放
MongoDBの初期ポートを変更していないなら、次のコマンドで状況を確認可能です。
$ sudo ufw status | grep '27017'
何も表示されないなら、「27017」は未開放という状況になります。
そもそも、「ufw」コマンドが動かない場合は、次の記事をご覧ください。
「ファイアウォールの設定」の箇所に、「ufw」のインストールについて説明があります。
「ufw」コマンドが動くなら、次のコマンドを実行します。
$ sudo ufw allow 27017 ルールを追加しました ルールを追加しました (v6)
では、再度ポートの状況確認です。
$ sudo ufw status | grep '27017' 27017 ALLOW Anywhere 27017 (v6) ALLOW Anywhere (v6)
ポートが、開放されています。
これで、外部からの接続が可能となります。
以上、ファイアウォールの開放について説明しました。
最後に、外部接続の動作確認を行います。
MongoDBへの外部接続確認
MongoDBへの接続確認は、次の二つの方法で行うことができます。
- MongoDB Compassによる接続
- Pythonによる接続
それぞれを下記で説明します。
説明においては、以下を条件とします。
名称 | IP | 機能・役割 |
サーバー | 192.168.33.60 | MongoDB |
クライアント | - | MongoDB Compass/Python |
MongoDB Compassによる接続
クライアント上でMongoDB Compassを起動します。
起動したら、コネクションの接続を行う設定が表示されます。
(利用しているMongoDB Compassのバージョンは、1.26.1です)
「Fill in connection fields individually」をクリック。
そうすると、以下の画面に切り替わります。
「Hostname」にサーバーのIPアドレス(192.168.33.60)を入力します。
「Port」は、そのままで変更しません。
「Authentication」には、ユーザー認証無効である「None」を選択。
「SRV Record」は、OFFのままでOKです。
設定を終えたら、「Connect」ボタンをクリック。
接続が上手く行けば、次のように表示が現れます。
サーバーにインストールしたMongoDBの情報が、表示されています。
Pythonによる接続
PyMongoを利用して、PythonからMongoDBに接続確認を行います。
正確には、接続してデータを登録します。
PyMongoについては、次の記事で解説しています。
上記記事内で紹介しているサンプルコードを利用します。
from pymongo import MongoClient # 接続先設定(サーバー→DB→コレクション) client = MongoClient('192.168.33.60', 27017) db = client.test_database collection = db.test_collection # 登録データ作成 post = {"author": "山田太郎", "text": "pymongoテスト", "tags": ["mongodb", "python", "pymongo"]} # 登録 post_id = collection.insert_one(post).inserted_id print(post_id) # 閉じる client.close()
このコードは、指定したデータベース・コレクションにデータを登録する処理です。
データベースやコレクションが存在しなければ、自動でそれぞれを作成します。
これは、MongoDBの特徴でもありますね。
もちろん、サーバー指定の部分は次のように変更しています。
「localhost」から「192.168.33.60」に変更です。
client = MongoClient('192.168.33.60', 27017)
上記のサンプルコードを実行すると、次のような文字列が表示されます。
60c35402a0d4111293ce2a01
このような文字列が現れると、データ登録は成功しています。
登録データの確認は、MongoDB Compassを利用します。
サンプルコードにより登録されたデータが、確認できますね。
以上、MongoDBへの外部接続確認を説明しました。