序章

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

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

前提条件

このチュートリアルに従うには、次のものが必要です。

これが整ったら、フォローする準備が整います。

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

ステップ1—MongoDBリポジトリを追加する

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

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

  1. 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のリストファイルを作成します。

  1. 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

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

  1. sudo apt-get update

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

ステップ2—MongoDBをインストールする

インストールしますmongodb-org メタパッケージ。これには、サーバー上のデーモン、構成およびinitスクリプト、シェル、および管理ツールが含まれます。

  1. sudo apt-get install mongodb-org

Enterキーを押すか、次のように入力します Y プロンプトが表示されたら続行します。 インストールが完了したら、Mongoデーモンを起動します。

  1. sudo systemctl start mongod

以来 systemctl 出力が提供されない場合は、ステータスをチェックして、サービスが正しく開始されたことを確認します。

  1. 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 出る。 デーモンを手動で起動し、デーモンが実行されていることを確認したので、起動時にデーモンが自動的に再起動することを確認します。

  1. sudo systemctl enable mongod

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

Output
Created 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シェルに接続します。

  1. mongo

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

Output
MongoDB 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セキュリティ認証セクションをご覧ください。

選択したユーザー名を設定し、必ず自分の安全なパスワードを選択して、以下のコマンドに置き換えてください。

  1. use admin
  2. db.createUser(
  3. {
  4. user: "AdminSammy",
  5. pwd: "AdminSammy'sSecurePassword",
  6. roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  7. }
  8. )

私たちが発行するとき 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に接続できますが、対話する前にユーザー名とパスワードを入力する必要があります。

構成ファイルを開きましょう:

  1. sudo nano /etc/mongod.conf

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

mongodb.conf
 . . .
security:
  authorization: "enabled"
 . . . 

「セキュリティ」行の先頭にはスペースがなく、「承認」行は2つのスペースでインデントする必要があることに注意してください。

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

  1. sudo systemctl restart mongod

設定に誤りがあると、ダメオンは起動しません。 以来 systemctl 出力を提供しません、私たちはそれを使用します status それが行われたことを確認するオプション:。

  1. sudo systemctl status mongod

見たら Active: active (running) 出力で、それが以下のテキストのようなもので終わる場合、私たちは確かに restart コマンドは成功しました:

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

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

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

まず、クレデンシャルなしで接続して、アクションが制限されていることを確認しましょう。

  1. mongo

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

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

私たちはに接続しています test データベース。 アクセスが制限されていることをテストします show dbs 指図:

  1. show dbs
Output
2017-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" . . .

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

シェルを終了して続行しましょう。

  1. exit

次に、管理ユーザーにアクセスできることを確認します。

手順4—管理ユーザーのアクセスを確認する

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

  1. mongo -u AdminSammy -p --authenticationDatabase admin

パスワードの入力を求められるので、パスワードを入力します。 正しいパスワードを入力すると、シェルにドロップされ、そこで発行できます。 show dbs 指図:

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

アクセスが拒否されるのではなく、利用可能なデータベースを確認する必要があります。

  1. show dbs
Output
admin 0.000GB local 0.000GB

タイプ exit またはを押します CTRL+C 出る。

認証ロールベースのアクセス制御、およびユーザーとロールの詳細については、MongoDBのドキュメントを参照してください。

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

リモート接続を許可するインストールで作業を開始する前に、理想的には、MongoDBを外部ファイアウォールの背後に配置するか、仮想プライベートネットワーク(VPN)で保護するか、要塞ホストを介して制限します。 ただし、それに向けて作業するときは、データベースサーバーでファイアウォールを有効にし、ファイアウォールを必要とする特定のホストへのアクセスを制限するという、やや複雑ではない手順を実行できます。

ステップ1—UFWを有効にする

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

  1. sudo ufw status

注:出力がファイアウォールが inactive、次のコマンドでアクティブ化します。

  1. sudo ufw enable

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

  1. sudo ufw allow OpenSSH

<$>

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

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6)

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

  1. sudo ufw allow from client_ip_address to any port 27017

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

  1. sudo ufw status
Output
To Action From -- ------ ---- OpenSSH ALLOW Anywhere 27017 ALLOW client_ip_address OpenSSH (v6) ALLOW Anywhere (v6)

<$>[注] ノート: UFWを初めて使用する場合は、ガイドで詳細を確認できます。 UFW Essentials:一般的なファイアウォールルールとコマンド

このファイアウォールルールを設定すると、パブリックインターフェイスでリッスンするようにMongoDBを構成する準備が整います。

ステップ2—パブリックbindIPを構成する

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

  1. sudo nano /etc/mongod.conf

の中に net スタンザ、追加 MongoHostのIP bindIp ライン:

/etc/mongod.confの抜粋
 . . .
net:
  port: 27017
  bindIp: 127.0.0.1,IP_of_MongoHost
 . . .

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

  1. sudo systemctl restart mongod

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

  1. sudo systemctl status mongod

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

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

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

  1. 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ホスト間のトランザクションは暗号化されていないため、ファイアウォールをテストする前の次のステップでは、これらのトランザクションを保護する必要があります。 これに関するヘルプについては、 TransportEncryptionに関するMongoDBのセキュリティドキュメントを参照してください。

結論

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

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

次のステップ: