Ubuntu16.04にMongoDBをインストールして保護する方法
序章
MongoDBは、無料でオープンソースのドキュメント指向データベースです。 従来のテーブルベースのリレーショナルデータベース構造に依存しないため、NoSQLデータベースとして分類されます。 代わりに、動的スキーマを持つJSONのようなドキュメントを使用します。 リレーショナルデータベースとは異なり、MongoDBでは、データベースにデータを追加する前に事前定義されたスキーマは必要ありません。 更新されたスキーマを使用して新しいデータベースをセットアップしなくても、いつでも必要な頻度でスキーマを変更できます。
このチュートリアルのパート1では、MongoDBリポジトリを使用して、最新バージョンのMongoDBをインストールします。 パート2では、認証を有効にして、ローカルシステムで認証を保護します。 最後に、パート3では、必要に応じてリモート接続をより安全に許可する方法を示します。
前提条件
このチュートリアルに従うには、次のものが必要です。
- 非ルートで構成された1つのUbuntu16.04サーバー
sudo
Ubuntu16.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
メタパッケージ。これには、サーバー上のデーモン、構成およびinitスクリプト、シェル、および管理ツールが含まれます。
- 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セキュリティ認証セクションをご覧ください。
選択したユーザー名を設定し、必ず自分の安全なパスワードを選択して、以下のコマンドに置き換えてください。
- 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デーモンを再起動するまで、資格情報を入力する必要はありません
ステップ2—認証を有効にする
認証はで有効になっています mongod.conf
ファイル。 有効にして再起動したら mongod
、ユーザーは認証なしでMongoに接続できますが、対話する前にユーザー名とパスワードを入力する必要があります。
構成ファイルを開きましょう:
- sudo nano /etc/mongod.conf
の中に #security
セクションでは、前のハッシュを削除します security
スタンザを有効にします。 次に、認証設定を追加します。 完了すると、行は以下の抜粋のようになります。
. . .
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.
デーモンが起動していることを確認したら、認証をテストしましょう。
手順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
次に、管理ユーザーがにアクセスできることを確認します。
手順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
出る。
認証、ロールベースのアクセス制御、およびユーザーとロールの詳細については、MongoDBのドキュメントを参照してください。
パート3:リモートアクセスの構成(オプション)
リモート接続を許可するインストールで作業を開始する前に、理想的には、MongoDBを外部ファイアウォールの背後に配置するか、仮想プライベートネットワーク(VPN)で保護するか、要塞ホストを介して制限します。 ただし、それに向けて作業するときは、データベースサーバーでファイアウォールを有効にし、ファイアウォールを必要とする特定のホストへのアクセスを制限するという、やや複雑ではない手順を実行できます。
ステップ1—UFWを有効にする
Ubuntu 16.04 の前提条件を使用したサーバーの初期設定では、UFWを有効にし、SSH接続のみを許可しました。 クライアントマシンのポートを開く前に、UFWのステータスを確認しましょう。
- sudo ufw status
注:出力がファイアウォールが 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)
<$>[注] ノート: UFWを初めて使用する場合は、ガイドで詳細を確認できます。 UFW Essentials:一般的なファイアウォールルールとコマンド 。
このファイアウォールルールを設定すると、パブリックインターフェイスでリッスンするようにMongoDBを構成する準備が整います。
ステップ2—パブリックbindIPを構成する
リモート接続を許可するために、ホストのパブリックにルーティング可能なIPアドレスをに追加します mongod.conf
ファイル。
- sudo nano /etc/mongod.conf
の中に net
スタンザ、追加 MongoHost
のIP bindIp
ライン:
. . .
net:
port: 27017
bindIp: 127.0.0.1,IP_of_MongoHost
. . .
ファイルを保存して終了し、デーモンを再起動します。
- sudo systemctl restart mongod
以前に行ったように、再起動が成功したことを確認します。
- sudo systemctl status mongod
出力には次のものが含まれている必要があります Active: active (running)
、そして最終テストに進むことができます。 Mongoは現在デフォルトのポートでリッスンしています。
ステップ3—リモート接続のテスト
Mongoがパブリックインターフェイスでリッスンしていることをテストするには、 --host
からのIPアドレスでフラグを立てます mongodb.conf
ファイル。
- 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インストールのアドバタイズを防ぎます。
次のステップ:
- 転送中のデータを暗号化するには、 TransportEncryptionに関するMongoDBのセキュリティドキュメントを参照してください。
- MongoDBの使用と管理の詳細については、これらのDigitalOceanコミュニティの記事をご覧ください。