SimpleSAMLphpを使ってSAMLに対応したサイトを作ろう

schedule 2018/03/14  refresh 2023/11/09

 

やりたいこと

SimpleSAMLphpを使ってSAMLサービスプロバイダー(SAML SP)を構築し、SeciossLinkからシングルサインオンをする

 

前提

CentOS 7.4のインストールと初期設定が完了していること

 

SeciossLink検証環境の申し込みが完了していること
(もちろん本契約しているSeciossLinkテナントでも大丈夫です)

 

※   本番環境の場合は、適宜 ホスト名を“slinkdev.secioss.net”から”slink.secioss.com”に読み替えてください。

 

※   本稿で使用しているSeciossLinkのテナントIDをexample.comです。こちらも適宜読み替えてください。

手順

1. 環境設定

 

まず、SimpleSAMLphpに必要なパッケージをインストールします。

 

# yum install httpd

# yum install mod_ssl

# yum install php

# yum install php-mbstring

# yum install php-xml

 

面倒なのでSELinuxも無効化しておきましょう。

 

# setenforce 0

(再起動後も無効にする場合は、/etc/selinux/configも書き換えてください。)

 

 

2. SimpleSAMLphpのインストール

 

SimpleSAMLphpのホームページからパッケージをダウンロードしてインストールします。

本稿執筆時点(2018/03/07)では simplesamlphp-1.15.4.tar.gz が最新でした。

 

別のバージョンを使う場合は適宜読み替えてください。

 

# wget --content-disposition https://simplesamlphp.org/download?latest

# tar xvzf simplesamlphp-1.15.4.tar.gz

# mv simplesamlphp-1.15.4 /var/www/simplesamlphp

 

3. SimpleSAMLphpの初期設定

 

SimpleSAMLphpの管理者ユーザーのパスワードを設定します。

 

任意のパスワードに変更してください。

 

/var/www/simplesamlphp/config/config.php

 

    'auth.adminpassword' => '123',
    'enable.saml20-idp' => true,

 

httpdにSimpleSAMLphpようの設定ファイルを追加します。

 

/etc/httpd/conf.d/simplesamlphp.conf

 

Alias /simplesaml /var/www/simplesamlphp/www

 <Directory /var/www/simplesamlphp/www>

   Require all granted

</Directory>

 

httpdを起動します。

 

# systemctl start httpd

 

ファイアーウォールを設定している場合は、通信を許可しておきましょう。

# firewall-cmd --permanent --zone=public --add-service=https

# firewall-cmd --reload

 

 

4. SeciossLinkの設定

 

SeciossLinkの管理画面にログインし、SAML SPの新規登録を行います。

 

SimpleSAMLphpを使ってSAMLに対応したサイトを作ろう-1

 

SAML SPを登録します。

 

SimpleSAMLphpを使ってSAMLに対応したサイトを作ろう-2

項目名

設定値

サービスID simplesaml

※   任意の値でOK

サービス名 simplesaml

※   任意の値でOK

エンティティID https://simplesaml.example.com

※   SAML SPのエンティティIDです。後で使います。設定値は任意の値でOKです。

Assertion Consumer Service https://<<SAML SPのホスト名またはIP>>/simplesaml/module.php/saml/sp/saml2-acs.php/slink-sp
ログアウトURL https://<<SAML SPのホスト名またはIP>>/simplesaml/module.php/saml/sp/saml2-logout.php/slink-sp
アクセス先URL https://<<SAML SPのホスト名またはIP>>/simplesaml/module.php/core/authenticate.php?as=slink-sp
IDの属性 urn:oasis:names:tc:SAML:2.0:nameid-format:persistent

 

登録したSAML SPをユーザーに割り当てます。

 

SimpleSAMLphpを使ってSAMLに対応したサイトを作ろう-3

 

5. SimpleSAMLphpにSAML IdP追加

 

SimpleSAMLphpにSAML IDプロバイダー(SAML IdP)を追加します。

 

まず、SeciossLinkのメタデータをダウンロードします。

 

ブラウザなどで 下記URLにアクセスし、メタデータファイルをダウンロードしてください。

 

https://slinkdev.secioss.net/saml/metadata.php?tenant=example.com

※   最後のexample.comはテナントIDです。

 

 

ダウンロードしたメタデータファイルを見ながらSimpleSAMLphpのメタデータに追記を行います。

 

/var/www/simplesamlphp/metadata/saml20-idp-remote.php

 

$metadata['https://slinkdev.secioss.net/example.com'] = array (

  'entityid' => 'https://slinkdev.secioss.net/example.com',

  'description' => array ('en' => '',),

  'OrganizationName' => array ('en' => '',),

  'name' => array ('en' => '',),

  'OrganizationDisplayName' => array ('en' => '',),

  'url' => array ('en' => '',),

  'OrganizationURL' => array ('en' => '',),

  'contacts' => array (0 => array ('contactType' => 'technical', 'surName' => 'Administrator', 'emailAddress' => array (0 => 'admin@secioss.co.jp',),),),

  'metadata-set' => 'saml20-idp-remote',

  'SingleSignOnService' => array (0 => array ('Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', 'Location' => 'https://slinkdev.secioss.net/saml/saml2/idp/SSOService.php',),),

  'SingleLogoutService' => array (0 => array ('Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', 'Location' => 'https://slinkdev.secioss.net/saml/saml2/idp/SingleLogoutService.php',),),

  'ArtifactResolutionService' => array (),

  'NameIDFormats' => array (0 => 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient',),

  'keys' => array (0 => array ('encryption' => false, 'signing' => true, 'type' => 'X509Certificate', 'X509Certificate' => 'MIIDtTCCAp2gAwIBAgIJ………JpxhEtrnWMo=',),),

);

 

長いですが、書き換えが必要な個所は3か所だけです。

 

まず、entityidを2か所置き換えます。SeciossLinkのメタデータに記述されているentityIDに書き換えます。

サンプルでは’https://slinkdev.secioss.net/example.com’

 

次にX509CertificateをSeciossLinkのメタデータに記述されている証明書に書き換えます。

 

サンプルでは’MIIDtTCCAp2gAwIBAgIJ………JpxhEtrnWMo=’

 

SAML IdPの設定を追加します。

 

/var/www/simplesamlphp/config/authsources.php

 

    'slink-sp' => array(

        'saml:SP',

        'entityID' => 'https://simplesaml.example.com',

        'idp' => 'https://slinkdev.secioss.net/example.com',

        'discoURL' => null,

    ),

 

entityIDにはSeciossLinkの管理画面で設定したエンティティIDを設定します。

 

idpにはSeciossLinkのentityIDを設定します。

 

 

6. DEMOサイトにアクセスしてみよう

 

SimpleSAMLphpのDEMOサイトにアクセスしてみましょう。

 

ブラウザで下記のURLにアクセスしてください。

 

https://<<SAML SPのホスト名またはIP>>/simplesaml/module.php/core/authenticate.php?as=slink-sp

 

SeciossLinkのログイン画面にリダイレクトされます。

 

SimpleSAMLphpを使ってSAMLに対応したサイトを作ろう-4

 

SeciossLinkでログインするとSimpleSAMLphpのデモ画面にリダイレクトします。

 

SimpleSAMLphpを使ってSAMLに対応したサイトを作ろう-5

 

SeciossLinkで認証したユーザー情報が含まれているのが確認できます。

 

 

7. 独自WebサイトでSAML認証してみよう

 

では、次に独自Webサイトを作ってSAMLでシングルサインオンしてみましょう。

 

/var/www/html/index.php

 

<?php

require_once('/var/www/simplesamlphp/lib/_autoload.php');

use SimpleSAML\Auth\Simple;

$as = new Simple('slink-sp');

$as->requireAuth();

$name=$as->getAuthData("saml:sp:NameID");

?>

<html>

<body>

<h1>こんにちは <?php echo $name->value; ?> さん</h1>

<body>

</html>

 

ブラウザで下記URLにアクセスするとこんな感じに表示されます。

 

https://<<SAML SPのホスト名またはIP>>/

 

SimpleSAMLphpを使ってSAMLに対応したサイトを作ろう-6

 

このようにSimpleSAMLphpを使うと簡単にSAML対応のWebサイトを構築できます。

 

それではまた。