Node.jsで暗号資産アービトラージ

ビットコイントレード中心にNode.jsで実際に作るためのレシピ

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