Shibbolethで複数のIDを同一人物としてログインさせる


(こちらの内容は、学認メーリングリストで国立情報学研究所の西村様、京都大学の針木様から頂いたアドバイスの内容を含んでいます)

Shibbolethにおいては、認証システムにおける「ユーザ名」に相当する概念が、uid(ログイン名)、ePPN(フェデレーション内で一意なユーザ名)、ePTID(IdP:SPのペアで一意なユーザ名)の3つがあります。

この仕組を利用して、他のID体系からShibbolethにユーザアカウントのプロビジョニングを行うにあたって、学内に複数のID体系が存在して、同一ユーザが複数のIDを持っている場合に、次のようなID管理を実現可能です。

  • ユーザはどのID体系でもIdPにログインできる
  • ログイン後は、どのID体系でログインしてもSPからは同一人物として見える

複数uidで同一ePPNのLDAPを用意する

まず、パスワードはuidに紐付いています。LDAP上にuidの異なる複数のエントリを設けることで、その双方でログインすることは可能となります。Shibbolethのuidはフリーフォーマットですので、「@ドメイン名」などのスコープを付けた形でuidを定義するなどの方法で、複数ID体系の衝突を防ぐことは可能でしょう。

そして、ePPNは一番広いアカウント体系のuidを採用するか、Trusted DBにあるユーザ識別可能な何らかの属性から生成して、LDAP上で同一人物は同一のePPNを持つようにすることで、ePPNを要求するSPからはどのuidでログインしても同一人物に見えるようにすることができます。

ePTIDは基本的にePPNとSPのentityIDから生成されるようにすれば、これもSPから見ればどのuidでログインしても同一人物に見えるようにすることができます。

これだけ読むと、LDAP上のデータを適切に用意することだけで実現できそうに思えるのですが、それほど簡単な話ではありません。

ePPNとePTIDをLDAPのePPN値ソースに変更する

まず、学認の標準テンプレートのattribute-resolver.xmlでは、ePPNをLDAPのePPNのエントリではなく、uidを流用するようになっています(2行目のsourceAttributeID=”uid”の部分)。

ここをsourceAttributeID=”eduPersonPrincipalName”と修正することで、LDAPのePPNのエントリを読んでくるようにすることができます。

ただし、ここでLDAPのePPNの値として「hogehoge@foobar」のように「@」を含んだ値を入っていると、スコープ(scope属性の値)と組み合わせて「hogehoge@foobar@***.ac.jp」がePPNとして送信されてしまいます。ePPNの定義ではスコープは最初に出現した「@」の後に続く文字列と定められているため、SPは「@foobar@***.ac.jp」をスコープとして解釈してしまいます。このため、SPによっては不正なスコープとして、ePPNの値が排除されてしまいます。

ちなみに学認のテストフェデレーションには、テスト用SPとして、スコープチェックありのtest-sp1とスコープチェックなしのtest-sp2があるため、このようなスコープにまつわるトラブルをチェックすることが可能です。

LDAPのePPNの値としては、「@」を含まないユーザID体系を採用するか、ユーザIDからなんらかの変換方法で「@」を含まない文字列に変換した上で利用するのがお勧めです。

そもそもePPNは、uApprove.jpなどで送信許可を得るとき以外には、ほとんどユーザにとって見ることのない文字列です。プライバシーの観点からも容易に元のユーザIDに復元できないハッシュ文字列の類にしてしまう方がおすすめだと思います。Base64エンコーディングなら「@」は含まないので安心して利用できます。

ePTIDに関しても、標準でソースはuidとなっているのでこれもePPNに直す必要があります(デフォルトだと、ePPN=uidなので、一見ePTIDがePPNから生成されているようにも見えるのですが、実際にはuidから生成されています)。

Computed IDを利用している場合は、attribute-resolver.xmlの

の部分の4行目にある「sourceAttributeID」を、

のようにePPNソースに書き換えます。

StoredIDを利用している場合は、

の4行目にあるsourceAttributeID=”uid”を、

のようにePPNソースに書き換えます。

これで、複数体系のIDを持つ同一人物をそれぞれのuidでログインさせ、それらが共通のePPNを持つように設定することが可能となります。

補足:同一ePPN、異uidのエントリはShibbolethで許されるか?

ちなみに、ePPNは「フェデレーションで一意」のユーザ名的存在なのに、複数のuidが同一ePPNを持っていてもいいのか、という疑念もあるかと思いますが、学認技術運用基準においては、

8.2) 利用者 ID の再利用
eduPersonPrincipalName、およびeduPersonTargetedIDに関して、かつて利用されていたが、現在利用されていない利用者IDを他者が使用する場合は、最終の利用時から最低 24 ヶ月間は再利用すべきではない。

となっており、同一人物が利用する分には特に規定はありません。

そしてShibboleth開発元であるInternet2でのePPNの定義においては、

The “NetID” of the person for the purposes of inter-institutional authentication.

…(中略)…

When the scope is a registered domain name, the corresponding registrant organization is to be taken as the scope. For example, francis@trinity.edu would imply that the identity behind the ePPN has the “NetID” “francis” at the instituion of higher education that registered itself with the domain name “trinity.edu.” If other value styles are used, their semantics will have to be profiled by the parties involved. Each value of scope defines a namespace within which the assigned principal names are unique. Given this rule, no pair of eduPersonPrincipalName values should clash. If they are the same, they refer to the same principal within the same administrative domain.

(強調部分:筆者)

のように書いてあります。特に最後の文をからは、衝突せずに同一人物が複数のuidを持つエントリを同一のePPNで共有することを妨げるようには読めません。

以上のような考察から、問題はないと解釈しています。

Shibbolethで複数のIDを同一人物としてログインさせる」への1件のフィードバック

  1. ピンバック: Shibboleth IdPのログをPostgreSQLに格納する | 慶應義塾ITC本部・技術メモ

コメントを残す

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