SPのインストールと設定について解説します。

SPのインストール

Shibbolethを利用した認証を利用するためには、Webアプリを設置するサーバにService Provider(SP)と呼ばれるコンポーネントをインストールする必要があります。このサイトでは、Red Hat Enterprise Linux(CentOS)環境を想定して説明しますので、その他のOSでセットアップする場合は設定ファイルのパス等については適宜読み替えてください。

SPのインストールは標準的な手順に従って作業すればよく、筑波大学で特殊な手順等はありません。 以下のサイト等を参照して、まずはインストールまで進めてください。

日本語の情報

学術認証フェデレーション(学認): 貴学にてSPをインストールする場合の構築手順

英語の情報

ShibbolethコンソーシアムInstallationドキュメントページにLinux, Windows, macOSでのインストール手順が記載されています。

Linux: https://wiki.shibboleth.net/confluence/display/SP3/LinuxInstall

Windows: https://wiki.shibboleth.net/confluence/display/SP3/Install+on+Windows

macOS: https://wiki.shibboleth.net/confluence/display/SP3/MacInstall

サーバ構築にあたっての注意点

SPとIdPの時刻が約5分以上ずれると、SPが正しく設定されていても認証に必ず失敗するようになりますので、本学のNTPサーバとの時刻同期の設定は忘れずに行うようにしてください。

SPのインストールが終わったら、設定を行います。

メタデータの準備

SPを利用するためには、IdP-SP間の通信の際に必要となる、メタデータと呼ばれる情報を作成してIdPに登録する必要があります。

メタデータの作成には以下の2つの情報が必要となります。

  • Webアプリを動かすサーバのホスト名(FQDN)
  • 上記ホスト名のサーバ用のSSL証明書

SSL証明書の準備

SSL証明書の入手がまだの場合、センターのサーバ証明書発行サービスなどを利用して、まずサーバ証明書を入手してください。

入手した証明書と鍵はSPでも利用しますので、それぞれsp-cert.pem, sp-key.pemというファイル名で以下のような所有者、パーミッションで保存してください。

-rw-r--r--. 1 shibd shibd 1371  4月  1  2019 /etc/shibboleth/sp-cert.pem
-rw-------. 1 shibd shibd  887  4月  1  2019 /etc/shibboleth/sp-key.pem

準備ができたら、SPの設定ファイルが置かれているディレクトリ(/etc/shibboleth など)にメタデータ作成用のbashスクリプト(metagen.sh)があるので、これを使ってメタデータを作成します。

# cd /etc/shibboleth
# ./metagen.sh -2L -c /etc/shibboleth/sp-cert.pem -h [SPホスト名] > sp-metadata.xml

これで、sp-metadata.xmlという名前で以下のような内容で始まるメタデータが作成されます。

<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" entityID="https://[ホスト名]/shibboleth">
  <md:SPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
    <md:KeyDescriptor>
      <ds:KeyInfo>
        <ds:X509Data>
          <ds:X509Certificate>
[SSL証明書]
(以下略)

ここまで完了したら、作成したメタデータを添付してSPの登録申請を行っておくと、センターでの審査・登録待ちと並行して残りの設定作業を行うことができます。

SPの設定

次に、SPの設定を行います。基本的には設定ファイルが置かれたディレクトリ(/etc/shibboleth など)にある、以下2つの設定ファイルの修正のみとなります。

shibboleth2.xml

Shibboleth SPの中心的な設定ファイルです。

まず、設定ファイルが置かれたディレクトリ(/etc/shibboleth など)に移動して、shibboleth2.xml.dist を shibboleth2.xml にコピーします。

# cd /etc/shibboleth
# cp shibboleth2.xml.dist shibboleth2.xml

次にshibboleth2.xmlをエディタで開いて以下の箇所を修正します。 (修正箇所前後のコメントは、配布パッケージによって異なっていることがあります。)

‘ApplicationDefaults’の’entityID’を修正

メタデータの準備で作成したメタデータの1行目にあるentityIDをコピーします。

    <!-- The ApplicationDefaults element is where most of Shibboleth's SAML bits are defined. -->
    <ApplicationDefaults entityID="[ここにentityIDをコピー]"
        REMOTE_USER="eppn subject-id pairwise-id persistent-id"

デフォルトIdPの設定

    <!--
    Configures SSO for a default IdP. To properly allow for >1 IdP, remove
    entityID property and adjust discoveryURL to point to discovery service.
    You can also override entityID on /Login query string, or in RequestMap/htaccess.
    -->
    <!-- [以下の4行は削除してください]
    <SSO entityID="https://idp.example.org/idp/shibboleth"
         discoveryProtocol="SAMLDS" discoveryURL="https://ds.example.org/DS/WAYF">
      SAML2
    </SSO>
    [ここまで削除] -->
    <SSO entityID="https://idp-test.account.tsukuba.ac.jp/idp/shibboleth">
      SAML2
    </SSO>

筑波大学IdPのメタデータ取得・更新用設定の追加

    <!-- Example of remotely supplied batch of signed metadata. -->
    <!-- Tsukuba test IdP metadata -->
    <MetadataProvider type="XML" url="https://idp-test.account.tsukuba.ac.jp/idp-metadata.xml"
        backingFilePath="tsukuba-test-idp.xml" reloadInterval="900" />

    <!-- Tsukuba production IdP metadata -->
    <!--
    <MetadataProvider type="XML" url="https://idp.account.tsukuba.ac.jp/idp-metadata.xml"
        backingFilePath="tsukuba-idp.xml" reloadInterval="900" />
    -->

SSL証明書の設定

記述されているCredentialResolverタグをコメントアウトして1つのSSL証明書で署名(“signing”)と暗号化(“encryption”)を行う設定を追加します。署名と暗号化で証明書を分ける場合、メタデータにも署名用と暗号化用の証明書を記載する必要があります。

SSL証明書のファイル名を別の名前にしていたり、/etc/shibboleth以下に置いていない場合はフルパスに書き換えてください。

    <!-- Simple file-based resolvers for separate signing/encryption keys. -->
    <!-- [ここからコメントアウト]
    <CredentialResolver type="File" use="signing"
        key="sp-signing-key.pem" certificate="sp-signing-cert.pem"/>
    <CredentialResolver type="File" use="encryption"
        key="sp-encrypt-key.pem" certificate="sp-encrypt-cert.pem"/>
    [ここまでコメントアウト] -->
    <CredentialResolver type="File" key="sp-key.pem" certificate="sp-cert.pem"/>

attribute-map.xml

IdPから渡された属性をWebアプリへと渡す際の対応(マッピング)を設定するファイルです。

このファイルにマッピングを記述しただけではIdPから提供可能な属性に記載されている標準の属性と、登録申請で追加申請した属性以外は提供されませんので、注意してください。

まず、設定ファイルが置かれたディレクトリ(/etc/shibboleth など)に移動して、attribute-map.xml.dist を attribute-map.xml にコピーします。

# cd /etc/shibboleth
# cp attribute-map.xml.dist attribute-map.xml

サンプルファイルでは、IdPから提供される属性情報のうち、”persistent-id”、”affiliation”、”eppn”、”entitlement”の4つの要素については設定が有効になっています。このうち、”eppn”と”entitlement”属性については、IdP側からデフォルトでは提供されないので、利用を希望する場合は登録申請の際に申し込みが必要です。

“unscoped-affiliation”、”o” および “mail” 属性については、コメントアウトされているので、以下のように利用したい属性の前後に”–>”, “<!–“という行を追加してコメントを外した上で、登録申請する必要があります。1つの属性につき設定が2行ずつあるので注意してください。

    <!-- Older LDAP-defined attributes (SAML 2.0 names followed by SAML 1 names)... -->
    <!--
    <Attribute name="urn:oid:2.5.4.3" id="cn"/>
      :
    <Attribute name="urn:oid:2.5.4.7" id="l"/>
    [追加] -->
    <Attribute name="urn:oid:2.5.4.10" id="o"/>
    <!-- [追加]
    <Attribute name="urn:oid:2.5.4.11" id="ou"/>
      :
    <Attribute name="urn:mace:dir:attribute-def:l" id="l"/>
    [追加] -->
    <Attribute name="urn:mace:dir:attribute-def:o" id="o"/>
    <!-- [追加]
    <Attribute name="urn:mace:dir:attribute-def:ou" id="ou"/>

さらに、日本語の”jao”、”jaou”および”jaDisplayName”属性については記述がないので、必要に応じて以下の設定を追加した上で、登録申請します。

    <!-- jao -->
    <Attribute name="urn:mace:dir:attribute-def:jao" id="jao"/>
    <Attribute name="urn:oid:1.3.6.1.4.1.32264.1.1.4" id="jao"/>

    <!-- jaou -->
    <Attribute name="urn:mace:dir:attribute-def:jaou" id="jaou"/>
    <Attribute name="urn:oid:1.3.6.1.4.1.32264.1.1.5" id="jaou"/>

    <!-- jaDisplayName -->
    <Attribute name="urn:mace:dir:attribute-def:jaDisplayName" id="jaDisplayName"/>
    <Attribute name="urn:oid:1.3.6.1.4.1.32264.1.1.3" id="jaDisplayName"/>

SPの起動と有効化

設定が終わったらSPを起動します。

# systemctl start shibd

/var/log/shibboleth/shibd.logを見て、エラー等が出ていないか確認します。

2019-07-01 13:08:01 INFO XMLTooling.Config : xmltooling 3.0.4 library initialization complete
2019-07-01 13:08:01 INFO OpenSAML.Config : opensaml 3.0.1 library initialization complete
2019-07-01 13:08:01 INFO Shibboleth.Config : shibboleth 3.0.4 library initialization complete
2019-07-01 13:08:01 INFO Shibboleth.Config : loaded XML resource (/usr/local/etc/shibboleth/shibboleth2.xml)
2019-07-01 13:08:01 INFO Shibboleth.Config : Shibboleth SP Version 3.0.4
  :
2019-07-01 13:08:01 INFO Shibboleth.AttributeExtractor.XML : creating mapping for Attribute urn:oid:1.3.6.1.4.1.5923.1.1.1.6
2019-07-01 13:08:01 INFO Shibboleth.AttributeExtractor.XML : creating mapping for Attribute urn:mace:dir:attribute-def:eduPersonPrincipalName
2019-07-01 13:08:01 INFO Shibboleth.AttributeExtractor.XML : creating mapping for Attribute urn:oid:1.3.6.1.4.1.5923.1.1.1.1
2019-07-01 13:08:01 INFO Shibboleth.AttributeExtractor.XML : creating mapping for Attribute urn:mace:dir:attribute-def:eduPersonAffiliation
  :
2019-07-01 13:08:01 INFO Shibboleth.Listener : listener service starting

最後の’listener service starting’という行が記録されていれば、shibdの起動には成功しています。

途中に設定したmappingも記録されますので、申請した追加属性も含めた全てのマッピングが記録されているか確認してください。

ログが上記のパスにない場合、出力先のファイル名は/etc/shibboleth/shibd.loggerに記述されています。

log4j.appender.shibd_log.fileName=/var/log/shibboleth/shibd.log

ログを確認して問題がなければ、サーバの再起動時に自動的にshibdが起動するようにサービスを有効化します。

# systemctl enable shibd