Ubuntu 16.04にMongoDBをインストールして保護する方法

前書き

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

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

前提条件

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

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

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

[[step-1 -—- adding-the-mongodb-repository]] ==ステップ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 " 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をインストールする準備ができました。

[[step-2 -—- installing-mongodb]] ==ステップ2—MongoDBのインストール

サーバーにデーモン、構成およびinitスクリプト、シェル、管理ツールを含む `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リリースおよび一部のパッケージマネージャーによって提供された以前のバージョンで状況が緩和されました。 自動的にインターネットに開かれるわけではありません。

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

[[step-1 -—- adding-an-administrative-user]] ==ステップ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 SecurityAuthenticationセクションをご覧ください。

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

use admin
db.createUser(
  {
    user: "AdminSammy",
    pwd: "AdminSammy'sSecurePassword",
    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デーモンを再起動するまで、ユーザーは資格情報を入力できません。

[[step-2 -—- enableing-authentication]] ==ステップ2—認証を有効にする

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

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

sudo nano /etc/mongod.conf

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

mongodb.conf

 . . .
security:
  authorization: "enabled"
 . . .

「セキュリティ」行の先頭にはスペースがなく、「承認」行は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.

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

[[step-3 -—- verifying-that-unauthenticated-users-are-restricted]] ==ステップ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がアクセスできることを確認します。

[[step-4 -—- verifying-the-administrative-user-39-s-access]] ==ステップ4—管理ユーザーのアクセスを確認する

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

mongo -u AdminSammy -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を押して終了します。

AuthenticationRole-Based Access Control、およびUsers and Rolesの詳細については、MongoDBのドキュメントを参照してください。

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

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

[[step-1 -—- enableing-ufw]] ==ステップ1—UFWを有効にする

Initial Server Setup with Ubuntu 16.04の前提条件では、UFWを有効にし、SSH接続のみを許可しました。 クライアントマシン用のポートを開く前に、UFWのステータスを確認しましょう。

sudo ufw status

[。注意]##

Note:出力がファイアウォールがinactiveであることを示している場合は、次のコマンドでアクティブ化します。

sudo ufw enable

有効にした後、statusコマンドを再実行すると、sudo ufw statusにルールが表示されます。 必要に応じて、SSHを許可してください。

sudo ufw allow OpenSSH

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

OutputStatus: active

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

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

sudo ufw allow from client_ip_address to any port 27017

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

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

[.note]#Note: UFWを初めて使用する場合は、ガイドのUFW Essentials: Common Firewall Rules and Commands
#で詳細を確認できます。

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

[[step-2 -—- configuring-a-public-bindip]] ==ステップ2—パブリックbindIPの構成

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

sudo nano /etc/mongod.conf

netスタンザで、MongoHostのIPをbindIp行に追加します。

/etc/mongod.confの抜粋

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

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

sudo systemctl restart mongod

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

sudo systemctl status mongod

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

[[step-3 -—- testing-the-remote-connection]] ==ステップ3—リモート接続のテスト

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

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

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

結論

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

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

次のステップ: