Gluegent Blog

Gluegent Blog

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

  • Gluegent Gate
  • 技術
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の公式ドキュメント を参照します。