MongoDBへの外部接続を許可する方法【Pythonで接続確認】

MongoDBへの外部接続を許可する方法【Pythonで接続確認】 サーバー

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.60MongoDB
クライアント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への外部接続確認を説明しました。

タイトルとURLをコピーしました