2015年4月30日木曜日

[Azure/SAML]Azure Webアプリにお手軽テスト用SAML SPをデプロイする

Azure Active Directory(AzureAD)やActive Directory Federation Service(AD FS)を始めとしたSAMLに対応したIdentity Provider(IdP)を構築すると、どうしても必要になるのがテストに使うアプリケーション(Service Provider/SP)です。

個人的には設定が超お手軽なGoogle Appsをテスト用SPとして使ったりすることが多いのですが、もう少し簡単なアプリケーションが欲しいなぁ、、と思うことも多くオンプレの環境にはPHPアプリケーション用のPHPライブラリであるSimpleSAMLphpをセットアップしてあったりします。
※WIFとかADALがちゃんとSAMLを喋れればいいんですが、ws-federation/OpenID Connectなんで実はSAML SPってぽっかり穴が空いています。

今回はもう少しお手軽にいつでも試せる環境を、ということでAzure WebアプリにSimpleSAMLphpをデプロイしてみます。

尚、考えることはみんな一緒で日本マイクロソフトの松崎さんも同じようなことを考えていらっしゃったようです。
http://blogs.msdn.com/b/tsmatsuz/archive/2014/01/30/azure-ad-and-php-application-sso-federation-using-simplesamlphp.aspx

松崎さんがblogを書かれた段階ではAzure WebsiteにはうまくSimpleSAMLphpが導入できなかった様なのですが、現在は割と素直に導入できました。


では、さっそくやってみます。

◆Azure Webアプリ(WebSite)の作成

ギャラリーから空のサイト(PHP)を選択し、Webサイトを作成します。



◆SimpleSAMLphpのダウンロードと展開

以下のURLから最新のSimpleSAMLphpをダウンロードし、ローカルの任意のフォルダにtar.gzを展開します。

 SimpleSAMLphp
 https://simplesamlphp.org/


◆Azure Webアプリへのデプロイ

Azureへのデプロイ方法はFTPなど色々とありますが、今回は先ほどモジュールを展開でぃたフォルダをGitのローカルレポジトリに設定してデプロイしました。

まずは、作成したWebアプリの「ソース管理の統合」メニューの「ソースコードの位置」で「ローカルGitレポジトリ」を選択します。



そして、ローカルのGitレポジトリを設定します。
※Gitクライアントなどのセットアップ方法は省略します。

Git Bashでモジュールを展開したフォルダへ移動し、以下を打ち込みます。
git init
git add .
git commit -m "initial commit"
git clone https://naohiro@samlsp1.scm.azurewebsites.net:443/samlsp1.git
git remote add azure https://naohiro@samlsp1.scm.azurewebsites.net:443/samlsp1.git
git push azure master


これでモジュールがAzure上にデプロイされました。


◆仮想ディレクトリの設定

デプロイしたモジュールへ外からアクセスするための仮想ディレクトリを設定します。
SimpleSAMLphpでは/simplesamlという仮想ディレクトリに[展開先]/simplesamlphp/wwwをマッピングする必要がありますので、以下のような仮想ディレクトリを設定します。


◆SimpleSAMLphpへのSP登録

テスト用なのでデフォルトで登録されているSPを使います。
SP設定は[展開先]/config/authsources.phpファイルに存在するので、ローカルで対象ファイルを編集します。
ファイルの中に'default-sp'というブロックがあるので、その中を修正します。

変更点は、以下の3点です。

  • entityID : 何でも構わないんですが、一般にSPのURLを設定するので、「http://samlsp1.azurewebsites.net」の様に設定しました。
  • idp:ここは設定しなくても良いのですが、デフォルトで使うIdPとしてPingIdentityのPingOneを使いたかったので、PingOneの自分のテナントのURLを指定します。
  • NameIDPolicy:SimpleSAMLphpは初期値でtransientが設定されるので、何が来ても良いようにNULLにしておきます。


こんな感じで設定しました。
'default-sp' => array(
        'saml:SP',

        // The entity ID of this SP.
        // Can be NULL/unset, in which case an entity ID is generated based on the metadata URL.
        'entityID' => 'http://samlsp1.azurewebsites.net',

        // The entity ID of the IdP this should SP should contact.
        // Can be NULL/unset, in which case the user will be shown a list of available IdPs.
        'idp' => 'https://pingone.com/idp/xxxxxx',

        // nameid
        'NameIDPolicy' => NULL,



ローカルでauthsources.phpを更新したので、GitでAzure上へデプロイしておきます。
git add --all
git commit -m "sp config"
git push azure master


この段階で念のためAzure Webアプリの再起動をしておきましょう。


◆IdP(PingOne)へのSP登録

今回はテスト用IdPとしてPingOneを指定しました。

まずは先にSimpleSAMLphpの管理ページにアクセスし、[連携]タブより登録したSPのメタデータを取得します。

http://samlsp1.azurewebsites.net/simplesaml/
という形でsamplesamlという名前で作成した仮想ディレクトリへアクセスするとSimpleSAMLphpの管理画面が開きますので、[連携]タブよりメタデータを表示を選択するとメタデータのURLが表示されるので、このURLをメモしておきます。後でこれをPingOneに設定するので。




次にPingOneの管理コンソールにアクセスします。

 PingOne管理コンソール
 https://admin.pingone.com/

この[Application]タブを開くとアプリケーションの追加が出来ます。
[Add Application]より[New SAML Application]を選択しアプリケーション名、説明などを設定して行きます。
重要なのは、先のSPメタデータを[Upload Metadata]に指定することと、SAML Metadataの項目でIdP側のメタデータをダウンロードしておくことです。





またSAML Assertionに含める属性とPingOneのレポジトリ内の属性とのマッピングを設定することも可能です。



これでIdPの設定は終わりです。



◆SPへのIdP登録

再度SimpleSAMLphpの管理画面を開き、[連携]メニューより[XMLをsimpleSAMLphpメタデータに変換]を選択し、先ほどダウンロードしたPingOneのIdPメタデータをSimpleSAMLphp用の設定ファイルへ変換します。


メタデータパーサにダウンロードしたIdPメタデータを張り付けて[パース]をクリックするとSimpleSAMLphpに設定する内容が表示されます。


ここで出来上がった設定をローカルの[展開先]/metadata/saml20-idp-remote.phpのphpタグの間に貼り付け、保存して先ほどと同じようにgit pushし、Azure Webアプリを再起動します。


◆動作テスト

これで設定は完了ですが、すこしわかりやすいアプリケーションを作ってSAML Assertionの中身を見えるようにしてみます。
基本は松崎さんのblogに上がっているphpアプリケーションでモジュールのパスを変えただけです。

<?php
  require_once("simplesamlphp/lib/_autoload.php");
  $as = new SimpleSAML_Auth_Simple('default-sp');
  $as->requireAuth();
  $attributes = $as->getAttributes();
?>
<div style="font-weight: bold;">Test SAML SP</div>
<table border="1">
<?php  foreach ($attributes as $key => $value): ?>
  <tr>
    <td><?=$key;?></td>
    <td><?=$value[0];?></td>
  </tr>
<?php endforeach;?>
</table>


これをローカルの[展開先]ディレクトリ直下にindex.phpとして配置し、git pushします。


これで、アプリケーションも含めすべての準備が整いました。
早速アプリケーションにアクセスすると、PingOneのログイン画面が表示されるのでログインすると、アプリケーションが表示されます。



多少手間ではありますが、これで無償で常時稼働出来るSAML SPが完成しました。
設定もgitで管理できるので新しいIdPを作った際に少し修正して、戻して、、といったことが簡単に出来るようになります。

0 件のコメント: