harry’s memorandum

おれおれメモ

リバースプロキシ経由でUserminにアクセスする方法

外部からUserminやWebminにアクセスしたい。自分がやりたいことの場合、公式サイトに書いてある方法だけだと中途半端に失敗する。

目的はこんな感じ。

f:id:dharry:20120109053922p:image

構成

Userminサーバ (Userminの設定)

Centos6.2で試しているので RPMのUserminパッケージをダウンロードします。

$ yum install perl-Net-SSLeay.x86_64
$ yum --enablerepo=rpmforge install perl-Authen-PAM.x86_64
$ rpm -ivh usermin-1.500-1.noarch.rpm

/etc/usermin/config に追加。*1

ssl=0
webprefix=/usermin
webprefixnoredir=1

/etc/usermin/miniserv.conf にオレオレ設定を追加。*2

front_url=http://proxy.example.com/usermin/

userminを再起動。ついでに自動起動。

$ sudo /etc/init.d/usermin restart
$ sudo /sbin/chkconfig --level 345 usermin on

Userminサーバ (UserminのWebサーバのminiserv.confを修正)

一応バックアップ

$ cd /usr/libexec/usermin/
$ sudo cp -p miniserv.pl miniserv.pl.backup

合っているかどうか自信ないけど、まあいいよね。*3

# diff -c  miniserv.pl miniserv.pl.backup
*** miniserv.pl Tue Jan 24 16:30:10 2012
--- miniserv.pl.backup  Sun Jan 22 10:46:59 2012
***************
*** 3919,3929 ****
                else {
                        &write_data("Set-Cookie: $sidname=$sid; path=/$sec\r\n");
                        }
!               if ($header{'referer'} =~ /$config{'front_url'}/) {
!                       &write_data("Location: $config{'front_url'}\r\n");
!               } else {
!                       &write_data("Location: $prot://$host$portstr$in{'page'}\r\n");
!               }
                &write_keep_alive(0);
                &write_data("\r\n");
                &log_request($acpthost, $authuser, $reqline, 302, 0);
--- 3919,3925 ----
                else {
                        &write_data("Set-Cookie: $sidname=$sid; path=/$sec\r\n");
                        }
!               &write_data("Location: $prot://$host$portstr$in{'page'}\r\n");
                &write_keep_alive(0);
                &write_data("\r\n");
                &log_request($acpthost, $authuser, $reqline, 302, 0);

Userminサーバ (Apache Reverse Proxyの設定)

http://localhost:20000/にするとログアウトアイコンがでなくなってしまうので、http://usermin.example.com:20000/ にする。

<IfModule mod_proxy.c>
ProxyRequests Off
ProxyVia Off
</IfModule>

NameVirtualHost *:80
<VirtualHost *:80>
    ProxyPreserveHost On
    ProxyPass         /usermin/     http://usermin.example.com:20000/
    ProxyPassReverse  /usermin/     http://usermin.example.com:20000/
    ServerName        usermin.example.com
    <Proxy *>
       allow from all
    </Proxy>
</VirtualHost>

フロントサーバ (Apache Reverse Proxyの設定)

<IfModule mod_proxy.c>
ProxyRequests Off
ProxyVia Off
</IfModule>

NameVirtualHost *:80
<VirtualHost *:80>
    ProxyPreserveHost On
    ProxyPass         /usermin/     http://usermin.example.com/usermin/
    ProxyPassReverse  /usermin/     http://usermin.example.com/usermin/
    ServerName        proxy.example.com
    <Proxy *>
       allow from all
    </Proxy>
</VirtualHost>

あとは細かい設定を見なおして、公開する範囲を絞って、SSLに対応するだけかな。

*1:httpsはReverseProxy側でラップするつもりなのでssl=0にする

*2:ReverseProxy側でhttpsする場合はオレオレ設定のfront_url=http://usermin.example.com/usermin/にする

*3:ReverseProxy経由で認証成功した後に Location: http://proxy.example.com:20000/ されるので書き換えます