SimpleSAMLphpをSPとしてShibbolethをIdPにする

現在の手元のShibbolethが非常に「アレ」な設定になってるため詳細については詰めないけれども、メモがわりに気をつけるべき点を書く

一番厄介に見えたのは「デフォルトでShibbolethはAssertionをSP側のサーバ証明書 (に入ってる公開鍵) で暗号化する」という点。

https://groups.google.com/forum/?fromgroups=#!topic/shibboleth-users/FvcuVGTHd7Y
Shibboleth IdPs encrypt by default and the metadata you gave the IdP for your SP doesn't include an encryption key.
IdPとSPを両方SimpleSAMLphpにした場合と一番異なるのがこれ。不幸にしてSimpleSAMLphpのデフォルトスクリーン上で"Federation"タブ経由で見れるSAML 2.0 Metadata XMLがこれを意識してくれないというのもまた一つ問題。そのままコピペでShibbolethのmetadataに書いても動かない。

もうひとつ参考: http://shibboleth.1660669.n2.nabble.com/Configure-IdP-to-encrypt-SAML-assertions-td2198881.html

Shibboleth側のmetadataに追加する EntityDescriptor 内にこういう感じの設定が必要。これによってこのSPとやり取りするための基本的な記述をShibboleth (IdP) が得る。


<EntityDescriptor entityID="https://sp_exp.example.com/simplesamlphp/module.php/saml/sp/metadata.php/default-sp">
  <SPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:1.1:protocol urn:oasis:names:tc:SAML:2.0:protocol">
    <SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://sp_exp.example.com/simplesamlphp/module.php/saml/sp/saml2-logout.php/sp_as_spexp"/>
    <AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://sp_exp.example.com/simplesamlphp/module.php/saml/sp/saml2-acs.php/sp_as_spexp" index="0"/>
    <AssertionConsumerService Binding="urn:oasis:names:tc:SAML:1.0:profiles:browser-post" Location="https://sp_exp.example.com/simplesamlphp/module.php/saml/sp/saml1-acs.php/sp_as_spexp" index="1"/>
    <AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" Location="https://sp_exp.example.com/simplesamlphp/module.php/saml/sp/saml2-acs.php/sp_as_spexp" index="2"/>
    <AssertionConsumerService Binding="urn:oasis:names:tc:SAML:1.0:profiles:artifact-01" Location="https://sp_exp.example.com/simplesamlphp/module.php/saml/sp/saml1-acs.php/sp_as_spexp/artifact" index="3"/>
    <AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:profiles:holder-of-key:SSO:browser" Location="https://sp_exp.example.com/simplesamlphp/module.php/saml/sp/saml2-acs.php/sp_as_spexp" index="4"/>
    <KeyDescriptor>
      <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:X509Data>
          <ds:X509Certificate>MII(ごーにょごにょ
ごーにょごにょ
ぽーにょぽにょ
さかなのこ</ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
    </KeyDescriptor>
  </SPSSODescriptor>
  <ContactPerson contactType="technical">
    <GivenName>Hansode</GivenName>
    <SurName>San</SurName>
    <EmailAddress>hansode@example.com</EmailAddress>
  </ContactPerson>
</EntityDescriptor>

X509Certificateで囲まれている部分をサーバの証明書とする。これがShibboleth (IdP) から送られるAssertionを暗号化する際の公開鍵を含んでる。

# ついでに、Shibbolethのattribute-filter.xmlでこのSPに対して公開したい属性も書くこと。これも、重要だよ

次にSimpleSAMLphpの方で上記のIdPを受け入れてかつAssertionを復号化するための設定を書く。
  • metadata/saml20-idp-remote.php の上記Shibboleth IdP に該当する設定に 'assertion.encryption' => 'TRUE' を追加
  • config/authsources.php の当該SP設定に privatekey (秘密鍵へのパス) を追加
saml20-idp-remote.phpのあれこれは大体こういう感じになるはず。

$metadata['https://idp_shibboleth.example.com/idp/shibboleth'] = array (
  'name' => 'Shibboleth',
  'metadata-set' => 'saml20-idp-remote',
  'entityid' => 'https://idp_shibboleth.example.com/idp/shibboleth',
  'SingleSignOnService' =>
  array (
    0 =>
    array (
      'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
      'Location' => 'https://idp_shibboleth.example.com/idp/profile/SAML2/Redirect/SSO',
    ),
  ),
  'certData' => 'しょーめーしょ',
  'NameIDFormat' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient',
  'assertion.encryption' => 'TRUE',
);

ローカルで試した限りだと metadata/saml20-sp-hosted.php の privatekey は見にいってくれないので注意。今回は公開鍵証明なのでsaml20-idp-remote.phpへの (共有鍵を用いた暗号化・復号化のための) sharedkeyの設定も行わない(このあたりのドキュメントも参照)

○ 自力でたどり着く道

このレベルですら結構試した例がWebにないのだが、要求としてはまぁまぁ普通のレベルの話。読むべきは以下のログなど

  • shibboleth-idp の idp-process.log (変なmetadata XMLを書いてたまにここに例外が吐かれてるのを見た)
  • SimpleSAMLphpのログ (DEBUGレベルのログを出して、IdPとSPがやりとりしているSAMLも見ると楽)
  • 今回はphpのソースまでたどってprivatekeyがどうやって読まれてるかもチェックした。いわゆるprintfデバッグでしかない
  • エラーメッセージをそのまんま検索する

このブログの人気の投稿

WiiUのコントローラが通信不良に陥った話

LibreOfficeで表紙、目次、本体でフッターのページ番号のスタイルを変える

技術書典2 あ-03 『もわねっとのPythonの本』