MongoDBの最低限設定したいセキュリティ設定を解説します。
MongoDBはデフォルト設定ではユーザ認証がなかったりとセキュリティ設定は弱いです。企業でも情報漏洩が発生していたりするので、この機会に見直してみましょう。
参考:MongoDB Security Checklist (公式)
Contents
MongoDBで確認したいセキュリティ項目
以下のセキュリティ項目を解説していきます。
- Sensitive情報の有無
- MongoDBのバージョンがサポートされているか
- アクセス可能なIPアドレス、ポート番号の指定
- ユーザ権限
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の比較ランキングでも紹介しています。
コメントを残す