SimpleSAMLphpを利用してSAML認証をセットアップする手順 #2
この記事では、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]
'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のメタデータが表示された様子
「SAML 2.0 用のメタデータXMLフォーマット」をコピーしておきます。
SPでメタデータをパースして登録する
SP側で【連携】タブから【XML を SimpleSAMLphpメタデータに変換】を実行します。
【XMLメタデータ】テキストエリアにコピーしておいたIdPのメタデータをペーストして【パース】を実行すると、SimpleSAMLphpメタデータが得られます。
IdPのメタデータをSPでパースした様子
画面に示された saml20-idp-remote
がSPサーバ側で変更するファイルを示しています。
SPサーバで metadata/saml20-idp-remote.php
にSimpleSAMLphpメタデータを貼り付けます。以下はその先頭部分です。
<?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でパースした様子
画面に示された saml20-sp-remote
がIdPサーバ側で変更するファイルを示しています。
IdPサーバで metadata/saml20-sp-remote.php
にSimpleSAMLphpメタデータを貼り付けます。以下はその先頭部分です。
<?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を信頼している様子
SPがIdPを信頼している様子
動作確認
SP側で【認証】タブから【設定されている認証元をテスト】を実行し、動作確認しましょう。
表示される【admin】と【default-sp】から【default-sp】を押します。
さらに「アイデンティティプロバイダを選択してください」と表示されるので、一つしかありませんが【選択】します。
IdPを選択する様子
あとはユーザー名「student」とパスワード「studentpass」を入力すれば認証できるはずです。
リダイレクトされた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に処理が戻った様子
おわりに
SimpleSAMLphpを利用してSAML認証をセットアップする手順について紹介しました。どなたかのお役に立てば幸いです。
Discussion