学認用Shibbolethリバースプロキシの構築


学認で利用されている認証ソフトウェアであるShibbolethは、SP部分はC++で記述されているため、SPの動作にJava VMの必要などもなく、既存のシステムへの組み込みも比較的容易です(IdPはJava VMやtomcatが必須です)。一方で様々な理由で、認証リバースプロキシがあると、内製ではないWebアプリの対応が楽になる場合があります。

そのため、Shibbolethの認証リバースプロキシを構築してみました。作業環境にはFreeBSDを用いましたが、CentOS等の場合でもそれほど違いはないと思います。

まずは、shibboleth-spをインストールします。FreeBSDの場合、標準だとapache22がprefork MPMでインストールされてしまい、メモリを無駄遣いするので、このあたりの手順でworker MPM版をインストールするのがお勧めです。

そして、ApacheのSSLを適切に設定し、SPとしての設定も行います。リバースプロキシを使って実現するようなサービスはたいてい学内サービスでしょうから、学認のSPとしてグローバルに登録しない、ローカル的なSPとしての構築をしたい場合はこの辺りの手順を参考にしてください。

そして、ApacheのSSL設定部分(FreeBSDならば/usr/local/etc/apache22/extra/httpd-ssl.conf、CentOSならば/etc/httpd/conf.d/ssl.confあたり)の<VirtualHost _default_:443>…</VirtualHost>の中で、次のような設定を行います。ここで、プロキシ先は平文で、http://192.168.1.2/を仮定します。

この例では、ePPNとeduPersonAffiliationを属性として受け取り、Affiliationが教員か学生の場合のみにプロキシにアクセスを許可ています。そして背後のサーバに、HTTPのパラメータとしてX-Shib-EppnにePPNを、X-Shib-AffiliationにeduPersonAffiliationを渡しています。

ちなみに、Apacheの環境変数的なShibbolethの属性パラメータの名前ですが、これはattribute-map.xml(FreeBSDなら/usr/local/etc/shibbolethに、CentOSなら/etc/shibbolethにあります)を読めば出ています。ePPNとeduPersonAffiliationに関しては、次のような定義となっています。

これで、ePPNはeppn、 eduPersonAffiliationはunscoped-affiliationであるということがわかりますが、紛らわしいのはeduPersonScopedAffiliationがaffiliationであるということです。気をつけましょう。

プロキシ先のサーバでprintenv.plなどを動かしていると、学認による認証がされた後に、次のような結果が表示され、情報が適切に伝達されていることがわかります(Affiliationは教員かつメンバーの例となっています)。

この場合だと、全てのHTTPアクセスにePPNやeduPersonAffiliationの値が送信されてしまいますが、もっと個人情報的なデータだと、プライベートネットワークとはいえ、全てのHTTPアクセスに平文でこれらが付いてしまうのは気持ち悪いという考えもあるかもしれませんし、処理効率的な考え方からしても単なる無駄です。

その場合は、ログイン用のスクリプトなどにのみShibbolethの認証をかけて、その他の部分ではプロキシ先のサーバでセッション管理などを行うのが妥当と考えられますが、それは今後さらに実験して別の機会に書こうと思います。

ちなみに一応、プロキシの外部から偽のHTTP_X_SHIB_EPPNやHTTP_X_SHIB_AFFILIATIONを食べさせてみましたが、きちんと正しい値に上書きされて背後のサーバに渡されました。安心して利用できそうです。

(追記)セキュリティ上の懸念

ということで、リバースプロキシは便利なのですが、このあたりを読むと、やはりHTTPヘッダ上での認証情報受け渡しは偽装ヘッダの可能性を否定出来ないように思われます(具体的にどのような方法で可能なのかはわかりませんが)。

回避する手段は色々あると思うので、実際の環境で利用するには、もう少しブラッシュアップが必要かと思われます。

(2014年7月18日追記)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です