Dynmap で独自URLを使う方法

Dynmap で独自URLを使う方法

Table of Content

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 の設定変更

file

まずは、Dynmapの設定ファイルを変更します。
plugins/dynmap/configuration.txt を編集します。

file

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="

にします。

file

最後に、L339 あたりの以下の設定を変更します。
disable-webserver を Trueに
allow-symlinks を Trueにします。

disable-webserver: true
allow-symlinks: true

file

こちらの設定はオプションですが後々のWEBServerへ設置のときにタイル情報(画像)を転送しなくても良い、
ディスク圧迫しないというメリットがありますので、MySQLなりSQLite3なりにDatabaseで管理することをおすすめします。
(この方法を実施すると、アクセスできる位置に、
standalone/MySQL_config.php に生パスワードが記載されるので注意)

2.WebRootを作成する

file

次にServerをRestartします。
再起動後
DynmapのPlaginフォルダにWebという名前のフォルダがあるので
/plugins/dynmap/web/ のフォルダをWebServerのRootディレクトリに設置します。

(権限が適切ではないとこのフォルダは生成されません)

3.WebServer設置

file

2.の手順で生成したWEBディレクトリをscpかrsyncするなりでWEBServerへ転送します。
転送後、WEBフォルダはWEB ルートへ設置してWEBアクセスできる位置に設置します。

設置後 /etc/nginx/conf.d/任意の名前.conf からNginxの設定を開き
root の向き先を先程設置したフォルダになるようにしてください。

file

    location / {
        try_files $uri $uri/ =404;
    }

次に、locationをこのようにします。

あとはNginxをリロードすることで、反映されます。

file

最後に、設定した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されるので意味ありませんので注意を

file

このセキュリティホール 5年ぐらい前からあるのに未だにそのままだったのかってなったのですが、
issueもクローズされて、大手なマルチサバを運営しているところでも
知っているけど、対処だけして報告していないので、もしかしたらこれが仕様って感じなんですかね()