AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

Apache でリバースプロキシしてカジュアルに Basic 認証

ネットワーク環境の更新により、社内ネットワークで動作させていた検証環境を VMimport で AWS に出したのですが、冷静に考えて認証もなしにインターネットに解き放つとは……という感じなので、ついでに Basic 認証をつけました。というお話。

ロケ地:CentOS 6.8 / Apache 2.2 / webrick

単一インスタンスに複数の環境

大分古い Rails アプリケーション( 環境が webrick のあたりで… ) が複数動いている環境があり、ポートを 3001 から順番に付与して動作させておりました。社内ネットワークであれば FW の内側なので、認証もクソも考えること無く http://192.168.0.100:3001 とかでアクセスさせれば良いのですが、インターネットに解き放つとなると話は別です。

そもそも検証環境なので、サーチエンジンにクローリングされて本番と混同されたらマズいよね robots.txt 書こうねとか、振る舞いのよくないクローラに拾われても被害が最小限になるように認証かけとこうね?みたいな話ですね。

最初は特に考えず pound を利用していた

どうせアクセスしてくるユーザも限られるし Pound でいいか!ってお気持ちで以下のような config で Pound 投入しておりました。

pound.cfg

User        "nobody"
Group       "nobody"
LogLevel    1
Alive       10
Daemon      1
LogFacility local1

ListenHTTP
    Address    0.0.0.0
    Port       80

  Service
    HeadRequire "Host: web1.example.com"
    BackEnd
        Address 127.0.0.1
        Port    3001
        TimeOut 60
    End
  End

  Service
    HeadRequire "Host: web2.example.com"
    BackEnd
        Address 127.0.0.1
        Port    3002
        TimeOut 60
    End
  End

  Service
    HeadRequire "Host: web3.example.com"
    BackEnd
        Address 127.0.0.1
        Port    3003
        TimeOut 60
    End
  End
End

認証ないのはだめでは?認証いれよ!

環境の都合上、 any にウェルカム!なのはよくないので、 Basic 認証を入れることにしました。しかし Rails アプリケーションは public/.htaccess などを設置してお手軽に Basic 認証できません。そら authenticate_or_request_with_http_basic とか書けばいいけど、検証環境なので勝手にコードに手を入れるのはね?というお気持ち。 なので、入れた Pound を捨てて Apache をご利用します。今回は環境分ドメインが存在しているため、簡単に書けるネームベースの VirtualHost に個別でリバースプロキシと Basic 認証の設定を書きました。

yum install httpd httpd-devel apr apr-util
htpasswd -c /etc/httpd/htpasswd basic
vi /etc/httpd/conf/httpd.conf
/etc/init.d/httpd start

httpd.conf

## snip ##

Listen 80
NameVirtualHost *:80

<VirtualHost *:80>
  ServerName web1.example.com
  ProxyPass / http://127.0.0.1:3001/
  ProxyPassReverse / http://127.0.0.1:3001/
  <Location "/">
    AuthType Basic
    AuthName "Basic Authentication"
    AuthUserFile /etc/httpd/htpasswd
    Require user basic
  </Location>
</VirtualHost>

<VirtualHost *:80>
  ServerName web2.example.com
  ProxyPass / http://127.0.0.1:3002/
  ProxyPassReverse / http://127.0.0.1:3002//
  <Location "/">
    AuthType Basic
    AuthName "Basic Authentication"
    AuthUserFile /etc/httpd/htpasswd
    Require user basic
  </Location>
</VirtualHost>

<VirtualHost *:80>
  ServerName web3.example.com
  ProxyPass / http://127.0.0.1:3003/
  ProxyPassReverse / http://127.0.0.1:3003/
  <Location "/">
    AuthType Basic
    AuthName "Basic Authentication"
    AuthUserFile /etc/httpd/htpasswd
    Require user basic
  </Location>
</VirtualHost>

おしまい

これで Rails アプリケーション部分に手を加えることなく、Apache のみでリバースプロキシと Basic 認証を導入することができました。ベストかどうかはわからんけど、 Production 環境でなければままえあろって感じです。