SimpleSAMLphpを使ってSPとテスト用IdP(Shibboleth)を構築する。
Shibbolethによる学術認証フェデレーションへの要参加するシステム構築で、SAMLでシングルサインオンをする必要が出てきました。
検証用にIdentity Providers(IdP)を用意する必要があり、OpenAMとかいろいろ漁ったところ、サクッと検証サーバ立てるのに、SimpleSAMLphpが一番手っ取り早かった。spもSimpleSAMLphpを利用します。
以下、インストール設定メモです。
idp,spとも同一サーバ上で動作させることができますが、分かりやすいようにサーバを分けました。
(※一度インストール~動作まで理解できれば同一サーバでも導入はすごく簡単です。)
・apache,phpは導入済みを前提とします。
・ホストのFQDNが正しく表示されること。
【確認環境】
—————————————————-
1.iDP (ユーザ認証サーバ)
FQDN:idp.sco.jp
https://idp.sco.jp
CentOS 7.2.1511
apache 2.4.6
php 5.4
simplesamlphp-1.14.9
—————————————————-
2.SP (ユーザ認証要求)
FQDN:sp.starserv.ne.jp
http://sp.starserv.ne.jp
RedHat 6.8
httpd-2.2
php 5.6
simplesamlphp-1.14.9
—————————————————-
【目標】
http://sp.starserv.ne.jpからSAMLでシングルサインオンできること。
【インストール】
1.iDP
https://simplesamlphp.org/docs/stable/simplesamlphp-install
を参考にします。
simplesamlphp-1.14.9.tar.gzをダウンロードし/var/simplesamlphp に展開する。
Apacheの設定で
Alias /simplesaml /var/simplesamlphp/www
を追加する。
今回は、httpsで動かします。(httpでも問題ありません。)
https://idp.sco.jp/simplesaml/
■iDPの設定
/var/simplesamlphp/config/config.php
・admin ユーザのログインパスワード123から変更
[js] ‘auth.adminpassword’ => ‘1234567890’,[/js]
※パスワードは暗号化できますが、とりあえずplainで。
・管理者(admin)でログインできるか確認。
・idpモジュールの有効化
[js] ‘enable.saml20-idp’ => true,‘enable.shib13-idp’ => true,
[/js]
※enable.saml20-idpは今回使わないので、falseでいいですが実験のためこれも有効にしました。
SimpleSAMLphp設定ページで有効になっているか確認します。
・認証方法を設定
ユーザ属性データは、exampleauthを使うことにし、
authsources.phpに記載します。(LDAPとかいろんなDBが利用できますがここはパス)
まずは有効化設定(enableファイルを作成する。)
touch /var/simplesamlphp/modules/exampleauth/enable
ID=user1 password=test1
ID=user2 password=test2
の2ユーザ作成
/var/simplesamlphp/config/authsources.php
‘exampleauth:UserPass’,
‘user1:test1’ => array(
‘uid’ => array(‘user1’),
‘eduPersonAffiliation’ => array(‘member’, ‘developer’),
),
‘user2:test2’ => array(
‘uid’ => array(‘user2’),
‘eduPersonAffiliation’ => array(‘member’, ‘admin’),
),
), [/js]
・自己証明書を作成
/var/simplesamlphp/certフォルダーに、server.crt、server.pemを作成します。
cd /var/simplesamlphp/cert
openssl req -newkey rsa:2048 -new -x509 -days 3652 -nodes -out server.crt -keyout server.crt
/var/simplesamlphp/metadata/saml20-idp-hosted.php
[js] ‘privatekey’ => ‘server.pem’,‘certificate’ => ‘server.crt’,
[/js]
/var/simplesamlphp/metadata/shib13-idp-hosted.php
[js] ‘privatekey’ => ‘server.pem’,‘certificate’ => ‘server.crt’,
[/js]
iDPの設定は一旦ここまで、後で「連携」でメタデータをSPと相互に信頼設定する必要があります。
■SPの設定
iDPの設定と同じように、simplesamlを設置します。
http://sp.starserv.ne.jp/simplesaml
iDPは動作させません。SPとして使います。
/var/simplesamlphp/config/config.php
[/js]
※パスワードは暗号化できますが、とりあえずplainで。
・管理者(admin)でログインできるか確認。
・自己証明書を作成
/var/simplesamlphp/certフォルダーに、server.crt、server.pemを作成します。
・動作確認のため、デバッグモードにする。
‘debug’ => true,
‘showerrors’ => true,
‘errorreporting’ => true,
‘logging.level’ => LOG_DEBUG,
‘logging.handler’ => ‘file’,
[/js]
・iDPの指定
/var/simplesamlphp/config/authsources.php
‘saml:SP’,
.
.
.
‘idp’ => ‘https://idp.sco.jp/simplesaml/shib13/idp/metadata.php’,
[/js]
idp’がNULLの場合はログイン画面の前にiDP選択画面が出てくるので、明示的に指定する。
・メタデータの設定
■iDP側 https://idp.sco.jp/simplesaml
SP側のSimpleSAMLphp設定ページ‐「連携」で、
default-sp「メタデータを表示」をクリックして、表示されたメタデータXMLをクリップボードにコピーする。
iDP側のSimpleSAMLphp設定ページ‐「連携」-XML を 「SimpleSAMLphpメタデータに変換」を
クリックし、貼り付けて「パース」する。
php用にコンバート表示されます。
shib13-sp-remote、saml20-sp-remoteの2つ。
表示された内容の、$metadata以下を
/var/simplesamlphp/metadata/saml20-sp-remote.php
/var/simplesamlphp/metadata/shib13-sp-remote.php
に記載します。上手くいけば、下記のようにSPが連携登録されます。
■SP側 http://sp.starserv.ne.jp/simplesaml
iDP側のSimpleSAMLphp設定ページ‐「連携」で、
SAML 2.0 IdPメタデータ「メタデータを表示」をクリックして、表示されたメタデータXMLをクリップボードにコピーする。
SP側のSimpleSAMLphp設定ページ‐「連携」-XML を 「SimpleSAMLphpメタデータに変換」をクリックし、貼り付けて「パース」する。
php用にコンバート表示されます。
saml20-idp-remoteの1つ。
表示された内容の、$metadata以下を
/var/simplesamlphp/metadata/saml20-idp-remote.php
に記載します。
同じ作業を
Shib 1.3 IdPメタデータについて行う。
/var/simplesamlphp/metadata/shib13-idp-remote.php
●連携の確認1
SP側 http://sp.starserv.ne.jp/simplesaml – 「認証」タブ
「設定されている認証元をテスト」
default-spをクリック
ログイン画面が表示されます。
user1:test1
user2:test2
でログインできればOK
●連携の確認2
最後にテストアプリからログインを試します。これができれば目的達成です。
サンプルプログラム
index.php
require_once(‘/var/simplesamlphp/lib/_autoload.php’);
$as = new SimpleSAML_Auth_Simple(‘default-sp’);
$as->requireAuth();
$attributes = $as->getAttributes();
?>
<div style="font-weight: bold;">Hello, SimpleSAMLphp</div>
<table border="1">
<?php foreach ($attributes as $key => $value): ?>
<tr>
<td><?=$key;?></td>
<td><?=$value[0];?></td>
<td><?=$value[1];?></td>
</tr>
<?php endforeach;?>
</table>
<a href="logout.php">logout</a>
[/js]
logout.php
[js] <?require_once(‘/var/simplesamlphp/lib/_autoload.php’);
$as = new SimpleSAML_Auth_Simple(‘default-sp’);
$as->requireAuth();
$attributes = $as->getAttributes();
$as->logout(‘http://sp.starserv.ne.jp/logout.html’);
?>
logout.html
[js] <html><body>
END
</body>
</html>
[/js]
http://sp.starserv.ne.jp/index.php アクセス
自動的にログイン認証画面が出ます。(実際ここは、学術認証IDP画面だったり、それぞれ接続先のログイン画面となります。)
—動作ログ—
/var/log/simplesaml/simplesamlphp.log
Nov 30 18:43:51 simplesamlphp DEBUG [f138141d33] Session: doLogin(“default-sp”)
Nov 30 18:43:51 simplesamlphp DEBUG [f138141d33] Received SAML1 response
Nov 30 18:43:51 simplesamlphp DEBUG [f138141d33] Loading state: ‘_34d95aa9e4b6b8c2488713e94cd808da3658b6fb79:http://sp.starserv.ne.jp/simplesaml/module.php/core/as_login.php?AuthId=default-sp&ReturnTo=http%3A%2F%2Fsp.starserv.ne.jp%2F’
Nov 30 18:45:20 simplesamlphp DEBUG [f138141d33] Session: Valid session found with ‘default-sp’.
Nov 30 18:45:20 simplesamlphp DEBUG [f138141d33] Session: Valid session found with ‘default-sp’.
Nov 30 18:45:20 simplesamlphp DEBUG [f138141d33] Session: doLogout(‘default-sp’)
Nov 30 18:45:20 simplesamlphp DEBUG [f138141d33] Session: ‘default-sp’ not valid because we are not authenticated.