MongoDBに設定したい最低限のセキュリティ設定

セキュリティ

MongoDBの最低限設定したいセキュリティ設定を解説します。

MongoDBはデフォルト設定ではユーザ認証がなかったりとセキュリティ設定は弱いです。企業でも情報漏洩が発生していたりするので、この機会に見直してみましょう。

参考:MongoDB Security Checklist (公式)

MongoDBで確認したいセキュリティ項目

以下のセキュリティ項目を解説していきます。

  1. Sensitive情報の有無
  2. MongoDBのバージョンがサポートされているか
  3. アクセス可能なIPアドレス、ポート番号の指定
  4. ユーザ権限

Sensitive情報の有無

まず、Sensitive情報とは個人情報や、ユーザのメールアドレス、パスワード等慎重に扱う必要があるデータです。自分のユーザID、パスワードもです。

極端に言えば盗まれてもいいデータだけであればセキュリティは不要になりますので、極力不要なデータはためないようにしておきましょう。

Sensitiveなデータを扱うのであれば外部からアクセスできないように専用のDBサーバを立てて特定のサーバからしかアクセスできないように制御する必要があります。

MongoDBのバージョンがサポートされているか

次にMongoDBのバージョンを確認しておきましょう。Linuxからmongoと入力します。

> mongo
MongoDB shell version v4.0.3

私はv4.0.3です。古いversionでサポート期限切れの場合はUpdateしてしまいましょう。
公式のSupport Policyの中段ぐらいのEnd of Life Dateが過ぎているものはサポート期間が過ぎています。

サポート期限切れのものは脆弱性対策とかされないので、使わないようにします。

アクセス可能なIPアドレス、ポート番号の指定

アクセスするIPアドレスを固定設定

vi /etc/mongod.conf
bindIp: 127.0.0.1

アクセスを許可するIPアドレスを指定することができます。

MongoDBにアクセスしたいPC、サーバのIPアドレスを登録します。同じサーバからアクセスするのであれば、127.0.0.1を指定します。

起動時のポート番号

デフォルトポートの27017はポートスキャンやアクセスの試行が頻繁に行われているようです。
不要なサーバのポート解放を塞ぐこと、ポートの変更は必須だと思われます。

mongodでの起動時に–port xxxxxで指定できます。

sudo mongod --auth --port 49999 --noscripting --fork --dbpath /var/lib/mongodb --logpath /var/log/mongodb.log

ユーザ権限

デフォルトではユーザアカウント制御は行われていないため、適切な権限付与をしたユーザでのみアクセスができるようにアカウントを作成しましょう。
まずはMongoDBのアカウントを作成します。Adminユーザ、通常ユーザの順に作成します。

Adminユーザ作成

use admin
db.createUser({
 user: "xxxx",
 pwd: "zzzzzzzzzzzz",
 roles: [
  {
   role: "userAdminAnyDatabase",
   db: "admin"
  },
 "readWriteAnyDatabase"
 ]
})

通常ユーザ作成(Adminユーザの状態で)

db.auth("xxxx", "zzzzzzzzzzzz")
use aaaaa(DB名)
db.createUser({
 user: "xxxx",
 pwd: "zzzzzzzzzzzz",
 roles: [
  {
   role: "readWrite",
   db: "common"
  
 ]
})

通常ユーザでログイン

use xxxxx(DB名)
db.auth("xxxx", "zzzzzzzzzzzz")

これで操作できるようになりました。

Node.jsのMongoClientでMongoDBにアクセスする例。

//ユーザxxxxにパスワードzzzzzzzzzzzzでアクセス
//MongoDBのポートは49999で起動している
MongoClient.connect('mongodb://xxxx:zzzzzzzzzzzz@localhost:aaaaa/(db名)', (err, db) => {
if (err) throw err;
var dbo = db.db("aaaaa");
 dbo.collection("user").find({name:name}).toArray(function(err, res) {
  if (err) throw err;
  result = res;
  db.close();
 });
})

ユーザ権限を有効化

MongoDB起動時に–authコマンドで有効化します。
–portで任意のポート番号を指定してください。
–noscriptingでMongoDB Injectionを防ぎます。

sudo mongod --auth --port 49999 --noscripting --fork --dbpath /var/lib/mongodb --logpath /var/log/mongodb.log

MacOSでMongoDBを強制終了させる

ユーザを適切に作っていないと権限エラーで何もできなくなって焦るので注意。
その場合、MongoDBを再起動すればOKです。Macの場合はProcess Killです。

pgrep mongo
sudo kill xxxxx

認証が上手く行かない場合

use admin
db.createUser({
 user: "xxxx",
 pwd: "zzzzzzzzzzzz",
 roles: [
  {
   role: "readWrite",
   db: "common"
  },
  {
   role: "readWrite",
   db: "operation"
  }
 ]
})

一つのアカウントに複数のcollectionの認証権限を付与すると、認証エラーが発生することがあります。

MongoError: Authentication failed.

この場合DBごとに2ユーザに分けるとうまくいきました。

use admin
db.auth("adminのuser","adminのpassword")
use common
db.createUser({
 user: "xxxx",
 pwd: "zzzzzzzzzzzz",
 roles: [
  {
   role: "readWrite",
   db: "common"
  }
 ]
})

MongoDBのセキュリティ設定まとめ

これで個人用Webサーバとしての最低限のMongoDBセキュリティ設定はできたかなという感じです。不足している項目があれば見直してみてください。

MongoDBの使い方まとめに戻る。

自作アプリケーションを作るならさくらのVPS が手軽で使いやすいです。MongoDBは軽いので最低料金プランのVPSでも運用できます。【初めてでも簡単!】VPSの比較ランキングでも紹介しています。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


ABOUT US

ケネ
はじめまして、ケネです。

Node.jsの技術情報を書いています。

一人でも多くの方と「自分でもできた」感覚を共有したいので、なるべくわかりやすく、実体験ベースでのブログを心がけています。
技術で自分の世界を広げましょう。

不明点や質問があればお気軽にコメントください。