Cloudflare SSL for SaaS 設定ガイドを少し具体的に補足

##はじめに
この文書では Cloudflare の SSL for SaaS について、Cloudflare Developers 設定ガイドの補足を記します。
https://developers.cloudflare.com/ssl/ssl-for-saas
 

##Cloudflare SSL for SaaS とは
SaaS プロバイダが顧客のホスト名で HTTPS を提供することを可能にします。
その際に、顧客のホスト（サイト）に対して下記のようなことを代行し、価値を向上します。

* ドメインの数を問わず、カスタムホストの TLS・HTTP Proxy の管理を動的に実施し、管理工数を削減
* 単にカスタムホストを提供するだけでなく、より高いセキュリティ（DDoS防御やWAF、Bot管理）やパフォーマンス（CDN や通信最適化、HTTP/2 などの新しいプロトコルへの対応）を提供する
* 顧客のドメインへの信頼性を高め、SEO ランキングの向上に貢献する

###本文書で使う用語の定義
本文書で使う言葉を定義しておきます。

* カスタムホスト (Custom Hostname)：顧客のホスト名
* SaaS ドメイン：SaaS プロバイダの所有する Cloudflare 上のドメイン名
* Full セットアップ：SaaS ドメインの権威 DNS サーバを Cloudflare で稼働
* CNAME セットアップ：SaaS ドメインの権威サーバは外部にあり、Cloudflare DNS を CNAME 先として利用

###設計時点で決めておくこと
実際の設定に入る前に、下記を決めます。

|項目|内容（例）|説明|
|:-|:-|:-|
|SaaS ドメイン|saas.test|SaaS プロバイダの基盤ドメイン|
|Cloudflare DNS セットアップ|Full か CNAME|Full は Cloudflare が権威サーバ、CNAME (Partial) は外部の権威サーバから　CNAME で Cloudflare に向ける|
|カスタムホスト|`www.shop.test`|顧客のホスト名 (shop.test のような APEX にも対応可能。後述)|
|カスタムホスト 証明書|DigiCert または Let's Encrypt または 持ち込み| ~~ワイルドカードの証明書を発行したい場合は、DigiCertの一択。~~ カスタムホスト用のTLS証明書。持込の場合は証明書更新はユーザで実施|
|カスタムホスト ホスト名検証方式| DNS (TXT)、HTTP、あるいは DNS を実際に正当な値で切り替え |当該ホスト名を管理できているか確認|
|カスタムホスト 証明書検証方式|DigiCert か Let's Encrypt で異なる|当該ホスト名を管理できているか確認|
|フォールバックオリジン (Fallback Origin)|origin.saas.test|カスタムホストで受けたリクエストを転送する先 (SaaS ドメイン内で指定)|
|フォールバックオリジンの転送先|lb.origin.test (または10.0.0.1)|オリジンサーバの名前 (または IPv4,v6 アドレス)|

##Cloudflare DNS のセットアップ
https://developers.cloudflare.com/ssl/ssl-for-saas/getting-started
Cloudflareに配置する SaaS ドメインを Full セットアップにするか CNAME セットアップにするかで DNS クエリの流れが変わります。
最終的にカスタムホスト名`www.shop.test` に対して `Cloudflare の IP アドレス` を返すという目的はどちらも同じです。

1. SaaS ドメインが Full セットアップ の場合
![Screen Shot 2021-12-20 at 22.56.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/86378838-d60b-bd02-b0dc-8ba29943e404.png)

2. SaaS ドメインが CNAME セットアップ の場合
![Screen Shot 2021-12-20 at 23.02.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/2afd8a6b-5c70-43af-642b-2c4beb6a0302.png)

APEXにも対応可能です。Cloudflare の 固定（Static）IP オプションを利用することもできます。
3. APEX対応
![Screen Shot 2021-12-20 at 23.14.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/7fbaa008-aafb-23c2-8edc-521e1a544f0a.png)

1,2 いずれの場合でも HTTPS の流れは同じです。
![Screen Shot 2021-12-20 at 23.25.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/54d66dda-af53-c1ca-bc2d-1f7ec7bfcc12.png)

##カスタムホストを管理できる正当な人が設定しようとしているか、の確認

外部のホストを Cloudflare 上でサービスすることを許可するため、正当な人がカスタムホストを登録しようとしているか、を確認します。
当該ドメインのリソース（HTTP, DNS）に書き込み権限があるかを証跡とします。

1. カスタムホスト名の有効化 (Hostname Verification)

DNS で TXT レコードを設定し、事前に有効化するのが楽なので、そちらの例を記します。
https://developers.cloudflare.com/ssl/ssl-for-saas/common-tasks/hostname-verification

カスタムホスト名を追加すると、当該ホストに対して

```
_cf-custom-hostname.<カスタムホスト名>. TXT "確認用文字列" 
```
が発行されるので、それを顧客権威 DNS サーバに設定します


2. カスタムホスト名に対する証明書の有効化 (Certificate Validation)

証明書の認証局によって検証の方式が変わります
https://developers.cloudflare.com/ssl/ssl-for-saas/common-tasks/certificate-validation-methods

|認証局|方式|備考|
|:-|:-|:-|
|DigiCert|DNS (TXT), DNS (CNAME), HTTP, Email| DNS (CNAME) は GUI では指定できず API で指定。ワイルドカード指定時は HTTP 検証は選択不可|
|Let's Encrypt|DNS (TXT), HTTP|ワイルドカード指定時は HTTP 検証は選択不可|

方式の違いによるメリット・デメリットしては、DNS を切り替え前に証明書をActiveにできるか、手間の多い少ない、あたりになります。

|方式|内容|メリット|デメリット|
|:-|:-|:-|:-|
|HTTP|稼働中のWebサーバで認証トークン配置用のパスを公開|ダウンタイムが許容されるときには楽 (Cloudflare側はHTTP自動対応のため、DNSの切り替えのあとに自動で検証が終わる)|ダウンタイムが許容されない場合、ユーザにより事前に既存 Web サーバでの公開作業が必要|
|DNS|権威 DNS サーバに指定のリソースレコードを追加|DNS 切り替え前に証明書の有効化が行える。カスタムホスト名の有効化と同様 DNS で行える。|権威 DNS サーバの作業が必要|


###DNS リソースレコードのタイプの選択について

DigiCert の証明書を選択する場合、カスタムホストが CNAME 設定してある場合には注意が必要です。

|認証局|タイプ|ドメイン名|値|備考|
|:-|:-|:-|:-|:-|
|DigiCert|TXT|<カスタムホスト名>|<文字列>|カスタムホストが権威サーバ上で CNAME で設定されていると、重複のため追加することができない（あるいはその CNAME を消すか）|
|DigiCert|CNAME|<文字列.カスタムホスト名>|dcv.digicert.com|カスタムホストが権威サーバ上で CNAME 指定で、重複を避けるときはこちらを使う|
|Let's Encrypt|TXT|_acme_challenge.<カスタムホスト名>|<文字列>|既存が CNAME でも関係なく利用可能|

####CNAME での検証に切り替える API の例

https://api.cloudflare.com/#custom-hostname-for-a-zone-create-custom-hostname

```
curl --request PATCH "https://api.cloudflare.com/client/v4/zones/$ZONEID/custom_hostnames/$HOSTID" \
--header "X-Auth-Email: $EMAIL" \
--header "X-Auth-Key: $APIKEY" \
--header 'Content-Type: application/json' \
--data-raw '{
    "ssl": {
        "type": "dv",
         "method": "cname"
        }
}'
```

##Cloudflare Developers の補足

###フォールバックオリジンの設定例
https://developers.cloudflare.com/ssl/ssl-for-saas/getting-started#step-1--create-fallback-origin-and-cname-target

フォールバックオリジンの他にワイルドカードの CNAME を一つ追加してあります。
![Screen Shot 2021-12-21 at 0.33.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/41592b8b-3047-04d9-a368-ea867368ffdf.png)

各カスタムホストの権威 DNS サーバで共通の Fallback origin を利用する代わりに、カスタムホストごとに個別の指定して、少しでもわかりやすくするようにという意図だと思います。
![Screen Shot 2021-12-21 at 0.42.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/13064a12-d615-ef0e-a63a-4a49e57019f5.png)
↓
![Screen Shot 2021-12-21 at 0.44.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/20fb95a8-fc67-fd88-5e3e-a7d861b2ae7b.png)

DNS クエリの例
![Screen Shot 2021-12-21 at 0.39.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/377813fd-ad2f-ef0c-346f-b413f22d8230.png)

###カスタムオリジン
フォールバックオリジン以外に、カスタムホストごとに転送先を変更する機能になります。
注意点としては、カスタムオリジンを設定した際は SNI がカスタムオリジンの値になることです。カスタムホスト名で維持したい場合は、Cloudflare のアカウントチームに依頼する必要があります (SNI rewrite)。
https://developers.cloudflare.com/ssl/ssl-for-saas/hostname-specific-behavior/custom-origin
![Screen Shot 2021-12-21 at 0.52.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/a8e89b2b-4562-1732-b834-4d7374b5bbf4.png)

###Analytics
トラフィック分析の画面では、カスタムホスト名ごとのトラフィック利用状況を可視化・分析します。
各顧客ごとの把握が簡単にでき、課金などの情報源として利用することが可能です。
また、GUI だけでなく、GraphQL によって同様の情報取得も可能で、活用の範囲が広がります。
https://blog.cloudflare.com/introducing-custom-hostname-analytics/

![Screen Shot 2021-12-21 at 1.00.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/69e1aaa2-28c6-2c5b-77b7-ba4c3f272c7b.png)

###よりスケールさせるために (Custom Metadata)
SSL for SaaS では数千〜数万のカスタムホストを受け入れることもあります。
その際に Page Rules での制御が上限に達することがあります。その場合、Cloudflare Workers との連携機能を利用することで、効率よく制御することが可能になります。
https://developers.cloudflare.com/ssl/ssl-for-saas/hostname-specific-behavior/custom-metadata

###プランの概要
今回の説明はほぼ Enterprise プランでの内容になります。
Free/Pro/Business の場合は機能が制限されています。
https://developers.cloudflare.com/ssl/ssl-for-saas/plans

![Screen Shot 2021-12-21 at 0.47.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/92a309b7-c627-cf6e-7f23-4ee7fff4ddaa.png)

##まとめ
Cloudflare SSL for SaaS では上記の DNS や TLS、HTTP Proxy の他にセキュリティ機能（DDoS防御、Firewall Rules、WAF、Bot Managementなど）やパフォーマンス機能（Cache、Image Resizing、Argo Smart Routingなど）のメリットも合わせて提供が可能です。
SaaS 基盤としての充実のため、検討されてはいかがでしょうか。

##リンク
https://developers.cloudflare.com/ssl/ssl-for-saas
https://blog.cloudflare.com/introducing-ssl-for-saas/
https://blog.cloudflare.com/cloudflare-for-saas-for-all-now-generally-available/
https://blog.cloudflare.com/cloudflare-for-saas/
https://blog.cloudflare.com/whats-new-with-cloudflare-for-saas/
https://blog.cloudflare.com/introducing-custom-hostname-analytics/
https://www.cloudflare.com/en-gb/saas/