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

スポンサーリンク

はじめに

自分でシステムを運用するとパラメータとかちょっと変えられたら便利だなーと思ってUI部分をWeb化しようと思ったのですが、、

セキュリティ対策めちゃくちゃ時間かかる。
2ヶ月ぐらいでようやくできたので、せっかくなのでノウハウ的なものを残していってみなさんがスムーズに進められればなと思います。

個人システムであればMongoDBでなくてもRelational DBの選択肢もありますが、RDBより高速というメリットもあるので、今後のスケーラビリティ向上のためにやってみる価値はあるかと思います。

あとやってみてわかりましたが、導入はRDBより簡単だと思います。

参考:MongoDB Security Checklist (公式)

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

  1. Sensitive情報の有無
  2. MongoDBのバージョン
  3. 起動時のポート番号
  4. ユーザ権限

1. Sensitive情報の有無

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

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

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

私はSensitiveなデータを扱っていないので、一つのサーバにNode.jsアプリケーションとMongoDBを入れています。

また、公式サイトにはEnterprise Onlyのセキュリティ設定も用意されているので、
実際にSensibleなデータを運用する場合はチェックしておく必要があるかと思います。

2. MongoDBのバージョン

次にMongoDBのバージョンを確認しておきましょう。

[kensuke$] mongo
MongoDB shell version v4.0.3

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

サポート期限切れのものは脆弱性対策とかされないので、使わないのが鉄則なので注意しましょう。

マイナーバージョン単位(3.4とか)で確認できます。

3. 起動時のポート番号

MongoDBは調べてみるとけっこうハッキングを受けているようです。

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

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

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

4. ユーザ権限

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

Adminユーザを作成することを忘れずに。DB落とせなくなってしまいますよ。。
その場合は以下の手順で強制終了させれば大丈夫です。

www.kennejs.com
 
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を防ぎます。*
*注意:–noscriptingだけではInjectionは完全には防げません。アプリケーション側でも防ぐようなチェックが必要です。

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

ビットコインを購入するならBITPOINT
BITPOINT

コメント

タイトルとURLをコピーしました