月別アーカイブ: 2014年10月

Shibbolethのログインページをブックマーク可能にする

一般論として、Shibbolethのログインページはブックマークできません。もちろんブラウザからブックマーク操作をすることは可能ですが、再度そのブックマーク経由でログインしようとした場合、ログイン対象のアプリが識別できず、ユーザにとっては謎のエラーが出てしまいログインできません。

そこで、次のような方法を取れば、仮にブックマークしてしまった場合であっても、ポータルアプリなど、一番良く使われるであろうアプリケーションのログイン画面にリダイレクトが可能です。この手法は、ポータルのようなアプリがあることが前提となります。学認で専ら外部のアプリのみを利用している場合は、ローカルアプリとして学認ポータル的なものを作ると良いかもしれません。学認IdPにおけるローカルアプリの作り方に関してはこちらをご覧ください。

手法は超簡単です。Shibboleth IdPのlogin.jsp内で、ログイン対象アプリは <idpui:serviceName/> で表示されます。この部分を囲むタグ(なければ<span>を作れば良い)の中身をJavaScriptからDOMで読み取り、それが”Unspecified Service Provider”という文字列であれば、JavaScriptでポータルアプリのログインURLに飛ばしてやればよいのです。

こうすれば、IdPのログイン画面をブックマークしても、ユーザに表示されるのはUnspecified Service Providerへの謎のログイン画面ではなく、無事にポータルアプリ用のIdPログイン画面が瞬時に表示されます。

Tips的ですが、Shibbolethのユーザビリティで初心者が一番引っかかりやすいだろう部分を、これで解決できます。

Shibboleth関連サーバをロードバランサの下に置く場合の注意

ShibbolethのIdPやSP等のサーバを、SSLのオフローディングや冗長化のためにロードバランサの下に置く場合の注意点をまとめてみます。

Shibboleth IdPのロードバランサー利用

RNAT or client-IP

サーバをロードバランサー配下に置く場合、クライアントのIPアドレスをソースに持ったままサーバに届く設定と、特定のHTTPヘッダにクライアントのソースIPアドレスを入れて、ソースアドレスはロードバランサー自身となるタイプの2種類の構成が考えられます。前者はデフォルトルートをロードバランサーにする必要があるため、ロードバランサーで一種のNATを行います。

個人的には後者のほうがネットワーク構成に対する制約が少なくて好きなのですが、Shibbolethをロードバランサーの下に入れる場合は圧倒的に前者がお勧めです。後者だと、Apache, mod_proxy_ajp, Tomcat, Shibboleth IdPの各段階で色々設定してソースアドレスをShibboleth IdPに届けないと、ShibbolethのログにソースIPアドレスが記録されません。しかもいろいろな制約条件があります。

一回挑戦してみたのですが、あまりに複雑になるので諦めました。普通にNATするほうが良いと思います(諸事情で、NAT構成にするためにサーバにNICを足す羽目になりましたが…)。

SSLオフローディングに関する問題

ここでは、ロードバランサーでSSLオフローディングを行い、Apacheのmod_proxy_ajpとTomcat上のShibboleth IdPを単純に組み合わせて、80/tcpでロードバランサ経由のリクエストを受ける場合を考えます。

この場合、ShibbolethはSSLが必須のため、ブラウザが認証画面に移った際に、”Error Message: Message did not meet security requirements”というエラーが出て利用できません。

また、Tomcatはセキュアな通信の場合CookieにSecure属性を付けるようですが、この機能も働かなくなります。

これは、tomcatのserver.xmlで、AJPコネクタの設定を次のように変更すれば解決します(前者に対応するのがproxyPortとscheme、後者に対応するのがsecure)。

変更前:

変更後:

これで、エラーメッセージは発生しなくなり、またJSESSIONIDのCookieだけではなく、_idp_authn_ic_keyのCookieにもSecure属性が付くようになります。

続きを読む