カテゴリー
Mac misc

OS X Server 4.0.3 で GateOne HEAD

ハマったのでメモ。

最近 http/s は通るのに ssh が通らなくてイラつくことが多々あったのですが、だったら web ベースの ssh 入れればいいんじゃね、とか思い立って入れてみました。で、てきとーにググって目に付いた GateOne を入れてみることにしたのです。
最初は pkgsrc で頑張ろうと努力して GateOne, more than a web-based SSH を読みながらインストールまで進めて、最新リリースの 1.1 だと tornado 3 以降は未対応だから git 最新を使う必要があるってところまで進めたんですが、 OS X 純正の httpd で受けるつもりなら OS X の python 使うほうが正義ということを思い出して、結局 python setup.py install とかでお茶を濁すことになりました…。

ということで gateone 自体のインストールはこんな

$ git clone https://github.com/liftoff/GateOne.git
$ cd GateOne
$ git archive --format=tar HEAD |tar xvf - -C ~/work/gateone
$ cd ~/work/gateone
$ sudo python ./setup.py install

気持ち的に /usr/local 以下で動かしたかったので

$ sudo mkdir -p /usr/local/etc/gateone
$ sudo vi /usr/local/etc/gateone/server.conf

とかしてドキュメントに書いてある設定そのままコピーしてから

$ sudo gateone --settings_dir=/usr/local/etc/gateone

と動かしてみたら

goro@flora:/usr/local/etc/gateone$ sudo gateone --settings_dir=/usr/local/etc/gateone
[W 150117 23:33:30 locale:61] No translation found for locale: ja_JP
[E 150117 23:33:30 configuration:994] Error decoding JSON in settings file: /usr/local/etc/gateone/server.conf
[E 150117 23:33:30 configuration:995] No JSON object could be decoded
Got an exception trying to display precisely where the problem was. This usually happens when you've used single quotes (') instead of double quotes (").
[I 150117 23:33:30 configuration:705] Gate One settings are incomplete. A new /10server.conf will be generated.
[I 150117 23:33:30 server:4167] Gate One License: AGPLv3 (http://www.gnu.org/licenses/agpl-3.0.html)
[I 150117 23:33:30 server:4176] Imported applications: Terminal
[I 150117 23:33:30 server:4328] Version: 1.2.0 (20140920142541)
[I 150117 23:33:30 server:4329] Tornado version 4.0.2
[I 150117 23:33:30 server:4349] Connections to this server will be allowed from the following origins: 'localhost 127.0.0.1 flora.hyrule.jp 192.168.0.3'
[I 150117 23:33:30 server:3666] No authentication method configured. All users will be ANONYMOUS
[I 150117 23:33:30 server:3747] Loaded global plugins: gateone.plugins.editor, gateone.plugins.help
[I 150117 23:33:30 server:4470] Listening on https://*:443/
[E 150117 23:33:30 server:4532] Could not listen on 0.0.0.0:443 (address:port is already in use by another application).
[E 150117 23:33:30 server:4546] Exception was: (48, 'Address already in use')
[I 150117 23:33:30 server:4553] Clearing cache_dir: /tmp/gateone_cache
[I 150117 23:33:30 server:4556] pid file removed.
goro@flora:/usr/local/etc/gateone$ ls
10server.conf 20authentication.conf 50terminal.conf old/ server.conf users/

とかエラー吐いた挙句にご丁寧に必要な設定ファイルを作成してくださいましたよ…。
というか多分ドキュメントに書かれている設定ファイルは 1.1 向けで、 HEAD は設定ファイルが JSON 形式に変わったってことなんだろうね。
で、デフォルトだと勝手証明書で 443 をリッスンしようとしてコケる(443 は apache が先に掴んでるからね)んだけど、今回はすでに動いてる httpd の裏で動かすので https は不要なので、10server.conf をこんな感じでてきとーに変更して

"disable_ssl": true,
"port": 5443,
"url_prefix": "/gateone/",

/Library/Server/Web/Config/apache2/sites/0000_any_443_.conf に

ProxyPass /gateone http://127.0.0.1:5443/gateone
ProxyPassReverse /gateone http://127.0.0.1:5443/gateone

と Proxy の設定を入れて、さあってやったら 5443 直にはアクセスできて動いてるんだけど、 apache 経由でアクセスするとちゃんと動かない風味。ログを眺めると

[Sat Jan 17 23:32:36.951856 2015] [proxy:error] [pid 98859] AH00940: WS: disabled connection for (127.0.0.1)

とか

flora.hyrule.jp 192.168.0.26 - - [17/Jan/2015:23:06:37 +0900] "GET /gateone/ws HTTP/1.1" 400 54 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:35.0) Gecko/20100101 Firefox/35.0"

という感じ。 proxy がエラー吐いてる上に gateone から 400 が戻ってる…? と相当悩んだ末に出た結論が

  • mod_proxy は websocket 未対応

…おおう。
マジ知らなかったんですが、 apache の mod_proxy は websocket 未対応で、 apache 2.4.5 以降から mod_proxy_wstunnel で対応したそーです。 OS X Server は確か 4.0 から apache 2.4 系に上がったはずなので、タイミングはちょうど良かったですね。
ということで改めて websocket 用の設定を追加して

ProxyPass /gateone/ws ws://127.0.0.1:5443/gateone/ws
ProxyPass /gateone http://127.0.0.1:5443/gateone
ProxyPassReverse /gateone/ws ws://127.0.0.1:5443/gateone/ws
ProxyPassReverse /gateone http://127.0.0.1:5443/gateone

試してみたら無事に動きました。
が、このままだと gateone を全てに公開となってダサいので、

<location /gateone>
    AuthType Digest
    AuthName "GateOne"
    AuthUserFile /usr/local/etc/gateone/gateone.digest
    Require valid-user
</location>

と制限かけたら apache が起動しなくなってしまった…。


というオチなのだけれども、とりあえずは auth_digest_apple_module を有効化して digest 認証効くようにしました。
あと、 root で動くのは気持ち悪いので

sudo dscl . -create /Groups/_gateone PrimaryGroupID 311
sudo dscl . -create /Users/_gateone UniqueID 311
sudo dscl . -create /Users/_gateone PrimaryGroupID 311
sudo dscl . -create /Users/_gateone UserShell /bin/false
sudo dscl . -create /Users/_gateone NFSHomeDirectory /usr/local/etc/gateone
sudo dscl . -create /Users/_gateone RealName GateOne
sudo dscl . -create /Groups/_gateone GroupMembership _gateone

と gateone 用のユーザー/グループを作成して

< ?xml version="1.0" encoding="UTF-8"?>
< !DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Label</key>
        <string>com.liftoffsoftware.gateone.</string>
        <key>ProgramArguments</key>
        <array>
        <string>/usr/bin/python</string>
        <string>/usr/local/bin/gateone</string>
        <string>--settings_dir=/usr/local/etc/gateone</string>
        </array>
        <key>WorkingDirectory</key>
        <string>/usr/local/etc/gateone</string>
        <key>KeepAlive</key>
        <true></true>
        <key>UserName</key>
        <string>_gateone</string>
        <key>GroupName</key>
        <string>_gateone</string>
</dict>
</plist>

とか plist 作ったところ、どうやらアクセスできるようになったようです。しかし GateOne 自体の認証を使ってなく、 GateOne 的には anonymous でのアクセスっぽいので、 Digest 認証やめて GateOne 自体の認証を使うようにするのがいいんだろうなぁ…。

コメントを残す