概要
大まかな流れは、以下の記事と同様です。
今回は SimpleSAMLphp を使います。
Cloudflare Zero Trust で SaaS アプリ登録をテストする (SAML Test Service Provider) - Qiita
SimpleSAMLphp インストール
CentOS を使います。
$ cat /etc/redhat-release
CentOS Stream release 8
事前に必要なパッケージをインストールし、サービスを起動します。
sudo dnf install -y httpd php php-xml php-json php-mbstring jq wget
sudo systemctl --now enable httpd
sudo systemctl --now enable php-fpm
SimpleSAMLphp をダウンロードします。
curl -s https://api.github.com/repos/simplesamlphp/simplesamlphp/releases/latest | jq '.assets[] | select(.name|match(".tar.gz$")) | .browser_download_url' | tr -d \" | wget -qi -
ダウンロードしたファイルを確認します。
$ ls
simplesamlphp-1.19.6.tar.gz
ファイルを解凍し、中身を /var/www/simplesamlphp
にコピーします。
tar xvzf simplesamlphp-1.19.6.tar.gz
sudo mv simplesamlphp-1.19.6/ /var/www/simplesamlphp
以下のように設定ファイルを変更します。
example.com
は、自身でホストするドメインに変更してください。
sed -i "
s/'auth.adminpassword' => '123'/'auth.adminpassword' => 'secret'/;
s/'enable.saml20-idp' => false/'enable.saml20-idp' => true/;
s/'baseurlpath' => 'simplesaml\/'/'baseurlpath' => 'https:\/\/simplesamlphp.example.com\/simplesaml\/'/;
s/'language.default' => 'en'/'language.default' => 'ja'/;
" /var/www/simplesamlphp/config/config.php
SP(サービスプロバイダ)の設定を以下のように変更します。
example.com
と <org_name>
は、環境に合わせて変更してください。
sed -i "
s/'entityID' => null/'entityID' => 'https:\/\/simplesamlphp.example.com'/;
s/'idp' => null/'idp' => 'https:\/\/<org_name>.cloudflareaccess.com'/;
s/'discoURL' => null/'RelayState' => 'https:\/\/simplesamlphp.example.com\/simplesaml\/module.php\/core\/authenticate.php\?as=default-sp'/;
" /var/www/simplesamlphp/config/authsources.php
httpd
に SimpleSAMLphp 用の設定ファイルを追加します。
cat << EOS | sudo tee /etc/httpd/conf.d/simplesamlphp.conf
Alias /simplesaml /var/www/simplesamlphp/www
<Directory /var/www/simplesamlphp/www>
Require all granted
</Directory>
EOS
httpd
を再起動し、SELinux を一時的に無効化します。
sudo systemctl restart httpd
sudo setenforce 0
Cloudflare Tunnel インストール
以下のドキュメントを参考にセットアップします。
セットアップが完了すると、https://simplesamlphp.example.com/simplesaml
にアクセスできます。
(example.com
が Cloudflare でホストされている必要があります。)
Cloudflare Access ポリシー作成
https://simplesamlphp.example.com/simplesaml/module.php/saml/sp/metadata.php/default-sp?output=xhtml
から確認できる SP メタデータを入力します。
Cloudflare Access に SimpleSAMLphp を SaaS として登録します。
- Entity ID =
https://simplesamlphp.example.com
- ACS URL =
https://simplesamlphp.example.com/simplesaml/module.php/saml/sp/saml2-acs.php/default-sp
SP (SimpleSAMLphp) に IdP (Cloudflare Access) を登録
Cloudflare Access ポリシー作成後、SP (SimpleSAMLphp) に IdP (Cloudflare Access) を登録するための情報が得られます。
- SSO endpoint
- Public key
- Access Entity ID or Issuer
IdPメタデータ作成ツール https://www.samltool.com/idp_metadata.php に入力し、生成された XML をコピーします。
https://simplesamlphp.example.com/simplesaml/admin/metadata-converter.php
から、生成した XML を PHP ファイルで登録可能なメタデータに変換し、以下のような内容で保存します。
vi /var/www/simplesamlphp/metadata/saml20-idp-remote.php
$metadata['https://<org_name>.cloudflareaccess.com'] = [
'entityid' => 'https://<org_name>.cloudflareaccess.com',
'contacts' => [],
'metadata-set' => 'saml20-idp-remote',
# 'expire' => 1658590113, 後で失効しないようにコメントアウトしておきます。
'SingleSignOnService' => [
[
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
'Location' => 'https://<org_name>.cloudflareaccess.com/cdn-cgi/access/sso/saml/xxx',
],
],
'SingleLogoutService' => [
[
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
'Location' => 'https://<org_name>.cloudflareaccess.com/cdn-cgi/access/logout',
],
],
'ArtifactResolutionService' => [],
'NameIDFormats' => [
'urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified',
],
'keys' => [
[
'encryption' => false,
'signing' => true,
'type' => 'X509Certificate',
'X509Certificate' => 'xxx',
],
[
'encryption' => true,
'signing' => false,
'type' => 'X509Certificate',
'X509Certificate' => 'xxx',
],
],
];
その後、https://simplesamlphp.example.com/simplesaml/module.php/core/frontpage_federation.php
から「SAML 2.0 IdP Metadata (Trusted)」として確認できます。
認証テスト
https://simplesamlphp.example.com/simplesaml/module.php/core/frontpage_auth.php
から認証テストをおこなえます。
default-sp
を選択します。
IdP (Cloudflare Access) にリダイレクトされます。
(SP から見ると Cloudflare Access が IdP に見えますが、実際に認証をおこなうのは Cloudflare Access に連携された IdP です。Cloudflare Access は IdP プロキシのように振る舞います。)
認証されると、デモページに遷移し、認証データが確認できます。
以上です。
参考
- SimpleSAMLphp で SAML 2.0 によるシングルサインオン (SSO) の動作を確認してみた - Qiita
- SimpleSAMLphpでSAMLのSPを作る | SIOS Tech. Lab
- IdM実験室: [Azure/SAML]Azure Webアプリにお手軽テスト用SAML SPをデプロイする
- CentOS 8でSimpleSAMLphpを使ったSAML SPを作ってみよう! | 株式会社セシオス
- Setting secure cookie on plain HTTP is not allowed on Extension talk:SimpleSAMLphp
- single sign on - Simplesamlphp unhandled exception error while using as SP - Stack Overflow