SimpleSAMLphp のdefault-spとdefault-idpを連携 @ CentOS

SimpleSAMLphp のdefault-spをOpenIdPと連携させるテスト @ CentOS

前回の話を下敷きに、idpをOpenIdPではなくSimpleSAMLphpにします。
  • 作業日: 2012-11-04
  • さくらのVPS上
  • CentOS release 6.3 (Final)
  • simplesamlphp-1.10.0

まず先回りで注意ですが、同じホスト名ではidpとspを兼ねられません。クッキーの問題なのでSAMLの制約なのかもしれません。あるいはSimpleSAMLphpの問題なのかも。どちらにしても今回は1ホスト名で両方は出来ないことをまず前提とします。
When running a simpleSAMLphp IdP and a simpleSAMLphp SP on the same computer, the SP and IdP MUST be configured with different hostnames. This prevents cookies from the SP to interfere with cookies from the IdP. (SimpleSAMLphp Identity Provider QuickStart 9.1)
ちゃんと設定する場合、証明書が2つ必要、と言っているようにも感じられます。

今回は自己振出証明書 (オレオレ証明書) でidpを構築することにします。それであんまり難易度が上がったりはしませんが、証明書や設定を逆にすると後々面倒なので注意。sp側は普通の証明書が既にあります (前回の記事と同じ)

このドキュメントではidp側を idp.host、sp側を sp.host としていきます。

○ さんこうにするぺーじ

0. DNSエントリーを追加、証明書の準備、など。

idp.hostをDNSに登録します。また証明書も準備します (自己振り出しで良ければこのページの7に記述があります)

本稿はDNSや証明書のことをあんまり理解していない人がこれを書いているので、この部分は詳しく説明しません。idp.hostのAレコードを新たに追加します。

1. httpsの設定を追加

まず https://(idp.host)/simplesamlphp/ と https://(sp.host)/simplesamlphp/ の両方がブラウザから見れるようにします。

本稿はApacheのことをあんまり理解してない人以下略。

おおまかに言うと、/etc/https/conf.d/ssl.conf を見てVirtualHost のホスト指定部分, ServerName,SSLCertificateFile, SSLCertificateKeyFile, SSLCertificateChainFile に矛盾がないかを確認し、設定を修正します。 <VirtualHost *:443>とかなってたら多分まともに動きません。

idp.host に対応するVirtualHostにはそちらの証明書などを、sp.host に対応するVirtualHostにはそちらの証明書などをバラで指定する必要があるはず。

"Alias /simplesamlphp/ /opt/simplesamlphp-1.10.0/www/" も両方に指定します (前回の記事参照)

両方のホスト名でSimpleSAMLphpの初期ページが見れることを確認します。ここで証明書の設定も正しくできていることを確認します (今回は片方が「良くない証明書」ということで警告を受けるはずです。両方だとなにかおかしい)

2. saml20-idp を有効化

'enable.saml20-idp' => true,

本家では(別の有名なSSOの)Shibboleth対応と思われるshib13-idpも有効にしてますが、これは設定上若干混乱のもとなので、今回は切ったままの方が良いと思われます。

3. 認証モジュールの設定

本家を参照してください。簡単なので最初はexampleauth:Userpassから初めて良いのでは。ただ、パスワードはデフォルトからはせめて変えたほうが良いと思います。

4. IdPの設定

本家をもとにします。ただし、今回の場合はホスト名を手で指定します。


$metadata['https://(idp.host)/simplesamlphp/saml2/idp/metadata.php'] = array(
        /*
         * The hostname of the server (VHOST) that will use this SAML entity.
         *
         * Can be '__DEFAULT__', to use this entry by default.
         */
        'host' => '(idp.host)',

        /* X.509 key and certificate. Relative to the cert directory. */
        'certificate' => '/usr/local/ssl/selfcert/idp_exp.crt',
        'privatekey'  => '/usr/local/ssl/selfcert/idp_exp.key',
        // no password

        /*
         * Authentication source to use. Must be one that is configured in
         * 'config/authsources.php'.
         */
        'auth' => 'example-userpass',
        //'auth' => 'example-ldap',

        /* Uncomment the following to use the uri NameFormat on attributes. */
        'attributes.NameFormat' => 'urn:oasis:names:tc:SAML:2.0:attrname-format:uri',
        'authproc' => array(
                // Convert LDAP names to oids.
                100 => array('class' => 'core:AttributeMap', 'name2oid'),
        ),

);


5. spの設定見直し

idpのホストを直に打ったのと並行してspのホストも直打ちします。手元で試したときには、これをやらないと、ホスト名部分でSimpleSAMLphpが混乱して、両者を混在させて動作しない、という不思議動作をやらかしました (私がなにか間違ってたのかもしれないけど)

といってもやるのは authsource.php の entityID を指定するだけです。NULLではなくhttps://(sp.host)/simplesamlphp/module.php/saml/sp/metadata.php/default-sp などを入れます。

6. 自分に自分をspとして認識させる。自分に自分をidpとして認識させる。

  • spとしての自分をidpとしての自分に認識させるために、 metadata/saml20-sp-remote.php に設定を追加します。
  • idpとしての自分をspとしての自分に認識させるために、 metadata/saml20-idp-remote.php に設定を追加します。

前者は前回OpenIdPに登録した内容に類似します。

後者はEntityIDをSPのものと間違えないように (私は間違えた)。中途半端にコピーして https://(idp.host)/simplesamlphp/module.php/saml/sp/metadata.php/default-sp とかやらないように (idpとspが混ざってるよくない例)。

例えばsaml20-idp-remote.phpにはこういった設定が入るはずです。


$metadata['https://(idp.host)/simplesamlphp/saml2/idp/metadata.php'] = array (
  'name' => 'idp_exp',
  'metadata-set' => 'saml20-idp-remote',
  'entityid' => 'https://(idp.host)/simplesamlphp/saml2/idp/metadata.php',
  'SingleSignOnService' =>
  array (
    0 =>
    array (
      'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
      'Location' => 'https://(idp.host)/simplesamlphp/saml2/idp/SSOService.php',
    ),
  ),
  'SingleLogoutService' => 'https://(idp.host)/simplesamlphp/saml2/idp/SingleLogoutService.php',
  'certData' => 'ここは状況により違う',
  'NameIDFormat' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient',
);


7. テスト

うまくやれば以下のような感じに。



○ 注意事項

同じマシン上での作業になるため、idpとspの役割を混ぜて混乱を起こすというのを上記の過程で私も何度もやってます。エラーを見たら、とりあえずidpとspを取り違えてメタデータを設定してないかは確認してみてください。

あと、困ったら本家をもう一度読みなおすと何か分かるかもしれません。

このブログの人気の投稿

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

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

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