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

# Cloudflare Access

SaaS アプリケーションへアクセスすることを想定したときに、Cloudflare Access が間に入ることで IdP アグリゲータや IdP プロキシのような役割を果たします。

> [SaaS applications · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/applications/configure-apps/saas-apps/)
> Cloudflare Access allows you to integrate your SaaS products by acting  as an identity aggregator, or proxy. This way, users cannot login to  SaaS applications without first meeting the criteria you want to  introduce.
> ![SaaS applications diagram](https://developers.cloudflare.com/cloudflare-one/static/documentation/applications/diagram-saas.jpg)

例えば、設定できるポリシーには以下のような項目があり、デバイスポスチャや国別で場所を指定するなどの条件を組み合わせて構成できます。

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

# 事前準備

事前に OTP もしくは IdP 連携により認証先の準備をします。

- [One-time PIN login · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/identity/one-time-pin/)
- [SSO integration · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/identity/idp-integration/)

# テスト用 SaaS アプリポリシー作成

[SAML Test Service Provider](https://sptest.iamshowcase.com/) を使います。

> [Test SAML, Configure SSO Using a Free-to-Use Application - JumpCloud](https://jumpcloud.com/blog/how-to-test-saml-and-configure-sso-for-free)

Access > Applications > Add an application から SaaS を選択して、ポリシー作成します。

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

次に `Entity ID` と `Assertion Consumer Service URL` にテスト用 SaaS アプリの設定を入れます。

`Name ID` はどちらでも構いません。

> [sptest.iamshowcase.com/testsp_metadata.xml](https://sptest.iamshowcase.com/testsp_metadata.xml)
>
> ```xml:testsp_metadata.xml
> <?xml version="1.0" encoding="UTF-8"?>
> <md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" entityID="IAMShowcase" validUntil="2025-12-09T09:13:31.006Z">
>    <md:SPSSODescriptor AuthnRequestsSigned="false" WantAssertionsSigned="true" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
>       <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</md:NameIDFormat>
>       <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</md:NameIDFormat>
>       <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://sptest.iamshowcase.com/acs" index="0" isDefault="true"/>
>    </md:SPSSODescriptor>
> </md:EntityDescriptor>
> ```

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

今回はポリシーを全員許可に設定します。

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

最後に SP initiated SSO ログインを設定するための情報が表示されますが、後で確認します。

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

# IdP initiated SSO ログインテスト

Service Provider からみると Cloudflare Access が IdP のように振る舞います。

> [IdP initiated SSO and SP Initiated SSO with SAML | by Dinuwan Kalubowila | Medium](https://medium.com/@dckalubowila25132/idp-initiated-sso-and-sp-initiated-sso-with-saml-4c4456b2ee34)
> ![img](https://miro.medium.com/max/764/1*qP7Y3FeaskERuFxZMx1WbQ.png)

`https://<org_name>.cloudflareaccess.com` から [App Launcher](https://developers.cloudflare.com/cloudflare-one/applications/app-launcher/) を起動し、先ほど定義した「SAML Test Service Provider」にアクセスします。

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

その後、ログインに成功すると、各種情報を確認できるページが表示されます。

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

# SP initiated SSO ログインテスト

Service Provider からみると Cloudflare Access が IdP のように振る舞います。

>[IdP initiated SSO and SP Initiated SSO with SAML | by Dinuwan Kalubowila | Medium](https://medium.com/@dckalubowila25132/idp-initiated-sso-and-sp-initiated-sso-with-saml-4c4456b2ee34)
>![img](https://miro.medium.com/max/804/1*JKlQUMVNBzkigksEcQGTzA.png)

作成したアプリケーションポリシーから `SSO endpoint`、`Public key `、`Entity ID` を参照して使います。

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

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

> Single Logout Service Endpoint には `https://<org_name>.cloudflareaccess.com/cdn-cgi/access/logout` が使えます。

![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://sptest.iamshowcase.com/instructions#spinit に `Submit XML` し、ログインテストを開始します。

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

ユニークログオン URL が表示されるので、アクセスします。

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

その後、ログインに成功すると、各種情報を確認できるページが表示されます。

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

# まとめ

Cloudflare Access を使って SaaS アプリケーションのポリシー制御を行うには、IdP Initiated と SP initiated の両方を意識した上で設定を確認する必要があります。

今回のテストを踏まえると、既存の SaaS アプリへのログインフローの Before & After について、具体的なイメージを持って構成できるでしょう。

他にも [AuthNRequest](https://sptest.iamshowcase.com/authnrequest) を使って、特定ユーザに指定した認証方式の要求などを試すことができます。

# 参考

- [IdM実験室: [SAML]IdPの動作テストに使えるテストSPサイト](https://idmlab.eidentity.jp/2018/02/samlidpsp.html)
- [Mock SAML - A free SAML 2.0 Identity Provider for testing SAML SSO integrations.](https://mocksaml.com/)