19
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

リバースプロキシでBASIC認証して、認証で使ったユーザ名をプロキシ先のMediawikiに飛ばす

Posted at

直接公開するサーバがあったり、リバプロ経由で公開するサーバがあったりで、ポリシーがばらばらだったので、統一させることにしました。直接公開が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/に入れる等は必要。

/etc/apache2/sites-enable/revp.conf
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]

最終的にはこういうコンフィグになる。

/etc/apache2/sites-enable/wiki.conf
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>

これで完了。

19
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?