Dynmap で独自URLを使う方法
Hello Everyone
今回は、SpigotのWEB Map プラグインの一つである、「Dynmap」のURLを独自URLかつ、SSLによるセキュリティ向上
の仕方を紹介したいと思います。
通常Dynmap でWEBからMAPを閲覧する場合
HTTP(非暗号)かつ、(Minecraft Server IP):8123 になってしまい、
WebServerまたはBungeecord と Minecraft Serverと分かれているのでMinecraft Serverは外部からアクセスされないようにしたい、というときに使えます。
また、MAP URLはたいていMinecraftのIPと同じなため、MAPのURLがバレたら自動的にMinecraftのIPもわかるというのも防げます。
ついでに、Databaseのパスワードが見える、脆弱性がありますが、それの対処法にもなります。
必要なもの
- 独自ドメイン(設定済みであること)
- Dynmap導入済みのMinecraft Server
- Nginx (SSL設定の最低限の設定済みなこと)
- php-fpm (index.php があったらちゃんと見れるレベルになっていること)
それでは始めていきましょう。
1. Dynmap の設定変更
まずは、Dynmapの設定ファイルを変更します。
plugins/dynmap/configuration.txt
を編集します。
L35 らへんの、
- class: org.dynmap.InternalClientUpdateComponent
の項目ごと全てコメントアウトします。
その後、 - class: org.dynmap.JsonFileClientUpdateComponent
の設定をコメントアウト外します。
# - class: org.dynmap.InternalClientUpdateComponent
# sendhealth: true
# sendposition: true
# allowwebchat: true
# webchat-interval: 5
# hidewebchatip: false
# trustclientname: false
# includehiddenplayers: false
# use-name-colors: false
# use-player-login-ip: true
# require-player-login-ip: false
# # (optional) block player login IDs that are banned from chatting
# block-banned-player-chat: true
# # Require login for web-to-server chat (requires login-enabled: true)
# webchat-requires-login: false
# # If set to true, users must have dynmap.webchat permission in order to chat
# webchat-permissions: false
# # Limit length of single chat messages
# chatlengthlimit: 256
# # hideifshadow: 4
# # hideifundercover: 14
# hideifsneaking: false
# protected-player-info: false
# # If true, hide players with invisibility potion effects active
# hide-if-invisiblity-potion: true
# # If true, player names are not shown on map, chat, list
# hidenames: false
- class: org.dynmap.JsonFileClientUpdateComponent
sendhealth: true
sendposition: true
allowwebchat: true
webchat-interval: 5
hidewebchatip: false
trustclientname: false
includehiddenplayers: false
use-name-colors: false
use-player-login-ip: true
require-player-login-ip: false
block-banned-player-chat: true
webchat-requires-login: false
webchat-permissions: false
chatlengthlimit: 256
# hideifshadow: 4
# hideifundercover: 14
hideifsneaking: true
protected-player-info: false
hide-if-invisiblity-potion: true
hidenames: false
L443 あたりにある、URL設定を変更します。
url:
# configuration URL
configuration: "up/configuration"
# update URL
update: "up/world/{world}/{timestamp}"
# sendmessage URL
sendmessage: "up/sendmessage"
# login URL
login: "up/login"
# register URL
register: "up/register"
# tiles base URL
tiles: "tiles/"
# markers base URL
markers: "tiles/"
から
url:
# configuration URL
configuration: "standalone/MySQL_configuration.php"
# update URL
update: "standalone/MySQL_update.php?world={world}&ts={timestamp}"
# sendmessage URL
sendmessage: "standalone/MySQL_sendmessage.php"
# login URL
login: "standalone/MySQL_login.php"
# register URL
register: "standalone/MySQL_register.php"
# tiles base URL
tiles: "standalone/MySQL_tiles.php?tile="
# markers base URL
markers: "standalone/MySQL_markers.php?marker="
にします。
最後に、L339 あたりの以下の設定を変更します。
disable-webserver を Trueに
allow-symlinks を Trueにします。
disable-webserver: true
allow-symlinks: true
こちらの設定はオプションですが後々のWEBServerへ設置のときにタイル情報(画像)を転送しなくても良い、
ディスク圧迫しないというメリットがありますので、MySQLなりSQLite3なりにDatabaseで管理することをおすすめします。
(この方法を実施すると、アクセスできる位置に、
standalone/MySQL_config.php に生パスワードが記載されるので注意)
2.WebRootを作成する
次にServerをRestartします。
再起動後
DynmapのPlaginフォルダにWebという名前のフォルダがあるので
/plugins/dynmap/web/
のフォルダをWebServerのRootディレクトリに設置します。
(権限が適切ではないとこのフォルダは生成されません)
3.WebServer設置
2.の手順で生成したWEBディレクトリをscpかrsyncするなりでWEBServerへ転送します。
転送後、WEBフォルダはWEB ルートへ設置してWEBアクセスできる位置に設置します。
設置後 /etc/nginx/conf.d/任意の名前.conf
からNginxの設定を開き
root の向き先を先程設置したフォルダになるようにしてください。
location / {
try_files $uri $uri/ =404;
}
次に、locationをこのようにします。
あとはNginxをリロードすることで、反映されます。
最後に、設定したURLへアクセスし、きちんとアクセスでき、リアルタイムで反映されていることを確認します。
補足:
内部サーバ(WEBサーバ無しの初期状態)でMySQL接続を有効化していると、
WEB Server用のstandalone フォルダが生成されるのですが、この中の
/plugins/dynmap/web/standalone/MySQL_config.php
にDatabase情報が生で保存されています。
通常はPHP経由でアクセスできれば中は見えないので問題がない(Server側処理される)
のですが、PHPがないServer(Dynmapの内部サーバ)だとテキストとして認識されるため、
Database情報がそのまま表示されてしまうセキュリティホールが有ります。
(MC Server URL)/standalone/MySQL_config.php
普通DatabaseのIPは外部から誰からアクセスできるようにする、Plaginごとに共通にしている、rootを使っている
という人はいないと思いますが、自分の環境で試してみて見れてしまった場合は変更することをおすすめします。
対処法は、
・ root でServer起動しない。
・ 対象の「web」フォルダのアクセス権を644にする、 standaloneは000
・ このページにある、独自URLを使う方法(外部ホストを使う)を実施する。(disable-webserver: true にする)
・ いっそのこと保存タイプをMySQLにしない
ことで対処できます。
また、この方法で対処したとしてもphpが動いていないとかの状態だとファイルがDLされるので意味ありませんので注意を
このセキュリティホール 5年ぐらい前からあるのに未だにそのままだったのかってなったのですが、
issueもクローズされて、大手なマルチサバを運営しているところでも
知っているけど、対処だけして報告していないので、もしかしたらこれが仕様って感じなんですかね()