MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

Ubuntu 16.04でMongoDBのセキュリティを強化する方法【認証設定と管理者ユーザーの作成】

本記事では、Ubuntu 16.04環境でMongoDBのセキュリティを確保する手順を詳しく解説します。以前のバージョンのMongoDBは、デフォルト設定では認証機能が無効になっており、データベースへのアクセスが無防備な状態でした。そのため、自動化された攻撃(エクスプロイト)に対して脆弱であり、任意のユーザーがデータベースの作成・読み取り・変更・削除を自由に行えてしまうという重大な問題がありました。これは、MongoDBのデーモン(mongod)がデフォルト設定ですべてのネットワークインターフェースで接続を待ち受けるようになっていることが一因です。

認証の有効化と管理者ユーザーの追加

この問題は、MongoDB 3.x以降のリリースである程度対策されていますが、デフォルト設定では依然として認証が無効のため、誰もがデータベースへ完全にアクセスできる状態になっています。そこで本記事では、管理者ユーザーを作成し、認証機能を有効化した上で、その認証が正しく機能することを確認するまでの一連の手順を紹介します。

管理者ユーザーの追加

まず、Mongoシェルに接続して管理者(Admin)ユーザーを追加します。以下のコマンドを実行してください。

$ mongo

MongoDBシェルを起動すると、「データベースに対してアクセス制御が有効になっていない」「データおよび設定への読み書きアクセスが無制限である」といった警告メッセージが複数表示されます。以下は実際の出力例です。

Output:
MongoDB shell version v3.4.4
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.4
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
https://docs.mongodb.org/
Questions? Try the support group
https://groups.google.com/group/mongodb-user
Server has startup warnings:
2017-05-16T12:33:46.819+0530 I STORAGE [initandlisten]
2017-05-16T12:33:46.819+0530 I STORAGE [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2017-05-16T12:33:46.819+0530 I STORAGE [initandlisten] ** See https://dochub.mongodb.org/core/prodnotes-filesystem
2017-05-16T12:33:46.850+0530 I CONTROL [initandlisten]
2017-05-16T12:33:46.850+0530 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2017-05-16T12:33:46.850+0530 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2017-05-16T12:33:46.850+0530 I CONTROL [initandlisten]
2017-05-16T12:33:46.850+0530 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2017-05-16T12:33:46.850+0530 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2017-05-16T12:33:46.850+0530 I CONTROL [initandlisten]
>

管理者アカウントのユーザー名には特に制限がありません。権限レベルは「userAdminAnyDatabase」ロールによって決まるためです。管理者の資格情報はadminデータベースに保存されます。

ここでは、任意のユーザー名を選択し、必ず安全なパスワードを設定して管理者ユーザーを作成します。まずadminデータベースに切り替えます。

> use admin
switched to db admin

データベースを切り替えたら、次のコマンドで管理者ユーザーを作成します。

> db.createUser(
... {
...     user: "DBAdmin",
...     pwd: "DBAdmin'sSecurePassword",
...     roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
...     }
... )

Output:
Successfully added user: {
        "user" : "DBAdmin",
        "roles" : [
    {
        "role" : "userAdminAnyDatabase",
        "db" : "admin"
    }
]
}
>

これで、安全なパスワードを持つ「DBAdmin」という管理者ユーザーが作成されました。

ただし、この時点ではまだユーザーは作成されただけです。実際に運用で保護を有効にするには、MongoDBの設定ファイルで認証を有効化する必要があります。

MongoDBで認証を有効にする

次に、/etcディレクトリにある設定ファイルmongod.confを編集して認証を有効にし、MongoDBデーモンを再起動します。

以下のコマンドでmongod.confファイルを開き、「security」セクションを修正します。

$ sudo vi /etc/mongod.conf

初期状態の設定ファイルは以下のようになっています。

# mongod.conf
# for documentation of all options, see:
# https://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1

#processManagement:

#security:

#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options:

「security」行の先頭にあるコメント記号(#)を削除してセクションを有効化し、その下に「authorization」設定を追加します。編集後の該当部分は以下のようになります。

security:
  authorization: "enabled"

注意点として、「security:」の行にはインデント(スペース)を入れず、「authorization:」の行は2つのスペースでインデントして記述する必要があります。YAML形式ではインデントミスが起動エラーの原因となるため注意しましょう。設定ファイルの編集が完了したら、mongodデーモンを再起動します。

MongoDBサービスを再起動するコマンドは以下の通りです。

$ sudo systemctl restart mongod

サービスの再起動後、以下のコマンドでMongoDBサービスの状態を確認できます。

$ sudo systemctl status mongod

Output:
mongod.service - High-performance, schema-free document-oriented database
   Loaded: loaded (/lib/systemd/system/mongod.service; disabled; vendor preset: enabled)
   Active: active (running) since Tue 2017-05-16 12:52:09 IST; 48s ago
     Docs: https://docs.mongodb.org/manual
 Main PID: 3281 (mongod)
    Tasks: 20
   Memory: 33.3M
      CPU: 734ms
   CGroup: /system.slice/mongod.service
           └─3281 /usr/bin/mongod --quiet --config /etc/mongod.conf

May 16 12:52:09 ubuntu-16 systemd[1]: Started High-performance, schema-free document-oriented database.

MongoDBの認証動作を確認する

まず、認証情報なしでMongoDBに接続できるか試してみましょう。

$ mongo

Output:
MongoDB shell version v3.4.4
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.4
>

先ほど表示されていた警告メッセージがすべて解消されていることを確認できます。次に、テストとしてtestデータベースへの接続を試みて、認証が正しく機能しているか確認します。

> show dbs
2017-05-16T12:56:17.306+0530 E QUERY    [thread1] Error: listDatabases failed:{
        "ok" : 0,
        "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
        "code" : 13,
        "codeName" : "Unauthorized"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:769:19
shellHelper@src/mongo/shell/utils.js:659:15
@(shellhelp2):1:1

「Unauthorized(未認証)」というエラーが返され、認証なしではデータベースの操作や参照ができないことが分かります。それではシェルを終了し、今度は認証情報を使って接続してみましょう。

管理者ユーザーでのアクセスを検証する

続いて、作成した管理者ユーザーを使ってadminデータベースに認証接続します。以下のコマンドを実行すると、パスワードの入力を求められます。

$ mongo -u DBAdmin -p --authenticationDatabase admin
MongoDB shell version v3.4.4
Enter password:
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.4
> show dbs
admin  0.000GB
local  0.000GB
>

管理者ユーザーでのログインに成功し、データベース一覧を正常に表示できました。これで認証設定が正しく機能していることが確認できます。

本記事では、MongoDBに管理者ユーザーを追加し、認証機能を有効化することでセキュリティを強化する手順を解説しました。デフォルト設定のままではユーザー認証が無効になっており、誰でもデータベースの作成・削除・変更が可能な危険な状態です。本番環境でMongoDBを運用する際は、必ず認証を有効化し、さらにファイアウォール設定やbindIpの制限、TLS暗号化などと組み合わせて多層的な防御を行うことをおすすめします。

  1. MongoDBでコレクションを削除(ドロップ)する方法をわかりやすく解説

    MongoDBでコレクションを削除(ドロップ)するには、drop()メソッドを使用します。基本的な構文は以下のとおりです。db.yourCollectionName.drop();この構文を実行すると、コレクションの削除が成功した場合は true、失敗した場合(コレクションが存在しないときなど)は false が返されます。事前準備:データベースとコレクションの一覧を確認するまず、MongoDB内にどのようなコレクションがあるのかを確認してみましょう。ここでは、複数のコレクションを含む「sample」というデータベースを例に説明します。最初に、以下のコマンドで「sample」データベースへ切り

  2. MongoDBでコンソールをクリアする2つの方法|ショートカット「Ctrl + L」とコマンド「cls」の使い方

    MongoDBのシェル(mongo / mongosh)を使っていると、実行したクエリや結果がどんどん積み重なり、画面が見づらくなることがあります。そんなときに便利なのがコンソールのクリア機能です。MongoDBでは、以下の2つの方法でコンソールをクリアできます。 方法1:キーボードショートカット「Ctrl + L」を使う 最も手軽なのが、キーボードショートカットを使う方法です。次のキーを押すだけで、即座にコンソールをクリアできます。 Ctrl + L このキーを押すと、それまで表示されていたログや実行結果がすべて消え、まっさらな状態になります。Linuxのターミナルなどと同じ操作感なので、