SimpleSAMLphp のdefault-spをOpenIdPと連携させるテスト @ CentOS
諸事情でSSO (Single Sign On) に興味が湧いたのです。まずとっかかりということで、表題の通りの非常に簡単なセットアップ部分のメモを書きます。
まず環境です。
# SAMLってだけであればローカル環境からのPullリクエストだけで行けるかと思ったんですよ!
ちなみにここでのメモはUbuntu環境ではあまり役に立ちません。パッケージがすでにあり (Ubuntu 12.04.01 LTS) 、設定ファイル等の位置がマニュアルでインストールした場合と大分違います。
○ 参考にした資料
以降少し参照します。正しくない記述が若干混じっている気もします (特に2つめ)
やっといてください。今回は自己振り出し「でない」ちゃんとした証明書が偶然入ってるホストでやりました
1. PHP入れる
こっから始めたのでここも書きます。
出来ればここでphpが動くテストをしておきましょう。PHP設定環境構築の記事は腐ってるものも含めてたくさんあるので省略
2. /opt 下にSimpleSAMLphpを入れる
CentOSの今回の環境ではパッケージが見つからなかったので本家からダウンロードしました。
対象のディレクトリに対してchown apache:apacheをしてありますが、必要かはわかりません。
3. SimpleSAMLphp の設定を変更
標準設定では動くにしてもまずいところがある (特にデフォルトパスワード) ので、直します。あと、今回はSPとして動かすのでその設定もしてみます。
# Ubuntuではパスワード周りが別ファイルになっていました。
/opt/(simplesamlphp)/config/config.php を修正します。
4. /etc/httpd/ 下のどこかにSimpleSAMLphp向けの設定を書く
httpd (apache2) /opt/simplesamlphp-1.10.0/ を参照しないと外から見えません。その設定を書きます。
一番楽なのは conf.d/ssl.conf の </VirtualHost> 前に設定を書くことだとは思いますが、本当は別のファイルを作ったほうが後々メンテしやすいかもしれません。
# ちなみにそうしなかったのはVirtualHost外に書く場合にhttpsでのみsimplesamlphpディレクトリを読ませる方法がよーわからんかった、という一点に尽きます。今回に限って言えば本質的なところではありません
-Indexesがなかった場合に https://(host)/simplesamlphp/ にアクセスしてもindex.phpを読みに行ってくれなかったので書いてあります。必須かどうかはわかりません
5. サンプルページを表示し、Adminでログイン。正しく動作してるか確認
設定がうまく出来ていれば、https://(host)/simplesamlphp にアクセスしたときに勝手にリダイレクトされてhttps://(host)/simplesamlphp/module.php/core/frontpage_welcome.php が開かれます。
ここでWelcomeの画面上から管理者ログインをします。パスワードはさきほどconfig.phpに書いたものを使います。
うまくログインできたら、Configuration (設定) タブをクリックして、以下のような画面からPHPの動作状況を確認します。
もしRequired (必須) の何かが抜けていると、親切な警告もなしにSimpleSAMLphpがエラー出して動かなくなります。
やや蛇足ですが、上記のページにある"Sanity check of your simpleSAMLphp setup" は初期状態ではクリックしてもsanity checkをしてくれません。modules/sanitycheck/config-templates/config-sanitycheck.php を config/ 下にコピーすれば動きました (モジュールがenableされてることも確認してください。default-enableというファイルがモジュールのディレクトリにあればOK。なければenableという空ファイルをそこに)
5. SPと登録するIdPの設定をする
ここまでで SimpleSAMLphp 自体が動いているという確認が出来たあと、SPとIdPの設定をします。
今回の記事では、SPは自分自身、IdPはOpenIdPです。
SimpleSAMLphpはOpenIdPがどこの何なのか知らなければならず、OpenIdPは自分を使うSPのメタデータを受け取っていなければなりません。つまり両方に設定が必要です。
ここからは本家のドキュメントの通りで十分なので、そちらを主に参照して設定しましょう。以下、本家だけだとよくわからなかったところをランダムにメモります。
○ metadata/ と metadata-templates/ は基本同じファイルが入っている。metadata/を使う
見た限りではmetadata/ディレクトリにテンプレートとなるファイルがほぼ入っています (後述する saml20-sp-hosted.php はない)
metadata/ 内のファイルを書き換え、間違ったと思ったらmetadata-templates/ からコピって復元する、的な方法で良い気がします。
# Ubuntu だとDebian/Ubuntu的な流儀で設定ファイルが分散しており、metadataに関しては /etc/metadata/ と /usr/share/doc/simplesamlphp/examples/metadata-templates/ に分かれています。/etc/metadata/ には最初何もないように見えました。
○ saml20-sp-hosted.php なんてファイルは最初はない
このファイルは作る必要がありました。こちらを参考にしています。
このファイルのパーミッションにも注意しましょう。
○ OpenIdPにメタデータを登録するときに……
SimpelSAMLphp のFederation (連携) タブからEntityID としてhttps://(host)/simplesamlphp/module.php/saml/sp/metadata.php/default-sp のようなものをコピーし、OpenIdP側に登録します。
なお、ここで登録する上記のEntityIDに対して自分でアクセスしてみて、ただしくXMLがダウンロードされることを確認しておくと良いかと思います。既に若干述べましたが、XML DOMがインストールされていない状態でこれをやると単にエラーがでてSimpleSAMLphpが正しく動作しません。
6. 連携できることを確認
本家のページ の5のとおりです。
まず環境です。
- 作業日: 2012-11-03
- さくらのVPS上
- CentOS release 6.3 (Final)
- simplesamlphp-1.10.0
# SAMLってだけであればローカル環境からのPullリクエストだけで行けるかと思ったんですよ!
ちなみにここでのメモはUbuntu環境ではあまり役に立ちません。パッケージがすでにあり (Ubuntu 12.04.01 LTS) 、設定ファイル等の位置がマニュアルでインストールした場合と大分違います。
○ 参考にした資料
以降少し参照します。正しくない記述が若干混じっている気もします (特に2つめ)
- http://simplesamlphp.org/docs/stable/simplesamlphp-sp
- これが一番重要
- http://www.edugate.ie/drupal-6.6/?q=SimpleSAMLphp1.3-Install-Ubuntu
- 参考にはなるが割と地雷。Ubuntuではパッケージが既に手に入ります。マニュアルインストールの必要はありません。
- https://openidp.feide.no/
- OpenIdP 本家。メアド一つで作れるので、アカウントを作っておきましょう
やっといてください。今回は自己振り出し「でない」ちゃんとした証明書が偶然入ってるホストでやりました
1. PHP入れる
こっから始めたのでここも書きます。
- yumでphp, php-mbstring, php-domxml-php4-php5 をインストール
php-mbstringが必要かははっきりしません。SimpleSAMLphpはDOM XMLも使えないとだめなのでphp-domxml-php4-php5も入れます。
出来ればここでphpが動くテストをしておきましょう。PHP設定環境構築の記事は腐ってるものも含めてたくさんあるので省略
2. /opt 下にSimpleSAMLphpを入れる
CentOSの今回の環境ではパッケージが見つからなかったので本家からダウンロードしました。
対象のディレクトリに対してchown apache:apacheをしてありますが、必要かはわかりません。
3. SimpleSAMLphp の設定を変更
標準設定では動くにしてもまずいところがある (特にデフォルトパスワード) ので、直します。あと、今回はSPとして動かすのでその設定もしてみます。
# Ubuntuではパスワード周りが別ファイルになっていました。
/opt/(simplesamlphp)/config/config.php を修正します。
- http://(host)/simplesamlphp にしたいなら baseurlpath を直す
- デフォルトでは simplsaml
- adminpasswordを直す
- secretsalt を生成する (生成の仕方はコメントに書いてあるはず)
- enable.saml20-sp の行を「追加」して true (他のサイトだとあるように書いてあるのだけど見つからなかった)
- 必要ないかもしんない
- ログの設定など、したければ
インストール直後の時点でconfig.phpのコメントは十分丁寧なので、眺める価値がある気がします。
なお、全力の平文でパスワードが書かれるので、その他のread権限は剥奪しておいた方が吉かもしれませんね。
httpd (apache2) /opt/simplesamlphp-1.10.0/ を参照しないと外から見えません。その設定を書きます。
一番楽なのは conf.d/ssl.conf の </VirtualHost> 前に設定を書くことだとは思いますが、本当は別のファイルを作ったほうが後々メンテしやすいかもしれません。
# ちなみにそうしなかったのはVirtualHost外に書く場合にhttpsでのみsimplesamlphpディレクトリを読ませる方法がよーわからんかった、という一点に尽きます。今回に限って言えば本質的なところではありません
Alias /simplesamlphp/ /opt/simplesamlphp-1.10.0/www/
<Directory "/opt/simplesamlphp-1.10.0/www/">
Order allow,deny
Allow from all
Options -Indexes
</Directory>
-Indexesがなかった場合に https://(host)/simplesamlphp/ にアクセスしてもindex.phpを読みに行ってくれなかったので書いてあります。必須かどうかはわかりません
5. サンプルページを表示し、Adminでログイン。正しく動作してるか確認
設定がうまく出来ていれば、https://(host)/simplesamlphp にアクセスしたときに勝手にリダイレクトされてhttps://(host)/simplesamlphp/module.php/core/frontpage_welcome.php が開かれます。
ここでWelcomeの画面上から管理者ログインをします。パスワードはさきほどconfig.phpに書いたものを使います。
うまくログインできたら、Configuration (設定) タブをクリックして、以下のような画面からPHPの動作状況を確認します。
もしRequired (必須) の何かが抜けていると、親切な警告もなしにSimpleSAMLphpがエラー出して動かなくなります。
やや蛇足ですが、上記のページにある"Sanity check of your simpleSAMLphp setup" は初期状態ではクリックしてもsanity checkをしてくれません。modules/sanitycheck/config-templates/config-sanitycheck.php を config/ 下にコピーすれば動きました (モジュールがenableされてることも確認してください。default-enableというファイルがモジュールのディレクトリにあればOK。なければenableという空ファイルをそこに)
5. SPと登録するIdPの設定をする
ここまでで SimpleSAMLphp 自体が動いているという確認が出来たあと、SPとIdPの設定をします。
今回の記事では、SPは自分自身、IdPはOpenIdPです。
SimpleSAMLphpはOpenIdPがどこの何なのか知らなければならず、OpenIdPは自分を使うSPのメタデータを受け取っていなければなりません。つまり両方に設定が必要です。
ここからは本家のドキュメントの通りで十分なので、そちらを主に参照して設定しましょう。以下、本家だけだとよくわからなかったところをランダムにメモります。
○ metadata/ と metadata-templates/ は基本同じファイルが入っている。metadata/を使う
見た限りではmetadata/ディレクトリにテンプレートとなるファイルがほぼ入っています (後述する saml20-sp-hosted.php はない)
metadata/ 内のファイルを書き換え、間違ったと思ったらmetadata-templates/ からコピって復元する、的な方法で良い気がします。
# Ubuntu だとDebian/Ubuntu的な流儀で設定ファイルが分散しており、metadataに関しては /etc/metadata/ と /usr/share/doc/simplesamlphp/examples/metadata-templates/ に分かれています。/etc/metadata/ には最初何もないように見えました。
○ saml20-sp-hosted.php なんてファイルは最初はない
このファイルは作る必要がありました。こちらを参考にしています。
<?php
$metadata = array(
'https://YOUR_HOST/simplesaml' => array(
'host' => 'YOUR_HOST',
'certificate' => 'YOUR_HOST.crt',
'privatekey' => 'YOUR_HOST.key',
'redirect.sign' => 'TRUE',
'redirect.validate' => 'TRUE',
'privatekey_pass' => 'MySSLCertKeyPassword',
)
);
?>
このファイルのパーミッションにも注意しましょう。
○ OpenIdPにメタデータを登録するときに……
SimpelSAMLphp のFederation (連携) タブからEntityID としてhttps://(host)/simplesamlphp/module.php/saml/sp/metadata.php/default-sp のようなものをコピーし、OpenIdP側に登録します。
You need to login with an OpenIdP account to authenticate (you can create a new account if you do not have one already). Next, click the link 'Add from SAML 2.0 XML metadata', and paste in your SAML 2.0 XML Metadata. After clicking the 'Import metadata' button, you will be presented with a form where you can edit your metadata. You can check that your metadata was parsed correctly by looking at the 'SAML 2.0' tab. The textfields for AssertionConsumerService and SingleLogoutService should contain two URLs:
認証するにはOpenIdPアカウントを用いてログインする必要がある (もしアカウントがない場合は新規に作成する。次に'Add from SAML 2.0 XML metadata'のリンクをクリックし、あなたのSAML 2.0 XML形式メタデータを貼り付ける。'Import metadata' をクリックしたら、メタデータを編集できるフォームが表示される。そこで'SAML 2.0'タブを見ることであなたの提供したメタデータが正しく解釈されたことを確認することが出来る。AssertionConsumerServiceとSingleLogoutServiceは以下のような2種類のURLを保持しているはずだ。で、私はここで勘違いして 'Add new entity' リンクの方をクリックして色々とちりました。上記のとおりにやる、か、私のように手で全部入れることも出来るとは思います。
なお、ここで登録する上記のEntityIDに対して自分でアクセスしてみて、ただしくXMLがダウンロードされることを確認しておくと良いかと思います。既に若干述べましたが、XML DOMがインストールされていない状態でこれをやると単にエラーがでてSimpleSAMLphpが正しく動作しません。
6. 連携できることを確認
本家のページ の5のとおりです。