SimpleSAMLphpを使った簡易SP(Service Provider)の構築手順

はじめに
このブログ記事では、SimpleSAMLphpを使用して簡易的なSAML Service Provider(SP)を構築する手順を解説します。
SAMLは、異なるドメイン間でユーザー認証を行うための標準的なプロトコルであり、SPはユーザーを認証するIdP (Identity Provider)にリクエストを送信する役割を担います。
SimpleSAMLphpは、SAMLの実装を容易にするPHPライブラリです。
対象読者
- SAMLの基本的な概念を理解している方
- Webアプリケーションの認証基盤を構築したい方
- SimpleSAMLphpを利用した簡易SP構築を試してみたい方
環境
この記事では、以下の環境で手順を説明します。
- OS:Rocky Linux release 8.10 ※OSのインストールと初期構築は完了している前提での手順となります。
- Apache: 2.4.37
- PHP: 8.2.25
- SimpleSAMLphp: 2.3.7
- SP ホスト名:testsp.example.net
- Gluegent Gate のテナント構築が完了している(評価版でもOK)
※ 本稿で使用する Gluegent Gate のテナントIDは example.com です。
1. 環境設定・インストール
1.1 必要なパッケージのインストール
まず、SimpleSAMLphpを動作させるために必要なパッケージをインストールします。TeraTermなどのSSHクライアントでサーバに接続し、以下のコマンドを実行します。
$ sudo su
# dnf install httpd
# dnf install mod_ssl
# dnf module install php:8.2
1.2 SimpleSAMLphpのインストール
次に、SimpleSAMLphpをインストールします。以下のコマンドをそれぞれ実行します。
# curl -o simplesamlphp.tgz -L https://github.com/simplesamlphp/simplesamlphp/releases/download/v2.3.7/simplesamlphp-2.3.7-full.tar.gz
# tar xvzf simplesamlphp.tgz
# mv simplesamlphp-2.3.7/ /var/www/simplesamlphp
1.3 SimpleSAMLphpの初期設定
SimpleSAMLphpの初期設定を行います。
まず、各設定ファイルの名前を変更します。
# mv /var/www/simplesamlphp/config/config.php.dist /var/www/simplesamlphp/config/config.php
# mv /var/www/simplesamlphp/config/authsources.php.dist /var/www/simplesamlphp/config/authsources.php
次に、secretsaltを生成します。
# openssl rand -base64 32
生成したsecretsaltなどの値を設定ファイルに記述します。
# vi /var/www/simplesamlphp/config/config.php
設定する主な値は以下の通りです。
- secretsalt: 先ほど生成した値を設定します。
- auth.adminpassword: SimpleSAMLphpの管理画面にログインするためのパスワードを設定します。
- timezone: タイムゾーンを’Asia/Tokyo’に設定します。
- technicalcontact_name: 技術担当者の名前を設定します。(任意)
- technicalcontact_email: 技術担当者のメールアドレスを設定します。(任意)
- enable.saml20-idp: trueに設定してSAML2.0を有効化します。
1.4 Apacheの設定
ApacheにSimpleSAMLphp用の設定ファイルを追加します。
# vi /etc/httpd/conf.d/simplesamlphp.conf
設定ファイルに以下の内容を記述します。
Alias /simplesaml /var/www/simplesamlphp/public
<Directory /var/www/simplesamlphp/public>
Require all granted
</Directory>
Apacheがシステム起動時に自動的に開始するように設定します。
# systemctl enable httpd
1.5 ファイアウォールの設定
ファイアウォールをインストール・設定し、HTTPSアクセスを許可します。
# dnf install firewalld
# systemctl enable firewalld
# systemctl start firewalld
# firewall-cmd --permanent --zone=public --add-service=https
# firewall-cmd --zone=public --add-service=https
# firewall-cmd --reload
1.6 SELinuxの設定 (必要に応じて)
SELinuxを無効化する必要がある場合は、設定ファイルを編集します。
# vi /etc/selinux/config
SELINUX=enforcing を SELINUX=disabled に変更します。
1.7 キャッシュディレクトリの確認・作成
以下のコマンドで、キャッシュディレクトリが存在するか確認します。
# ls -ld /var/cache/simplesamlphp/core
ディレクトリが存在しない場合は、以下のコマンドで作成します。
# mkdir -p /var/cache/simplesamlphp/core
SimpleSAMLphp のキャッシュディレクトリの所有者を変更し、適切なアクセス権を設定します。
# chown -R apache:apache /var/cache/simplesamlphp
# chmod -R 750 /var/cache/simplesamlphp
1.7 サーバ再起動(必要に応じて)
SELinuxの設定を反映するためにサーバを再起動します。
# reboot
1.8 動作確認
構築したWebサーバの以下URLにアクセスします。
https://<ホスト名>/simplesaml/
※上記URLの<ホスト名>の部分については、構築したサーバのホスト名に適宜置き換えます。
正しく設定できていれば以下のような画面が表示されます。

2. Composerのインストール(必要に応じて)
SimpleSAMLphpのモジュールをインストールするために、Composerをインストールします。ComposerはPHPの依存性管理ツールです。
2.1 必要なPHP拡張機能のインストール
Composerの動作に必要なPHP拡張機能などをインストールします。
# dnf update
# dnf install php php-cli php-json php-zip unzip php-mbstring php-fpm php-dom php-xml
# dnf install git
# systemctl restart httpd
# curl -sS https://getcomposer.org/installer -o composer-setup.php
2.2 インストーラの署名検証
ダウンロードしたインストーラが改ざんされていないことを確認します。
(2つ目のコマンド実行後にInstaller verifiedが表示されれば問題ありません。)
# HASH=$(curl -sS https://composer.github.io/installer.sig)
# php -r "if (hash_file('sha384', 'composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
2.3 Composerのインストール (グローバルインストール)
Composerをグローバルにインストールします。
# php composer-setup.php --install-dir=/usr/local/bin --filename=composer
# chmod +x /usr/local/bin/composer
次に環境変数PATHを設定するために、以下のコマンドでファイルを開きます。
# vi ~/.bashrc
ファイル末尾などに以下の行を追加します。
export PATH="$PATH:/usr/local/bin"
以下コマンドでログインプロセスを再実行して、新しいシェルに置き換えます。
# exec login
$ sudo su
以下のcomposerコマンドを実行できることを確認します。(バージョン確認コマンド)
# composer --version
3. SimpleSAMLphpモジュールのインストール
SimpleSAMLphp 2.0以降では、モジュールが最小構成となっているため、必要なモジュールを手動でインストールする必要があります。
ここでは、consentsimpleadminモジュールをインストールします。
# composer require simplesamlphp/simplesamlphp-module-consentsimpleadmin:dev-master
4. SPの設定
4.1 Idp情報をGluegent Gateに登録
Gluegent Gateの管理画面でSP情報を登録します。(Gluegent Gateのマニュアル「SP側の情報」を併せて参照します。) 登録する主な情報は以下の通りです。
- サービス名:samlphp
- エンティティID:https://testsp.example.net/simplesaml/
- ACS (Assertion Consumer Service) URL:https://testsp.example.net/simplesaml/module.php/saml/sp/saml2-acs.php/glg-sp
- ログアウトURL:https://testsp.example.net/simplesaml/module.php/saml/sp/saml2-logout.php/glg-sp
- ポータルに表示するURL:https://testsp.example.net/
4.2ユーザーへのSP割り当て
Gluegent Gateで登録したSAML SPをユーザーに割り当て、アクセス権限を設定します。 (Gluegent Gateのマニュアル「アクセス権の付与」を併せて参照します。)
4.3 authsources.phpにIdP設定を追加
設定ファイル(config/authsources.php 内の SP の設定)にエンティティIDなどのIdP設定を追加します。
# vi /var/www/simplesamlphp/config/authsources.php
'glg-sp' => array(
'saml:SP',
'entityID' => 'https://testsp.example.net/simplesaml/',
'idp' => 'https://auth.gluegent.net/example.com', // ※テナントIDを指定
'discoURL' => null,
),
- 'glg-sp'について、Gluegent Gateで指定したAssertion Consumer Service (ACS) URL の末尾部分に適宜置き換えてください。
- 'entityID'について、https://testsp.example.net/simplesaml/ は、Gluegent Gateで指定したエンティティIDに適宜置き換えてください。
- 'idp'について、https://auth.gluegent.net/example.com のexample.comの部分は、ご利用されているGluegent GateのテナントIDに適宜置き換えてください。
4.4 IdPメタデータの登録
Gluegent GateからIdPメタデータをダウンロードし、SimpleSAMLphpに登録します。
1. Gluegent Gateの管理画面からidPメタデータをダウンロードします。(ダウンロード方法は、「メタデータのダウンロード」をご参照ください。)
2. SimpleSAMLphpの管理画面にログインします。
https://<ホスト名>/simplesaml/module.php/admin/
※上記URLの<ホスト名>の部分については、構築したサーバのホスト名に適宜置き換えます。また、ログイン時のIDとパスワードは、手順1.3でconfig.php内で指定した値を使用します。
3. 「連携」タブをクリックします。
4. 「XMLをSimpleSAMLphpメタデータに変換」をクリックします。(該当のページが正しく表示されない場合には、設定ファイル内の記述に誤りがある可能性などがあります。適宜エラー内容を確認してトラブルシューティングを実施します。)

5. ダウンロードしたIdPメタデータのXMLファイルを選択してアップロードします。
6. 「パース」ボタンをクリックしてメタデータを変換します。
7. 変換されたメタデータの内容を metadata/saml20-idp-remote.php に貼り付けます。(<?php~?>のタグで値を囲むのを忘れないでください。)
# vi /var/www/simplesamlphp/metadata/saml20-idp-remote.php
ファイルの中身
<?php
$metadata['https://auth.gluegent.net/example.com'] = [
'entityid' => 'https://auth.gluegent.net/example.com',
'contacts' => [],
'metadata-set' => 'saml20-idp-remote',
'SingleSignOnService' => [
[
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
'Location' => 'https://auth.gluegent.net/saml/saml2/idp/SSOService.php/example.com',
],
[
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
'Location' => 'https://auth.gluegent.net/saml/saml2/idp/SSOService.php/example.com',
],
],
'SingleLogoutService' => [
[
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
'Location' => 'https://auth.gluegent.net/saml/saml2/idp/SingleLogoutService.php',
],
[
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
'Location' => 'https://auth.gluegent.net/saml/saml2/idp/SingleLogoutService.php',
],
],
'ArtifactResolutionService' => [],
'NameIDFormats' => [
'urn:oasis:names:tc:SAML:2.0:nameid-format:transient',
],
'keys' => [
[
'encryption' => true,
'signing' => true,
'type' => 'X509Certificate',
'X509Certificate' => 'MIIDzTCCArWgAwIBAgIUUGrdoW
・・・NLjuJCgw9f7Hiqshxoughlac=',
],
],
'scope' => [
'example.com',
],
];
?>
5. 動作確認
5.1 テスト用ページの作成
以下コマンドで動作確認用のテストページのファイルを作成します。
# vi /var/www/html/index.php
ファイルの中身
<?php
require_once('/var/www/simplesamlphp/lib/_autoload.php');
use SimpleSAML\Auth\Simple;
$as = new Simple('glg-sp'); // ※ACS URLの最後の部分を指定
$as->requireAuth();
// $name変数を取得
$name = $as->getAuthData("saml:sp:NameID");
// valueプロパティの値を取得
$nameValue = $name->getValue();
?>
<html>
<body>
<h1>こんにちは <?php echo htmlspecialchars($nameValue, ENT_QUOTES, 'UTF-8'); ?> さん</h1>
</body>
</html>
5.2 テストページへのアクセス
作成したテストページにブラウザからアクセスします。
https://<Iホスト名>/
※上記URLの<ホスト名>の部分については、構築したサーバのホスト名に適宜置き換えます。
5.3認証の確認
アクセスすると、Gluegent Gateへのリダイレクトが発生し、Gluegent Gateで認証を求められます。
手順4.2でアクセス権限を与えたユーザーのログイン情報で認証が成功すると、テストページにリダイレクトされ、以下の画像のように「こんにちは (認証されたユーザーの名前)さん」と表示されれば成功です。

6. まとめと補足
SimpleSAMLphpを利用することで、SAML(Security Assertion Markup Language)プロトコルに対応したWebサイトを比較的容易に構築できます。
補足
- 上記の手順は、Rocky Linux 8.10の環境を例にしています。他のディストリビューションでは、コマンドや設定ファイルの場所などが異なる場合があります。
- 本ドキュメントはあくまで簡易的なSPの作成手順です。より詳細な情報については、SimpleSAMLphpの公式ドキュメント を参照します。