Cloudflare Zero Trustのユーザ認証をSAMLで

# はじめに

Cloudflare Zero Trust(以降Cloudflareという)は手軽にZTNAを展開できるサービスで無料から使えます。

Webサービスであれば、リダイレクトでユーザ認証画面を表示して外部からでもセキュアにアクセスできます。

Cloudflareで用意しているユーザ認証方法は大きく以下3種類に分かれています。

- ワンタイムPIN認証(メールアドレスのみの認証)
- SAML認証
- OIDC認証

Cloudflare単独だとワンタイムPIN認証しか利用できませんが、IDaaSと組み合わせることでSAML認証、OIDC認証が利用できます。
これにより、二要素認証やリスクベース認証などの高度な認証を取り入れることができます。

今回は、同じく手軽に使えるJumpCloudというIDaaSを使って、
CloudflareのWebアクセスをSAML認証でJumpCloudに飛ばしてそちらで認証できるかを検証しました。
また、SAML認証でグループ情報も渡して特定のグループにいるユーザのみがアクセスできるかも合わせて試してみます。

# 構成

構成は以下の通りです。

![Cloudflare.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335255/d4e86e32-8d57-6713-fa75-0dd012cf21ea.png)

外部からオンプレWebサーバ(web.example.com)へのアクセスをCloudflare Tunnel経由でアクセスするように設定。
さらに、アクセス時に`JumpCloudの認証が必要`と設定します。

こうすることでCloudflareがSAML SPとして動作し、IdP(JumpCloud)へ認証するようにリダイレクトしてくれます。
認証完了すれば再度CloudflareにリダイレクトされてオンプレWebサーバにアクセスできるようになります。

オンプレWebサーバとCloudflare Tunnelの構築については割愛しますが、[公式ドキュメント](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/install-and-setup/tun)にある通り、簡単に作成できます。

# 設定

設定の流れは以下の通り

1. CloudflareのSPメタデータを取得
2. JumpCloudでSAML IdP設定してIdPメタデータ取得
3. CloudflareでSAML SP設定
4. Cloudflareでアプリケーションの認証ポリシーを設定


ちなみに事前に以下設定はされている状態としておきます。

- JumpCloud
    - アクセス許可したいグループ作成
    - ユーザを作成して、アクセス許可したいグループに割り当て
- Cloudflare
    - アクセス対象アプリケーション作成
    - Cloudflareトンネル経由で上記アプリケーションまでのアクセスができている

## 1. CloudflareのSPメタデータを取得

SPメタデータは以下URLから取得できるため、事前にアクセスして出力されるXMLファイルを保存しておく。

`https://<your-team-name>.cloudflareaccess.com/cdn-cgi/access/saml-metadata`

## 2. JumpCloudでSAML IdP設定してIdPメタデータ取得

JumpCloudダッシュボードより、SAML設定を行います。

`SSO` -> `Add New Application`より、`Cloudflare`のテンプレートがあるので以下内容にて作成する。

| 項目 | 設定内容 |
| --- | --- |
| Service Provider Metadata | 先ほどダウンロードしたSPメタデータ |
| IdP Entry ID | \<your-team-name\>.cloudflareaccess.com |
| SP Entity ID | https://\<your-team-name\>.cloudflareaccess.com/cdn-cgi/access/callback |
| Group Attribute | `include group attribute`を`enable`にして`memberOf`を指定 |

作成後、作成した設定の`SSO`タブより、`Export Metadata`よりIdPメタデータをダウンロードしておく。

## 3. CloudflareでSAML SP設定

Cloudflareダッシュボードより、IdPメタデータのインポートおよびSPの設定を行います。

`Settings` -> `Authentication` -> `Login methods` -> `Add New`より、`SAML`を選択します。

IdPメタデータを選択できる場所があるので、そこに先ほど取得したIdPメタデータをアップロードすると諸々のパラメータが自動入力されます。

`SAML attributes`は自分で入力しないといけないので以下項目を追加します。

- email
- username
- name
- firstname
- lastname
- memberOf

この状態でCloudflareからテストを行うことができ、以下のような出力が出れば成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335255/5f95f5f9-7a31-e808-782c-b505f88358b5.png)

## 4. Cloudflareでアプリケーションの認証ポリシーを設定

まず事前に作成した、アプリケーションにてSAML認証ができるように設定します。

`Authentication`タブにて、作成した認証を選択する。
JumpCloudのみ認証可能とするため、`Accept all available identity providers`はチェックを外しておき、`Instant Auth`にチェックをつけておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335255/79967c17-e81a-f17a-d334-4f7aa331af84.png)

次に、アクセス許可したいグループのみ認証ができるように設定します。
`Policies`より、作成したポリシーアイテムを選択し、Create additional rulesで以下画像のようなアクセス許可したいSAMLグループに所属しているユーザのみ認証するように設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335255/197dc7e0-fb5c-3144-d83f-570abf1936f8.png)

## 検証

実際に外部より、オンプレWebサーバのURLにアクセスするとJumpCloudの認証画面にリダイレクトされました。
ここで、アクセス許可したいグループに所属しているユーザでログインすると再度リダイレクトされて、Webページが表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335255/b3b9ba96-e428-bf85-dde2-01ddbef10149.png)

今度は、アクセス許可したいグループに所属していないユーザでログインをします。
すると、認証後Cloudflare側で権限がない旨表示されてアクセスが拒否されました。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3333353235352f32333733613436382d666566352d656261312d393031332d3239373533356536386536652e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335255/0ddb535d-665c-349d-e556-6eeb22d2928c.png)

# おわりに

JumpCloudでCloudflareのSAMLテンプレートがあったため、思ったより簡単にSAML連携をすることができました。

今回は、ユーザ、パスワードのみの認証ですがJumpCloudはスマホアプリなどによる二要素認証も用意されており、とても高機能です。
(高機能すぎて、まだ全機能を把握しきれていない...)

Cloudflare、JumpCloudともに無料から始めることができるので個人でZero Trustを試すにはピッタリなサービスだと思います。

今後も自宅環境で検証していき、自宅ゼロトラスト化を進めていきます！

# 参考URL

- https://developers.cloudflare.com/cloudflare-one/identity/idp-integration/jumpcloud-saml/
- https://jumpcloud.com/support/integrate-with-cloudflare