Ubuntu20.04でMongoDBのリモートアクセスを構成する方法
このチュートリアルの以前のバージョンは、 MelissaAndersonによって作成されました。
序章
MongoDB は、多くの最新のWebアプリケーションで使用されているドキュメント指向のデータベースです。 デフォルトでは、インストールされているのと同じサーバーから発信された接続のみが許可されます。 MongoDBをリモートで管理したり、別のアプリケーションサーバーに接続したりする場合は、デフォルトの構成にいくつかの変更を加える必要があります。
このチュートリアルでは、信頼できるリモートコンピューターからのアクセスを安全に許可するようにMongoDBインストールを構成します。 これを行うには、ファイアウォールルールを更新して、MongoDBが接続をリッスンしているポートへのリモートマシンアクセスを提供してから、構成ファイルを更新してIPバインディング設定を変更します。 次に、最後のステップとして、リモートマシンがデータベースに正常に接続できることをテストします。
前提条件
このチュートリアルを完了するには、次のものが必要です。
- Ubuntu20.04を実行しているサーバー。 このサーバーには、root以外の管理ユーザーとUFWで構成されたファイアウォールが必要です。 Ubuntu20.04の初期サーバーセットアップガイドに従ってこれをセットアップします。
- サーバーにインストールされているMongoDB。 このチュートリアルは、MongoDB 4.4以降がインストールされていることを前提としています。 このバージョンをインストールするには、 Ubuntu20.04にMongoDBをインストールする方法に関するチュートリアルに従ってください。
- MongoDBインスタンスにアクセスする2番目のコンピューター。 簡単にするために、このチュートリアルでは、このマシンが別のUbuntu 20.04サーバーであり、Ubuntu20.04の初期サーバーセットアップガイドに従って非ルート管理ユーザーとUFWファイアウォールが構成されていることを前提としています。 ただし、データベースサーバーでリモート接続を有効にする実際の手順を説明する手順1と2は、リモートマシンが実行しているオペレーティングシステムに関係なく機能します。
最後に、このチュートリアルを完了する必要はありませんが、データベースの管理ユーザーアカウントを作成し、認証を有効にして、MongoDBのインストールを保護することを強くお勧めします。 これを行うには、 Ubuntu20.04でMongoDBを保護する方法に関するチュートリアルに従ってください。
ステップ1—ファイアウォールを調整する
前提条件の初期サーバーセットアップチュートリアルに従い、サーバーでUFWファイアウォールを有効にしたと仮定すると、MongoDBインストールにインターネットからアクセスできなくなります。 同じサーバー上で実行されているアプリケーションでローカルでのみMongoDBを使用する場合は、これが推奨される安全な設定です。 ただし、リモートの場所からMongoDBサーバーに接続できるようにする場合は、新しいUFWルールを追加して、データベースがリッスンしているポートへの着信接続を許可する必要があります。
lsof
コマンドを使用して、MongoDBインストールがリッスンしているポートを確認することから始めます。 このコマンドは通常、システムで開いているすべてのファイルのリストを返しますが、-i
オプションと組み合わせると、ネットワーク関連のファイルまたはデータストリームのみが一覧表示されます。
次のコマンドは、lsof -i
によって生成された出力をmongo
という名前の文字列を検索するgrep
コマンドにリダイレクトします。
- sudo lsof -i | grep mongo
この出力例は、MongoDBがデフォルトポート27017
で接続をリッスンしていることを示しています。
Outputmongod 82221 mongodb 11u IPv4 913411 0t0 TCP localhost:27017 (LISTEN)
ほとんどの場合、MongoDBには、アプリケーションをホストしている別のサーバーや、リモートのMongoDBインスタンスの管理に使用されるローカルマシンなど、特定の信頼できる場所からのみアクセスする必要があります。 これを構成する1つの方法は、MongoDBサーバーで次のコマンドを実行することです。これにより、MongoDBのデフォルトのポートへのアクセスが可能になり、他の信頼できるマシンのIPアドレスのみが明示的に許可されます。
次のコマンドを実行し、trusted_machine_ip
をMongoDBインスタンスへのアクセスに使用する信頼できるリモートコンピューターのIPアドレスに変更してください。
注:信頼できるマシンのIPアドレスがわからない場合は、次のcurl
コマンドを実行できます。 これにより、Webサイトicanhazip.com
にアクセスし、コマンドを実行したマシンのIPアドレスが返されます。
curl -4 icanhazip.com
また、前のコマンドの出力で、MongoDBのインストールがデフォルト以外のポートでリッスンしていることが示された場合は、このコマンドで27017
の代わりにそのポート番号を使用します。
- sudo ufw allow from trusted_machine_ip to any port 27017
今後、別のマシンからMongoDBにアクセスしたい場合は、trusted_machine_ip
の代わりに新しいマシンのIPアドレスを使用してこのコマンドを再実行してください。
ufw
を使用して、ファイアウォール設定の変更を確認できます。
- sudo ufw status
出力には、リモートサーバーからポート27017
へのトラフィックが許可されていることが示されます。
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
27017 ALLOW trusted_machine_ip
OpenSSH (v6) ALLOW Anywhere (v6)
サービスへのアクセスを制限するためのより高度なファイアウォール設定は、 UFW Essentials:Common Firewall RulesandCommandsにあります。
次に、MongoDBをサーバーのパブリックIPアドレスにバインドして、リモートマシンからアクセスできるようにします。
ステップ2—パブリックbindIPを構成する
この時点で、ポートが開いていても、MongoDBは現在ローカルループバックネットワークインターフェイスである127.0.0.1
にバインドされています。 これは、MongoDBがインストールされているサーバーで発生した接続のみを受け入れることができることを意味します。
リモート接続を許可するには、MongoDB構成ファイル(/etc/mongod.conf
)を編集して、信頼できるリモートコンピューターが到達できるIPアドレスにMongoDBを追加でバインドする必要があります。 このようにして、MongoDBインストールは、リモートマシンからMongoDBサーバーに対して行われた接続をリッスンできるようになります。
お好みのテキストエディタでMongoDB構成ファイルを開きます。 次の例では、nano
を使用しています。
- sudo nano /etc/mongod.conf
network interfaces
セクションを見つけてから、bindIp
の値を見つけます。
. . .
# network interfaces
net:
port: 27017
bindIp: 127.0.0.1
. . .
この行にコンマを追加し、その後にMongoDBサーバーのパブリックIPアドレスを追加します。
. . .
# network interfaces
net:
port: 27017
bindIp: 127.0.0.1,mongodb_server_ip
. . .
これは、MongoDBをインストールしたサーバーのIPアドレスである必要があり、信頼できるリモートマシンのIPアドレスではないことに注意してください
ファイルを保存して閉じます。 nano
を使用した場合は、CTRL + X
、Y
、ENTER
の順に押してください。
次に、MongoDBを再起動して、この変更を有効にします。
- sudo systemctl restart mongod
その後、MongoDBインストールは、ポート27017
へのアクセスを許可したマシンからのリモート接続を受け入れることができるようになります。 最後のステップとして、ステップ1でファイアウォールの通過を許可した信頼できるマシンが、サーバーで実行されているMongoDBインスタンスに到達できるかどうかをテストできます。
ステップ3—リモート接続のテスト
パブリックにルーティング可能なIPアドレスで発生する接続をリッスンするようにMongoDBインストールを構成し、サーバーのファイアウォールを介してMongoのデフォルトポートへのリモートマシンアクセスを許可したので、リモートマシンが接続できることをテストできます。
注:前提条件のセクションで説明したように、このチュートリアルでは、リモートマシンがUbuntu20.04を実行している別のサーバーであると想定しています。 手順1と2で概説したリモート接続を有効にする手順は、リモートマシンが実行しているオペレーティングシステムに関係なく機能するはずですが、この手順で説明するテスト方法は、オペレーティングシステム間で普遍的に機能するわけではありません。
信頼できるコンピューターがMongoDBインスタンスに接続できることをテストする1つの方法は、nc
コマンドを使用することです。 nc
は、 netcat の略で、TCPまたはUDPとのネットワーク接続を確立するために使用されるユーティリティです。 IPアドレスとポート番号の両方を指定できるため、このような場合のテストに役立ちます。
まず、SSHを使用して信頼できるサーバーにログインします。
- ssh sammy@trusted_machine_ip
次に、-z
オプションを含む次のnc
コマンドを実行します。 これにより、nc
は、データを送信せずに、ターゲットサーバー上のリスニングデーモンのみをスキャンするように制限されます。 前提条件のインストールチュートリアルから、MongoDBがサービスデーモンとして実行されていることを思い出してください。このオプションは、接続のテストに役立ちます。 また、コマンドの冗長性を高めるv
オプションが含まれているため、netcatは他の方法では返さない出力を返します。
信頼できるリモートサーバーから次のnc
コマンドを実行し、mongodb_server_ip
をMongoDBをインストールしたサーバーのIPアドレスに置き換えてください。
- nc -zv mongodb_server_ip 27017
信頼できるサーバーがMongoDBデーモンにアクセスできる場合、その出力は接続が成功したことを示します。
OutputConnection to mongodb_server_ip 27017 port [tcp/*] succeeded!
互換性のあるバージョンのmongo
シェルがリモートサーバーにインストールされていると仮定すると、この時点で、ホストサーバーにインストールされているMongoDBインスタンスに直接接続できます。
接続する1つの方法は、次のように接続文字列URIを使用することです。
- mongo "mongodb://mongo_server_ip:27017"
注:推奨される Ubuntu 20.04でMongoDBを保護する方法チュートリアルに従うと、認証されていないユーザーに対するデータベースへのアクセスが遮断されます。 この場合、次のように、有効なユーザー名を指定するURIを使用する必要があります。
- mongo "mongodb://username@mongo_server_ip:27017"
シェルは、ユーザーのパスワードを入力するように自動的に促します。
これで、MongoDBサーバーが信頼できるサーバーからの接続を受け入れることができることを確認しました。
結論
これで、リモートサーバーからMongoDBインストールにアクセスできます。 この時点で、信頼できるサーバーからリモートでMongoDBデータベースを管理できます。 または、信頼できるサーバーで実行し、データベースをリモートで使用するようにアプリケーションを構成することもできます。
管理ユーザーを構成して認証を有効にしていない場合は、リモートサーバーにアクセスできるすべてのユーザーがMongoDBインストールにアクセスできます。 まだ行っていない場合は、 Ubuntu 20.04でMongoDBを保護する方法のガイドに従って、管理ユーザーを追加し、さらにロックダウンすることを強くお勧めします。