前書き
MongoDBは、無料でオープンソースのドキュメント指向データベースです。 従来のテーブルベースのリレーショナルデータベース構造に依存しないため、NoSQLデータベースとして分類されます。 代わりに、動的スキーマを持つJSONのようなドキュメントを使用します。 リレーショナルデータベースとは異なり、MongoDBは、データベースにデータを追加する前に事前定義されたスキーマを必要としません。 スキーマはいつでも必要に応じて変更でき、更新されたスキーマで新しいデータベースをセットアップする必要はありません。
このチュートリアルのパート1では、MongoDBリポジトリを使用して、MongoDBの最新バージョンをインストールします。 パート2では、認証を有効にしてローカルシステムでセキュリティを保護します。 最後に、パート3では、必要な場合にリモート接続をより安全に許可する方法を示します。
前提条件
このチュートリアルを実行するには、次のものが必要です。
-
Ubuntu 16.04 initial server setup guideに従って、root以外の
sudo
ユーザーとファイアウォールで構成されたOne Ubuntu 16.04 server。
これが準備できたら、次の手順に進む準備ができました。
パート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
を押して終了します。
Authentication、Role-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インストールのアドバタイズを防ぎます。
次のステップ:
-
転送中のデータを暗号化するには、Transport Encryptionに関するMongoDBのセキュリティドキュメントを参照してください
-
these DigitalOcean community articlesでのMongoDBの使用と管理の詳細をご覧ください。