前書き

MongoDBは、無料でオープンソースのドキュメント指向データベースです。 従来のテーブルベースのリレーショナルデータベース構造に依存しないため、NoSQLデータベースとして分類されます。 代わりに、動的スキーマを持つJSONのようなドキュメントを使用します。 リレーショナルデータベースとは異なり、MongoDBは、データベースにデータを追加する前に事前定義されたスキーマを必要としません。 更新されたスキーマを使用して新しいデータベースをセットアップすることなく、いつでも必要に応じてスキーマを変更できます。

このチュートリアルのパート1では、MongoDBリポジトリを使用して、MongoDBの最新バージョンをインストールします。 パート2では、認証を有効にしてローカルシステムでセキュリティを保護します。 最後に、パート3では、必要な場合にリモート接続をより安全に許可する方法を示します。

前提条件

このチュートリアルを実行するには、次のものが必要です。

  • * https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04に従って、非ルートの「+ sudo +」ユーザーとファイアウォールで設定された1つのUbuntu 16.04サーバー* [Ubuntu 16.04初期サーバーセットアップガイド]。

これが準備できたら、次の手順に進む準備ができました。

パート1:サーバーのセットアップ

手順1-MongoDBリポジトリの追加

MongoDBはすでにUbuntuパッケージリポジトリに含まれていますが、公式のMongoDBリポジトリは最新バージョンを提供し、ソフトウェアのインストール方法として推奨されています。 このステップでは、この公式リポジトリをサーバーに追加します。

UbuntuはGPGキーで署名されていることを確認することでソフトウェアパッケージの信頼性を保証するため、最初に公式のMongoDBリポジトリのキーをインポートする必要があります。

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6

次の出力は、キーが正常にインポートされたことを確認しています。

出力

Executing: /tmp/tmp.IdwenTia0s/gpg.1.sh --keyserver
hkp://keyserver.ubuntu.com:80
--recv
0C49F3730359A14518585931BC711F9BA15703C6
gpg: requesting key A15703C6 from hkp server keyserver.ubuntu.com
gpg: key A15703C6: public key "MongoDB 3.4 Release Signing Key <[email protected]>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

次に、MongoDBリポジトリの詳細を追加し、 `+ apt +`がパッケージのダウンロード先を認識できるようにします。 次のコマンドを発行してMongoDB用のリストファイルを作成します。

echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list

最後に、パッケージリストを更新します。

sudo apt-get update

これで、MongoDBをインストールする準備ができました。

ステップ2-MongoDBのインストール

サーバーにデーモン、構成および初期化スクリプト、シェル、管理ツールを含む、「+ mongodb-org +」メタパッケージをインストールします。

sudo apt-get install mongodb-org

Enterキーを押すか、「+ Y +」と入力してプロンプトが表示されたら続行します。 インストールが完了したら、Mongoデーモンを起動します。

sudo systemctl start mongod

`+ systemctl +`は出力を提供しないため、ステータスをチェックして、サービスが適切に開始されたことを確認します。

sudo systemctl status mongod

出力

● mongod.service - High-performance, schema-free document-oriented database
  Loaded: loaded (/lib/systemd/system/mongod.service; disabled; vendor preset: enabled)
  Active: active (running) since Fri 2017-02-17 18:57:26 UTC; 17min ago
    Docs: https://docs.mongodb.org/manual
Main PID: 2811 (mongod)
   Tasks: 17
  Memory: 56.8M
     CPU: 7.294s
  CGroup: /system.slice/mongod.service
          └─2811 /usr/bin/mongod --quiet --config /etc/mongod.conf

終了するには、「+ q +」を押します。 デーモンを手動で開始し、実行されていることを確認したので、起動時にデーモンが自動的に再起動することを確認します。

sudo systemctl enable mongod

次の出力は、コマンドが成功したことを確認します。

OutputCreated symlink from /etc/systemd/system/multi-user.target.wants/mongod.service
to /lib/systemd/system/mongod.service.

次に、データベースを保護するための重要な手順を実行します。

パート2:MongoDBの保護

MongoDBの以前のバージョンは、デフォルトではデータベースと対話するために認証が必要なかったため、自動化されたエクスプロイトに対して脆弱でした。 デフォルトでは、すべてのユーザーがデータベースの作成と破棄、およびコンテンツの読み取りと書き込みを行うことができます。 これらの以前のバージョンでは、デフォルトですべてのインターフェイスをリッスンするようにMongoDBデーモンも構成されていたため、自動化されたスクリプトがファイアウォールで保護されていないMongoDBインスタンスを検出し、認証が有効になっていない場合は完全なアクセス権を取得したため、これはさらに複雑になりましたMongoDBへ。

デーモンが127.0.0.1にバインドされ、Unixソケットでの接続のみを受け入れるようになったため、3.xリリースおよび一部のパッケージマネージャーによって提供された以前のバージョンで状況が緩和されました。 インターネットに対して自動的に開かれません。

ただし、認証はデフォルトで無効になっているため、ローカルシステムのユーザーはデータベースに完全にアクセスできます。 これを保護するために、管理ユーザーを作成し、認証を有効にしてテストします。

手順1-管理ユーザーの追加

ユーザーを追加するには、Mongoシェルに接続します。

mongo

Mongoシェルを使用したときの出力は、データベースに対してアクセス制御が有効になっていないこと、およびデータと構成への読み取り/書き込みアクセスが制限されていないことを警告しています。

OutputMongoDB shell version v3.4.2
connecting to: mongodb://127.0.0.1:27017
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-21T19:10:42.446+0000 I STORAGE  [initandlisten]
2017-02-21T19:10:42.446+0000 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2017-02-21T19:10:42.446+0000 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2017-02-21T19:10:42.534+0000 I CONTROL  [initandlisten]
2017-02-21T19:10:42.534+0000 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2017-02-21T19:10:42.534+0000 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2017-02-21T19:10:42.534+0000 I CONTROL  [initandlisten]
>

特権レベルはロール「+ userAdminAnyDatabase 」の割り当てに由来するため、管理ユーザーの名前は自由に選択できます。 データベース「 admin +」は、資格情報の保存場所を指定します。 認証の詳細については、MongoDBセキュリティhttps://docs.mongodb.com/manual/core/authentication/ [認証]セクションをご覧ください。

任意のユーザー名を設定し、独自の安全なパスワードを選択して、以下のコマンドでそれらを置き換えるようにしてください。

use admin
db.createUser(
 {
   user: "",
   pwd: "",
   roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
 }
)

`+ db.createUser +`コマンドを発行すると、コマンドが完了するまでシェルは各行の前に3つのドットを追加します。 その後、ユーザーが追加されたときに次のようなフィードバックを受け取る必要があります。

Output> use admin
switched to db admin
> db.createUser(
...   {
...     user: "AdminSammy",
...     pwd: "AdminSammy'sSecurePassword",
...     roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
...   }
... )
Successfully added user: {
       "user" : "AdminSammy",
       "roles" : [
               {
                       "role" : "userAdminAnyDatabase",
                       "db" : "admin"
               }
       ]
}

「exit」と入力して「+ ENTER 」を押すか、「 CTRL + C +」を使用してクライアントを終了します。

この時点で、ユーザーは資格情報を入力できますが、認証を有効にしてMongoDBデーモンを再起動するまで、資格情報を入力する必要はありません。

ステップ2-認証を有効にする

認証は `+ mongod.conf `ファイルで有効になっています。 有効にして「 mongod +」を再起動しても、ユーザーは認証なしでMongoに接続できますが、ユーザーは対話する前にユーザー名とパスワードを入力する必要があります。

設定ファイルを開きましょう:

sudo nano /etc/mongod.conf

「#security +」セクションでは、「 security +」の前にあるハッシュを削除して、スタンザを有効にします。 次に、認証設定を追加します。 完了すると、行は次の抜粋のようになります。

mongodb.conf

. . .


. . .

「セキュリティ」行の先頭にはスペースがなく、「承認」行は2つのスペースでインデントする必要があります。

ファイルを保存して終了したら、デーモンを再起動します。

sudo systemctl restart mongod

設定に誤りがあると、ダメオンは起動しません。 `+ systemctl `は出力を提供しないため、 ` status +`オプションを使用して、次のことを確認します。

sudo systemctl status mongod

出力に `+ Active:active(running)`が表示され、下のテキストのようなもので終わる場合、 ` restart +`コマンドが成功したことを確認できます。

OutputJan 23 19:15:42 MongoHost systemd[1]: Started High-performance, schema-free document-oriented database.

デーモンが起動していることを確認したら、認証をテストしましょう。

手順3-認証されていないユーザーが制限されていることを確認する

まず、資格情報なしで接続して、アクションが制限されていることを確認します。

mongo

認証を有効にしたので、以前の警告はすべて解決されました。

OutputMongoDB shell version v3.4.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2

`+ test`データベースに接続しています。 `+ show dbs +`コマンドでアクセスが制限されていることをテストします:

show dbs
Output2017-02-21T19:20:42.919+0000 E QUERY    [thread1] Error: listDatabases failed:{
       "ok" : 0,
       "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
       "code" : 13,
       "codeName" : "Unauthorized"
. . .

認証なしにユーザーや同様の特権を持つタスクを作成することはできません。

続行するにはシェルを終了しましょう:

exit

次に、管理ユーザーに_does_アクセス権があることを確認します。

ステップ4-管理ユーザーのアクセスの確認

管理者として「+ -u 」オプションを使用して接続し、ユーザー名と「 -p 」を入力してパスワードの入力を求めます。 また、 `-authenticationDatabase +`オプションを使用して、ユーザーの認証資格情報を保存したデータベースを提供する必要があります。

mongo -u  -p --authenticationDatabase admin

パスワードの入力を求められますので、入力してください。 正しいパスワードを入力すると、シェルにドロップされ、 `+ show dbs +`コマンドを発行できます。

OutputMongoDB shell version v3.4.2
Enter password:
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2

>

アクセスが拒否されるのではなく、使用可能なデータベースが表示されます。

show dbs
Outputadmin  0.000GB
local  0.000GB

「+ exit 」と入力するか、「 CTRL + C +」を押して終了します。

Authentication、https://docs.mongodb.com/manual/core/authorization/[Role-Based Access Control]の詳細については、MongoDBのドキュメントを参照してください。 ]、およびhttps://docs.mongodb.com/manual/tutorial/manage-users-and-roles/ [ユーザーとロール]。

パート3:リモートアクセスの構成(オプション)

リモート接続を許可するインストールを使用する前に、理想的には、MongoDBを外部ファイアウォールの背後に置いたり、仮想プライベートネットワーク(VPN)で保護したり、要塞ホストで制限したりします。 ただし、それに向けて作業を進めると、データベースサーバーでファイアウォールを有効にし、それを必要とする特定のホストへのアクセスを制限する、いくぶん簡単な手順を踏むことができます。

手順1-UFWを有効にする

Ubuntu 16.04での初期サーバーセットアップ前提条件では、UFWを有効にし、SSH接続のみを許可しました。 クライアントマシンのポートを開く前に、UFWのステータスを確認しましょう。

sudo ufw status

前提条件に変更を加えない限り、出力にはOpenSSHのみが許可されていることが示されます。

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

次に、デフォルトのMongoDBポート27017へのアクセスを許可しますが、そのアクセスを特定のホストに制限します。 デフォルトのポートを変更した場合は、以下のコマンドで必ず更新してください。

sudo ufw allow from  to any port

アクセスが必要な各追加クライアントのIPアドレスを使用して、このコマンドを再実行します。 ルールを再確認するには、 `+ ufw status`を再度実行します。

sudo ufw status
OutputTo                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
27017                       ALLOW
OpenSSH (v6)               ALLOW       Anywhere (v6)

このファイアウォールルールを設定したら、MongoDBを構成してそのパブリックインターフェイスをリッスンする準備ができました。

ステップ2-パブリックbindIPの構成

リモート接続を許可するには、ホストのパブリックにルーティング可能なIPアドレスを `+ mongod.conf`ファイルに追加します。

sudo nano /etc/mongod.conf

+ net +`スタンザで、 `+ bindIp +`行に `+ Mongoose’skIPを追加します。

/etc/mongod.confの抜粋

. . .
net:
 port: 27017
 bindIp: 127.0.0.1,
. . .

ファイルを保存して終了し、デーモンを再起動します。

sudo systemctl restart mongod

以前に行ったように、再起動が成功したことを確認します。

sudo systemctl status mongod

出力には `+ Active:active(running)+`が含まれている必要があり、最終テストに進むことができます。 Mongoは現在、デフォルトポートでリッスンしています。

ステップ3-リモート接続のテスト

Mongoがパブリックインターフェイスでリッスンしていることをテストするには、 + mongodb.conf`ファイルのIPアドレスに +-host`フラグを追加します。

mongo -u AdminSammy -p --authenticationDatabase admin --host
MongoDB shell version v3.4.2
Enter password:
connecting to: mongodb://107.170.233.82:27017/
MongoDB server version: 3.4.2

プロンプトに到達すると、デーモンがパブリックIPでリッスンしていることが確認されます。 この時点で、リモート接続とMongoDBホスト間のトランザクションは暗号化されないため、ファイアウォールをテストする前の次のステップは、これらのトランザクションを保護することです。 これに関するヘルプについては、https://docs.mongodb.com/manual/core/security-transport-encryption/ [Transport Encryption]でMongoDBのセキュリティドキュメントを参照してください。

結論

このチュートリアルでは、MongoDBの最新バージョンをインストールし、管理ユーザーを追加し、認証を有効にするために、MongoDBリポジトリをパッケージリストに追加しました。

また、リモート接続を受け入れるようにMongoDBを構成する方法を示しましたが、アクセスを必要とするホストからの接続のみを許可するようにサーバーのファイアウォールを構成することにより、MongoDBインストールのアドバタイズを防ぎます。

次のステップ:

  • 転送中のデータを暗号化するには、https://docs.mongodb.com/manual/core/security-transport-encryption/ [Transport Encryption]のMongoDBのセキュリティドキュメントを参照してください

  • MongoDBの使用と管理の詳細については、https://www.digitalocean.com/community/search?q = mongodb [これらのDigitalOceanコミュニティの記事]をご覧ください。