🔑

SimpleSAMLphpを利用してSAML認証をセットアップする手順 #2

2022/06/19に公開

この記事では、SimpleSAMLphpを利用してSAML認証をセットアップする手順について紹介します。

今回はIdPとSPの間で信頼関係を結び、さらにSPで認証できることを確かめます。

秘密鍵と自己署名証明書

はじめにIdPとSPそれぞれで秘密鍵と自己署名証明書を作ります。

IdPで秘密鍵と自己署名証明書を作る

IdPサーバで秘密鍵と自己署名証明書を作りましょう。

コマンドとしては次のような感じです。

cd /var/www/simplesamlphp/cert/
sudo openssl req -newkey rsa:3072 -new -x509 -days 3652 -nodes -out server.crt -keyout server.pem -subj "/CN=idp.local"

SPで秘密鍵と自己署名証明書を作る

SPサーバでも同様に秘密鍵と自己署名証明書を作ります。

cd /var/www/simplesamlphp/cert/
sudo openssl req -newkey rsa:3072 -new -x509 -days 3652 -nodes -out server.crt -keyout server.pem -subj "/CN=sp.local"

また、次のような感じで設定ファイルに2行追加します。[1]

config/authsources.php
    'default-sp' => [
        'saml:SP',
+       'privatekey' => 'server.pem',
+       'certificate' => 'server.crt',

IdPとSPの連携

前回の動作確認で表示したWebインターフェースで【連携】タブを表示すると、「メタデータ」という項目が見えるはずです。

IdPとSPの間でこのメタデータを交換することで、認証の連携ができるようになります。[2]

IdPのメタデータをSPに登録する

最初にIdPのメタデータをSPに登録します。ブラウザとターミナルを行ったり来たりして面倒ですが、作業自体は特に難しくはありません。落ち着いて進めましょう。

IdPのメタデータをコピーする

IdP側で【連携】タブから「SAML 2.0 IdPメタデータ」の【メタデータを表示】を押します。

次のようにメタデータが表示されるので

IdPのメタデータが表示された様子
IdPのメタデータが表示された様子

「SAML 2.0 用のメタデータXMLフォーマット」をコピーしておきます。

SPでメタデータをパースして登録する

SP側で【連携】タブから【XML を SimpleSAMLphpメタデータに変換】を実行します。

【XMLメタデータ】テキストエリアにコピーしておいたIdPのメタデータをペーストして【パース】を実行すると、SimpleSAMLphpメタデータが得られます。

IdPのメタデータをSPでパースした様子
IdPのメタデータをSPでパースした様子

画面に示された saml20-idp-remote がSPサーバ側で変更するファイルを示しています。

SPサーバで metadata/saml20-idp-remote.php にSimpleSAMLphpメタデータを貼り付けます。以下はその先頭部分です。

metadata/saml20-idp-remote.php
<?php

/**
 * SAML 2.0 remote IdP metadata for SimpleSAMLphp.
 *
 * Remember to remove the IdPs you don't use from this file.
 *
 * See: https://simplesamlphp.org/docs/stable/simplesamlphp-reference-idp-remote
 */

$metadata['https://idp.local/simplesaml/saml2/idp/metadata.php'] = [
    'entityid' => 'https://idp.local/simplesaml/saml2/idp/metadata.php',
以下略

SPのメタデータをIdPに登録する

続いてSPのメタデータをIdPに登録します。

SPのメタデータをコピーする

SP側で【連携】タブからdefault-spの【メタデータを表示】します。

表示される「SAML 2.0 用のメタデータXMLフォーマット」をコピーしておきます。

IdPでメタデータをパースして登録する

IdP側で【連携】タブから【XML を SimpleSAMLphpメタデータに変換】を実行します。

【XMLメタデータ】テキストエリアにコピーしておいたSPのメタデータをペーストして【パース】を実行すると、SimpleSAMLphpメタデータが得られます。

SPのメタデータをIdPでパースした様子
SPのメタデータをIdPでパースした様子

画面に示された saml20-sp-remote がIdPサーバ側で変更するファイルを示しています。

IdPサーバで metadata/saml20-sp-remote.php にSimpleSAMLphpメタデータを貼り付けます。以下はその先頭部分です。

metadata/saml20-sp-remote.php
<?php

/**
 * SAML 2.0 remote SP metadata for SimpleSAMLphp.
 *
 * See: https://simplesamlphp.org/docs/stable/simplesamlphp-reference-sp-remote
 */

$metadata['https://sp.local/simplesaml/module.php/saml/sp/metadata.php/default-sp'] = [
    'entityid' => 'https://sp.local/simplesaml/module.php/saml/sp/metadata.php/default-sp',
以下略

信頼関係の確認

改めてIdPとSPで【連携】タブを表示すると、次のように信頼関係を確認できるはずです。

IdPがSPを信頼している様子
IdPがSPを信頼している様子

SPがIdPを信頼している様子
SPがIdPを信頼している様子

動作確認

SP側で【認証】タブから【設定されている認証元をテスト】を実行し、動作確認しましょう。

表示される【admin】と【default-sp】から【default-sp】を押します。

さらに「アイデンティティプロバイダを選択してください」と表示されるので、一つしかありませんが【選択】します。

IdPを選択する様子
IdPを選択する様子

あとはユーザー名「student」とパスワード「studentpass」を入力すれば認証できるはずです。

リダイレクトされたIdPで認証する様子
リダイレクトされたIdPで認証する様子

エラーが起きた時は

上記の認証を実行したタイミングで「未処理例外」のエラーが起きるかも知れません。

私の環境ではデバッグ情報に Caused by: SimpleSAML\Error\Exception: Unable to load private key from file "/var/www/simplesamlphp/cert/server.pem" というメッセージを含むエラーが表示されました。

秘密鍵のファイルを読み込めなかったことが原因の例外のようですから、IdPサーバで次のようにしてパーミッションを変更します。

sudo chmod 644 /var/www/simplesamlphp/cert/server.pem

もう一度SP側から同じように認証すると今度はうまくいきました。

リダイレクトされたIdPの認証をパスし、SPに処理が戻った様子
リダイレクトされたIdPの認証をパスし、SPに処理が戻った様子

おわりに

SimpleSAMLphpを利用してSAML認証をセットアップする手順について紹介しました。どなたかのお役に立てば幸いです。

脚注
  1. IdPでは設定ファイルを変更していませんが、それは metadata/saml20-idp-hosted.phpprivatekeycertificate の設定が書いてあるためです。 ↩︎

  2. 途中、SimpleSAMLphpの管理者パスワードが求められます。設定したパスワードを入力しましょう。 ↩︎

Discussion