Cloudflare Zero Trust で SaaS アプリ登録をテストする (SimpleSAMLphp)



# 概要

大まかな流れは、以下の記事と同様です。

今回は [SimpleSAMLphp](https://simplesamlphp.org/) を使います。

>  [Cloudflare Zero Trust で SaaS アプリ登録をテストする (SAML Test Service Provider) - Qiita](https://qiita.com/khayama/items/84c386a3279a691564e3)



# SimpleSAMLphp インストール

CentOS を使います。

```shell
$ cat /etc/redhat-release 
CentOS Stream release 8
```

事前に必要なパッケージをインストールし、サービスを起動します。

```shell
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 をダウンロードします。

```shell
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 -
```

ダウンロードしたファイルを確認します。

```shell
$ ls
simplesamlphp-1.19.6.tar.gz
```

ファイルを解凍し、中身を `/var/www/simplesamlphp` にコピーします。

```shell
tar xvzf simplesamlphp-1.19.6.tar.gz
sudo mv simplesamlphp-1.19.6/ /var/www/simplesamlphp
```

以下のように設定ファイルを変更します。

`example.com` は、自身でホストするドメインに変更してください。

```shell
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>` は、環境に合わせて変更してください。

```shell
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 用の設定ファイルを追加します。

```shell
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 を一時的に無効化します。

```shell
sudo systemctl restart httpd
sudo setenforce 0
```

# Cloudflare Tunnel インストール

以下のドキュメントを参考にセットアップします。

> [Set up your first tunnel · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/tunnel-guide/#set-up-a-tunnel-remotely-dashboard-setup)

![image-20220722005638629](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20220722005638629.png)

セットアップが完了すると、`https://simplesamlphp.example.com/simplesaml` にアクセスできます。
（`example.com` が Cloudflare でホストされている必要があります。）

![image-20220603230741235](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20220603230741235.png)

# Cloudflare Access ポリシー作成

`https://simplesamlphp.example.com/simplesaml/module.php/saml/sp/metadata.php/default-sp?output=xhtml` から確認できる SP メタデータを入力します。

![image-20220722010338432](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20220722010338432.png)

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`

![image-20220722010559719](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20220722010559719.png)

# SP (SimpleSAMLphp) に IdP (Cloudflare Access) を登録

Cloudflare Access ポリシー作成後、SP (SimpleSAMLphp) に IdP (Cloudflare Access) を登録するための情報が得られます。

- SSO endpoint
- Public key
- Access Entity ID or Issuer

![image-20220722010854046](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20220722010854046.png)

IdPメタデータ作成ツール https://www.samltool.com/idp_metadata.php に入力し、生成された XML をコピーします。

![image-20220603004101777](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20220603004101777.png)
![image-20220603004243939](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20220603004243939.png)

`https://simplesamlphp.example.com/simplesaml/admin/metadata-converter.php` から、生成した XML を PHP ファイルで登録可能なメタデータに変換し、以下のような内容で保存します。

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

```php: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)」として確認できます。

![image-20220722011853180](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20220722011853180.png)

# 認証テスト

`https://simplesamlphp.example.com/simplesaml/module.php/core/frontpage_auth.php` から認証テストをおこなえます。

![image-20220722000334403](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20220722000334403.png)

`default-sp` を選択します。

![image-20220722000657323](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20220722000657323.png)

IdP (Cloudflare Access) にリダイレクトされます。

（SP から見ると Cloudflare Access が IdP に見えますが、実際に認証をおこなうのは Cloudflare Access に連携された IdP です。Cloudflare Access は IdP プロキシのように振る舞います。）

![image-20220722012135776](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20220722012135776.png)

認証されると、デモページに遷移し、認証データが確認できます。

![image-20220722012720158](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20220722012720158.png)

以上です。

# 参考

- [SimpleSAMLphp で SAML 2.0 によるシングルサインオン (SSO) の動作を確認してみた - Qiita](https://qiita.com/noritnk/items/7ef45c845675be584a40)
- [SimpleSAMLphpでSAMLのSPを作る | SIOS Tech. Lab](https://tech-lab.sios.jp/archives/7811)
- [IdM実験室: [Azure/SAML]Azure Webアプリにお手軽テスト用SAML SPをデプロイする](https://idmlab.eidentity.jp/2015/04/azuresamlazure-websaml-sp.html)
- [CentOS 8でSimpleSAMLphpを使ったSAML SPを作ってみよう！ | 株式会社セシオス](https://www.secioss.co.jp/centos-8%E3%81%A7simplesamlphp%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9Fsaml-sp%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86%EF%BC%81/)
- [Setting secure cookie on plain HTTP is not allowed on Extension talk:SimpleSAMLphp](https://www.mediawiki.org/wiki/Topic:Waisaqounjdviv1p)
- [single sign on - Simplesamlphp unhandled exception error while using as SP - Stack Overflow](https://stackoverflow.com/questions/19547602/simplesamlphp-unhandled-exception-error-while-using-as-sp)