CentOS 8でSimpleSAMLphpを使ったSAML SPを作ってみよう!

schedule 2020/02/25  refresh 2023/11/09

 

 

目的

CentOS 8上にSimpleSAMLphpを使ってSAML SPを構築する。

 

 

はじめに

RHEL8がリリースされてもうすぐ1年です。皆さんRHEL8に触る機会が増えてきているのではないでしょうか。
RHEL8ではいくつかの大きな変更が入っており、今まで慣れ親しんだyumだdnf(ダンディファイド ヤム)に変わったりもしました。
しかし弊社技術者として最も大きな変更はOpenLDAP Serverが同梱されなくなり Red Hat Directory Server が標準Directoryサーバーに変わったことです。
このトピックも今後ブログで書いていきたいと思います。

 

今回はCentOS 8上にSimpleSAMLphpを使って SAML SPを作ってみたいと思います。

 

 

前提

・CentOS 8.1のインストールと初期構築が完了していること
・SeciossLinkへテナント構築が完了していること(評価版でもOK)
※ 本稿では使用する SeciossLink のテナントは example.com です。
・SimpleSAMLphpはバージョン 1.18.4 を使用します。
・SAML SPのホスト名は samltest8.int.secioss.work としています。

 

 

構築手順

1. 環境設定

SimpleSAMLphp を動作させるのに必要なパッケージをインストールします。

 

# dnf install httpd
# dnf install mod_ssl
# dnf install php
# dnf install php-json
# dnf install php-xml
# dnf install php-mbstring
 

 

2. SimpleSAMLphpのインストール

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

 

# curl -o simplesamlphp.tgz -L https://simplesamlphp.org/download?latest
# tar xvzf simplesamlphp.tgz
# mv simplesamlphp-1.18.4/ /var/www/simplesamlphp
 

 

3. SimpleSAMLphpの初期設定

SimpleSAMLphpの管理者ユーザーのパスワードを設定します。
auth.adminpassword を変更して任意のパスワードに変更してください。
enable.saml20-idp を変更してSAML2を有効化します。

 

# vi /var/www/simplesamlphp/config/config.php

 

    'auth.adminpassword' => '123',

    'enable.saml20-idp' => true,

 

 

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

 

# vi /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

 

ファイアーウォールでhttpsアクセスが許可されていない場合は許可してください。

 

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

 

RHEL8になってファイアーウォールの実装がiptablesからnftablesに変わりましたが、firewalld のバックエンドとして動いているので設定方法は今まで通りです。

 

動作確認をしてみましょう。
正しく設定できていれば以下のような画面が表示されます。
https://samltest8.int.secioss.work/simplesaml/

 

 

 

4. SeciossLinkの設定

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

 

20200225

 

項目名

設定値

サービスID simplesaml8 ※任意の値でOK
サービス名 simplesaml8  ※任意の値でOK
エンティティID https://samltest8.int.secioss.work/simplesaml/
※SAML SPのエンティティIDです。任意の値でOK。後で使います。
Assertion Consumer Service https://samltest8.int.secioss.work/simplesaml/module.php/saml/sp/saml2-acs.php/slink-sp
※URL最後の slink-sp は任意の値でPLですが、後で使います。
ログアウトURL https://samltest8.int.secioss.work/simplesaml/module.php/saml/sp/saml2-logout.php/slink-sp
※RL最後の slink-sp は >Assertion Consumer Service で指定したものと同じものを指定してください。
デフォルトRelayState ※IdP-Initiatedで認証した場合にリダイレクトするURLです。今回はSP-Initiatedなので空白を指定します。
アクセス先URL https://samltest8.int.secioss.work/
※テスト用のサンプルページのURLを設定する。
IDの属性 urn:oasis:names:tc:SAML:2.0:nameid-format:persistent
※変更なし

 

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

 

20200225_2

 

 

5. SimpleSAMLphpにSAML IdP追加

SimpleSAMLphpにSAML IdPを追加します。

 

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

 

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

 

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

 

SimpleSAMLphpの管理画面にログインし、SAMLメタデータの変換を行います。

 

ツールの「XML を SimpleSAMLphpメタデータに変換」をクリックします。

 

 

先ほどダウンロードしたSeciossLinkのメタデータをアップロードし、メタデータの変換を行います。

 

20200225_3

 

変換されたメタデータの内容を貼り付けます。

 

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

 

$metadata['https://slink.secioss.com/example.com'] = array (
  'entityid' => 'https://slink.secioss.com/example.com',
  'contacts' => 
  array (
  ),
  'metadata-set' => 'saml20-idp-remote',
  'SingleSignOnService' => 
  array (
    0 => 
    array (
      'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
      'Location' => 'https://slink.secioss.com/saml/saml2/idp/SSOService.php?tenant=example.com',
    ),
    1 => 
    array (
      'Binding' => 'urn:mace:shibboleth:1.0:profiles:AuthnRequest',
      'Location' => 'https://slink.secioss.com/saml/shib13/idp/SSOService.php?tenant=example.com',
    ),
  ),
  'SingleLogoutService' => 
  array (
    0 => 
    array (
      'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
      'Location' => 'https://slink.secioss.com/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' => true,
      'signing' => true,
      'type' => 'X509Certificate',
      'X509Certificate' => '
MIIDtTCCAp2gAwIBAgIJANbO0YFXcIypMA0GCSqGSIb3DQEBCwUAMHExCzAJBgNV
BAYTAkpQMQ4wDAYDVQQIDAVUb2t5bzETMBEGA1UEBwwKVG9zaGltYS1rdTEVMBMG
A1UECgwMU0VDSU9TUyBJbmMuMRQwEgYDVQQLDAtleGFtcGxlLmNvbTEQMA4GA1UE
AwwHZGVmYXVsdDAeFw0xODEyMjYwMDQxMDdaFw0yMDEyMjUwMDQxMDdaMHExCzAJ
BgNVBAYTAkpQMQ4wDAYDVQQIDAVUb2t5bzETMBEGA1UEBwwKVG9zaGltYS1rdTEV
MBMGA1UECgwMU0VDSU9TUyBJbmMuMRQwEgYDVQQLDAtleGFtcGxlLmNvbTEQMA4G
A1UEAwwHZGVmYXVsdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMr+
svPQEFRqXqpwqPgXgL2jWKQNgRpLV/WB3o9qiY51m2fntVaOFMryehGj56gQN8w3
grHHR4fMtI05jwqti9yJmUWeZMbQRU7pSAncGvHpRxLsfdA4YYLvr5YMvD637a8v
cH3YnfS2f7WjLa6aQ6sGRKtm3JN7ec93xda7iLAb3Ccjr02ilMP8gK/KeWx/1U4m
QanpwbpVxBlZH0oefr6wIchW0WVbc+Lw+PRG4YJHQUe6E6AxSqtiIIyqhzhIYxqv
CrdbCWerTXwjYjVxespnGxVQjbGVyAEVp2Ff/XwCbTz1FWBfD0ZEHbmoAvbjuttq
Z67JbAKzo3QrckiEpJUCAwEAAaNQME4wHQYDVR0OBBYEFMGbh1oY2gN+YnTxidqH
rjmDoDsjMB8GA1UdIwQYMBaAFMGbh1oY2gN+YnTxidqHrjmDoDsjMAwGA1UdEwQF
MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAD4+mjoNLYlNXvhzZux77jsR935BrdQq
ol6qw72sEBAMUR1XgKFZLh1TuTS4bVGSFwCuovKX1pYah5DLbm1rW9eL2EZDxLON
MoCMO7bl9RKKgm0VNSlJ8Xdz2lupojXNP/wr3aiN+D3NJ95F6bh8FMCOutuE11R3
ASKWsLFDXVIjTnwtzQjs7wyah4NEUjQwE9dykxFGIxzY0XkE0/GMtmLi+T66TM6T
WVfF3AyhT3hbJkNIqBZ1JyF9RYCXB9iBHZJeJags+9SpR0blaaxUrihlZm0umCpo
fNm9BeJU/Q0jiwQ0pwlcmXwZEYf/aE3NaMKKzgW96MAIgf4v2FI66ek=
          ',
    ),
  ),
  'scope' => 
  array (
    0 => 'example.com',
  ),
);

 

 

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

 

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

 

   'slink-sp' => array(
        'saml:SP',
        'entityID' => 'https://samltest8.int.secioss.work/simplesaml/',
        'idp' => 'https://slink.secioss.com/example.com',
        'discoURL' => null,
    ),

※"slink-sp" は 「Assertion Consumer Service」 で設定したURLの最後の部分です。
※"https://samltest8.int.secioss.work/simplesaml/" は「エンティティID」で設定した値を設定してください。
※"example.com" はテナントIDを指定してください。

 

 

6. 動作確認

テスト用ページの作成します。

 

# vi /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://samltest8.int.secioss.work/


 

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

 

それではまた。