CentOS 8でSimpleSAMLphpを使ったSAML SPを作ってみよう!
Photo by Olena Sergienko on Unsplash
目的
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の新規登録を行います。
設定項目
- サービス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をユーザーに割り当てます。
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のメタデータをアップロードし、メタデータの変換を行います。
変換されたメタデータの内容を貼り付けます。
# vi /var/www/simplesamlphp/metadata/saml20-idp-remote.php
Copy
$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',
),
);
Copy
SAML IdPの設定を追加します。
# vi /var/www/simplesamlphp/config/authsources.php
Copy
'slink-sp' => array(
'saml:SP',
'entityID' => 'https://samltest8.int.secioss.work/simplesaml/',
'idp' => 'https://slink.secioss.com/example.com',
'discoURL' => null,
),
Copy
※"slink-sp" は 「Assertion Consumer Service」 で設定したURLの最後の部分です。
※"https://samltest8.int.secioss.work/simplesaml/" は「エンティティID」で設定した値を設定してください。
※"example.com" はテナントIDを指定してください。
6.動作確認
テスト用ページの作成します。
# vi /var/www/html/index.php
Copy
<?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>
Copy
ブラウザで下記URLにアクセスするとこんな感じに表示されます。
https://samltest8.int.secioss.work/
このようにCentOS 8でもSimpleSAMLphpを使って簡単にSAML対応のWebサイトを構築できます。
それではまた。