Last-modified: 2017-08-21 (月) 14:51:19
SimpleSAMLphp/連携(IdP:SimpleSAMLphp, SP:SimpleSAMLphp)

概要

IdP:SimpleSAMLphp, SP:SimpleSAMLphpで、SAML連携を行います。
以下で構築したIdP, SPをベースとします。

上記の手順で作成した場合、http/https共に有効な状態です。
IdP,SPがhttpはセキュリティ上あり得ないので、メタデータの取得はhttpsアクセスで取得してください。
また、SAMLメッセージの確認には、FirefoxのSAML tracerが便利です。

WebSSO, IdP:Redirect, SP:POST, 起点:SP

  1. IdP側のメタデータを取得
    [IdPサイト]-[Federation]-[SAML 2.0 IdPメタデータ]-[Show metadata]
    下部にあるSimpleSAMLphp用のphpコード(メタデータ)をコピーする
    01.png
  2. SP側に、IdPのメタデータを設定
    1. vi metadata/saml20-idp-remote.php
      ファイル末尾に、上記でコピーしたIdPのメタデータを張り付ける
    2. vi config/authsources.php
      Everything is expanded.Everything is shortened.
        1
        2
        3
        4
        5
        6
      
       
       
      -
      !
      -
      !
      
          'default-sp' => array(
              'saml:SP',
              # 変更
              'idp' => '<IdPのEntity ID(IdPのメタデータに記載されている)>',
              # コメント解除
              'signature.algorithm' => 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256',
    3. デプロイ
      Everything is expanded.Everything is shortened.
        1
        2
      
       
       
      
      git commit -a -m "Connected IdP"
      git push azure master
  3. SP側のメタデータを取得
    [SPサイト]-[Federation]-[SAML 2.0 SPメタデータ]-[Show metadata]
    IdP側と同様に、SimpleSAMLphp用のphpコード(メタデータ)をコピーする
    02.png
  4. IdP側に、SPのメタデータを設定
    1. vi metadata/saml20-sp-remote.php
      ファイル末尾に、上記でコピーしたIdPのメタデータを張り付ける
    2. デプロイ
      Everything is expanded.Everything is shortened.
        1
        2
      
       
       
      
      git commit -a -m "Connected SP"
      git push azure master

設定確認

  1. IdP側のFederationページ(adminでログイン済み)
    信頼されたSPとして登録されていること
    03.png
  2. SP側のFederationページ(adminでログイン済み)
    信頼されたIdPとして登録されていること
    04.png

動作確認

  1. SP側のAutenticationページ
    [Test configured authentication sources]-[default-sp]
    05.png
  2. 認証のためにIdPへリダイレクト
    06.png
  3. 認証後にSPへリダイレクト
    07.png

SAMLメッセージ

NameIDを一意な値にする

デフォルト設定の場合、ログイン毎にNameIDが変わります(transient)。
IdPのデフォルト値を設定する場合はIdP側を、SP側から要求フォーマットをtransient以外に指定する場合はSP側の設定を変更します。

  1. vi metadata/saml20-idp-hosted.php
    Everything is expanded.Everything is shortened.
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
    
    -
    |
    |
    |
    !
    -
    |
    |
    !
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    
        # 一般的なNameIDFormat
        # urn:oasis:names:tc:SAML:2.0:nameid-format:transient (一時的な仮名)
        # urn:oasis:names:tc:SAML:2.0:nameid-format:persistent (永続的な仮名)
        # urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress
     
        # persistentは、SPのentryIDとauthprocで指定したattribute値を, config/config.phpのsecretsaltを利用しハッシュ化した値(この例ではuidをハッシュ化している)
        # emailAddressは、authprocで指定したattibute値(この例ではmail)
        # 数字はプライオリティ
     
        'NameIDFormat' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent',
        'authproc' => array(
            10 => array(
                'class' => 'saml:TransientNameID',
            ),
            20 => array(
                'class' => 'saml:PersistentNameID',
                'attribute' => 'uid',
            ),
            30 => array(
                'class' => 'saml:AttributeNameID',
                'attribute' => 'mail',
                'Format' => 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress',
            ),
        ),
  1. vi config/authsources.php
    Everything is expanded.Everything is shortened.
      1
    
     
    
    'NameIDPolicy' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent',

IdPをPOSTバインディングにする

デフォルト設定の場合、IdPはRedirectバインディングです。
これをPOSTバインディングにするには、IdP側の設定を変更します。

  1. vi metadata/saml20-idp-hosted.php
    Everything is expanded.Everything is shortened.
      1
      2
    
    -
    !
    
    # 追加
    'SingleSignOnServiceBinding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
  2. デプロイ
  3. IdPのメタデータが更新されるため、再取得しSP側に設定
  4. 結果
    リクエスト,レスポンスともにPOST
    11.png

表示名を変更する

  1. vi metadata/saml20-idp-hosted.php
    Everything is expanded.Everything is shortened.
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
    
    -
    |
    !
     
     
     
     
     
     
     
     
     
    
        # IdPの名称と、組織名
        # いずれの値も例のとおり、言語コード毎に指定が可能
     
        'name' => array(
            'en' => 'idp en',
            'ja' => 'idp ja',
        ),
        'OrganizationName' => 'ON',
        'OrganizationDisplayName' => 'ON',
        'OrganizationURL' => array(
            'en' => 'http://example.com'
        ),
  1. vi config/authsources.php
    Everything is expanded.Everything is shortened.
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
    
    -
    |
    !
     
     
     
     
     
     
     
     
     
    
            # SPの名称と、組織名
            # いずれの値も例のとおり、言語コード毎に指定が可能
     
            'name' => array(
                'en' => 'sp1 en',
                'ja' => 'sp1 ja',
            ),
            'OrganizationName' => 'ON',
            'OrganizationDisplayName' => 'ON',
            'OrganizationURL' => array(
                'en' => 'http://example.com'
            ),

認証要求に署名をつける

デフォルト設定の場合、認証要求は署名されません。
SPの設定によらず署名を期待する場合はIdP側を、IdPの設定によらず署名する場合はSP側の設定を変更します。

  1. vi metadata/saml20-idp-hosted.php
    Everything is expanded.Everything is shortened.
      1
      2
      3
      4
    
    -
    !
     
     
    
        # redirect.signをTRUEにすると、メタデータ(XML)にWantAuthnRequestsSigned="true"が追加される
     
        'redirect.sign' => TRUE,
        'redirect.validate' => TRUE,
  1. vi config/authsources.php
    Everything is expanded.Everything is shortened.
      1
      2
      3
      4
    
    -
    !
     
     
    
            # redirect.signをTRUEにすると、メタデータ(XML)にAuthnRequestsSigned="true"が追加される
     
            'redirect.sign' => TRUE,
            'redirect.validate' => TRUE,

NameIDを暗号化する

デフォルト設定の場合、認証応答に含まれるNameIDは平文です。
これを暗号化する場合、IdP, SPの設定が必要です。

  1. vi metadata/saml20-idp-hosted.php
    Everything is expanded.Everything is shortened.
      1
    
     
    
    'nameid.encryption' => TRUE,
  1. vi config/authsources.php
    Everything is expanded.Everything is shortened.
      1
    
     
    
    'nameid.encryption' => TRUE,

アサーションを暗号化する

デフォルト設定の場合、認証応答に含まれるアサーションは平文です。
これを暗号化する場合、IdP, SPの設定が必要です。

  1. vi metadata/saml20-idp-hosted.php
    Everything is expanded.Everything is shortened.
      1
    
     
    
    'assertion.encryption' => TRUE,
  1. vi config/authsources.php
    Everything is expanded.Everything is shortened.
      1
    
     
    
    'assertion.encryption' => TRUE,

検証時の環境

参考