ネットワーク環境の更新により、社内ネットワークで動作させていた検証環境を 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 環境でなければままえあろって感じです。