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