(O+P)ut

ITエンジニアのアウトプット録



(O+P)ut

OutPut Log by SE

【Rocket.Chat】チャット内容の格納先

スポンサーリンク

Rocket.Chatとは?

ロケットチャットとはオープンソースでフリーに使えるチャットシステム、簡単に言うとSlackのようなものです。

Windows/Mac/Linux/iOS/Androidに対応していたり、Pluginで他のアプリと連携できたり、RESTにも対応していたりと、かなり高機能です。

そんなロケットチャットの実体はHTTP ServerNode.jsDBの三層構造で、よく見るのは
Apache HTTP ServerRocket.ChatMongoDBという構成です。

つまり、データはMongoDBに格納されます。

MongoDBにチャット履歴はどのように格納されているのか

準備

RHEL系ですと以下コマンドでMongoDBが稼動していることを確認できます。

# systemctl status mongod.service

MongoDBと対話モードで接続すべくmongoコマンドにパスが通っていることを確認して

# which mongo
/usr/bin/mongo

起動してみてください。以下のように接続できます。

# mongo
MongoDB shell version vX.X.X
connectiong to : ...

まずRoket.Chat用のデータベースが存在することを確認します。

> show dbs
admin X.XGB
local X.XGB
roketchat X.XGB

roketchat用のデータベースを対象に操作するので以下コマンドでDBを明示的に指定します。

> use roketchat
switched to db roketchat

本題

roketchat用データベースにスイッチした状態で、コレクション一覧を表示します。

> show colletions
_raix_push_app_tokens
_raix_push_notifikations
....
roketchat_message
....
user
usersSessions

このroketchat_messageにチャット内容が格納されています。

試しに例えばプライベートチャネルを作成して test と送信します。

件数取得コマンドを発行すると確認できます。

> db.roketchat_message.count()
1

そして肝心の中身は以下のように見えます。

> db.roketchat_message.find()
{ "_id" : "XXXX", "rid" : "XXXX", "msg" : "test", "ts" : ISODate("2019-..."), "u" : { "_id" : "XXXX", "username" : "admin". "name" : "admin" }, "mentions" : [ ], "channels" : [ ], "_updateAt" : ISODate("2019-...")}

"msg" : "チャットに送信した内容"という形式で格納されています。

終わりに

気になって調査しましたが、やはり権限さえ持っていれば中身を読めてしまいます
対策としては、MongoDBのアクセス制御や監査機能を利用して適切に接続を管理することですかね。

また、Roket.Chatはアプリ内で自分が送信したメッセージを消すことも可能です。
消してしまえばDBからもきちんと消えています*1

以上、MongoDBにどのようにメッセージが格納されているか調査した結果でした。

*1:編集しても元メッセージは書き代わります。ただしeditedByという項目がjson形式で追加されますので編集したという事は分かります。