直接公開するサーバがあったり、リバプロ経由で公開するサーバがあったりで、ポリシーがばらばらだったので、統一させることにしました。直接公開がMediawikiだけだったので、Mediawikiを別サーバに移行して、リバースプロキシからプロキシできるようにしました。
環境
- Ubuntu 14.04
- Apache 2.4
目標
リバースプロキシでBASIC認証して、認証OKなら、認証したUserIDをプロキシ先のMediawikiに渡して、Mediawikiで利用中ユーザとして右上に表示する。
新Mediawikiの構築とデータの移行
まず、新しくMediaWikiを立てた。
立てたらデータ移行する。移行対象は「MySQL」と「添付ファイルを含むディレクトリ」を移行すればうまくいった。
移行元サーバで全DBを出力。(本当はMediawiki関連だけで十分だとは思う)
mysqldump -u root -x --all-databases > mysql.dump
移行先サーバで全DBを上書き。(他にデータがある場合は消えてしまうので注意
mysql -u root -p < mysql.sump
上記以外には、下記ディレクトリをそのまま移動すればOK。
/var/lib/mediawiki
/var/lib/mysql
リバースプロキシの設定
リバースプロキシ自体は簡単。apacheの設定ファイルに下記を書くだけ。
ProxyPass 公開パス 転送先URL
ProxyPassReverse 公開パス 転送先URL
例えば、私の場合は https://ドメイン/wiki に来た時に、https://内部用wikiドメイン/wikiに飛ばすようにしたかったので、こう記述。
ProxyPass /wiki https://内部用wikiドメイン/wiki
ProxyPassReverse /wiki https://内部用wikiドメイン/wiki
しかし、これだけだと証明書でエラーが出てしまう。どうも、SSL(HTTPS)でProxy先へ飛ばす場合は、Proxy用の証明書の設定も必要。
SSLProxyCACertificateFile xxx.crt
証明書は事前にオレオレ証明書として作っておいたものを利用。
リバースプロキシ側でBASIC認証をするので、BASIC認証の設定も入れる。セキュリティ的な観点では、非暗号化状態では丸見えのBASIC認証よりは、Digest認証の方が望ましい。今回はSSLを使っているのでBASIC認証で問題ないだろうという判断。
<Location /wiki>
AuthType Basic
AuthName "Authentication for wiki"
AuthUserFile /etc/httpd/.htpasswd
Require user secret
</Location>
しかし、このままだと、BASIC認証した際のUserIDをプロキシ先に渡せないので、下記の設定を入れる。(参照: http://d.hatena.ne.jp/end0tknr/20140612/1402570414) ここでは認証済UserID(REMOTE_USERに入っている値)を、変数 X-Forwarder-User に入れている。X-Forwarded-Userに入れると、プロキシ先に渡してくれるよう。
RewriteEngine On
RewriteCond %{LA-U:REMOTE_USER} (.+)
RewriteRule . - [E=RU:%1,NS]
RequestHeader add X-Forwarded-User %{RU}e
全体として見ると、下記のような設定が必要。他にも当然、ProxyやSSLに関するモジュールを/etc/apache2/mods-enable/に入れる等は必要。
Listen 443
<VirtualHost *:443>
SSLEngine on
SSLProxyEngine on
<Location /wiki>
AuthType Basic
AuthName "Authentication for wiki"
AuthUserFile /etc/httpd/.htpasswd
Require user secret
RewriteEngine On
RewriteCond %{LA-U:REMOTE_USER} (.+)
RewriteRule . - [E=RU:%1,NS]
RequestHeader add X-Forwarded-User %{RU}e
</Location>
SSLProxyCACertificateFile xxx.crt
ProxyPass /wiki https://内部用wikiドメイン/wiki
ProxyPassReverse /wiki https://内部用wikiドメイン/wiki
</VirtualHost>
新Mediawiki側の設定
基本的なサーバ設定と合わせて、UserIDを受け取って、それをREMOTE_USERに入れる設定が必要。(REMOTE_USERに入った値は、Mediawiki側で読み込まれて、Wikiの右上のユーザ名として表示される。ただし、そのためにはMediawiki側で拡張機能を導入する必要がある。(参照: https://www.mediawiki.org/wiki/Extension:Auth_remoteuser ))
RewriteEngine On
RewriteCond %{REMOTE_USER} $^
RewriteCond %{HTTP:X-Forwarded-User} (.+) [NC]
RewriteRule . - [E=REMOTE_USER:%1,NS]
最終的にはこういうコンフィグになる。
Listen 443
<VirtualHost *:443>
DocumentRoot /var/lib/mediawiki
ServerName 内部用wikiドメイン
SSLEngine on
SSLProxyEngine on
SSLCertificateFile xxx.crt
SSLCertificateKeyFile xxx.key
RewriteEngine On
RewriteCond %{REMOTE_USER} $^
RewriteCond %{HTTP:X-Forwarded-User} (.+) [NC]
RewriteRule . - [E=REMOTE_USER:%1,NS]
</VirtualHost>
これで完了。