GAEとCloudFlare連携の全体像、およびCloudFlare以外のアクセス拒否スクリプト

# はじめに
こんにちは！個人開発者の [go](https://twitter.com/go__gou) です。

私のサービスは料金/セキュリティ対策のためCloudFlareを利用しています。
今回はGAEとCloudFlareを連携するための全体の流れを記載しました。

なおCloudFlare経由以外のアクセスを弾く設定はブラウザから出来ますが、IPが多いため作業が大変です。
そこで簡単に設定ができるシェルスクリプトを作成しましたので時短/ミス防止のためご利用下さい。
(**単純にCloudFlareのIPを指定するだけではなく、GCP用のIP対応もしています。**)

# 全体の流れ
Google App EngineとCloudFlareの連携の全体像は以下です。

- ドメイン入手(Google Domains等)
- カスタムネームサーバー設定(Google Domains → CloudFlare)
- CloudFlareの設定(DNSやセキュリティ設定等) :star: **最後に各項目を説明** :star:
- GCPでプロジェクト作成
- GAEの追加
- EDoS対策として、GAEに課金上限を設定(**クラウド破産防止**)
- GAEにドメイン追加
- SSL署名書を作成([minica](https://github.com/jsha/minica)を利用)
- GAEにSSL証明書を追加(CloudFlare → GAE間のhttps通信に利用)
- GAEにファイアウォール設定を追加 :star: **以下のスクリプト** :star:


# GAEのファイアウォール設定
CloudFlare経由のアクセスのみ受け付けるように設定するシェルスクリプトは以下です。
シェルスクリプト利用前に、以下のコマンドでGCPの対象プロジェクトを設定＆確認しておきましょう。

``` confirm.sh
# 対象プロジェクトを指定
gcloud config set project (PROJECT_ID)

# 対象プロジェクトを確認
gcloud config list
```

ファイアウォール設定では以下のルールを指定しています。

- デフォルト: 全IPを拒否
- ルール1~21:  クラウドフレアのIPを許可 [IP Ranges \| Cloudflare](https://www.cloudflare.com/ips/)
- ルール22~24: GCP用のIPを許可

```gae_firewall.sh
# gcloud app firewall-rules create PRIORITY --action ALLOW_OR_DENY --source-range IP_RANGE --description DESCRIPTION

# CloudFlare IP RANGE https://www.cloudflare.com/ips/
gcloud app firewall-rules create 1 --source-range 173.245.48.0/20 --action allow
gcloud app firewall-rules create 2 --source-range 103.21.244.0/22 --action allow
gcloud app firewall-rules create 3 --source-range 103.22.200.0/22 --action allow
gcloud app firewall-rules create 4 --source-range 103.31.4.0/22 --action allow
gcloud app firewall-rules create 5 --source-range 141.101.64.0/18 --action allow
gcloud app firewall-rules create 6 --source-range 108.162.192.0/18 --action allow
gcloud app firewall-rules create 7 --source-range 190.93.240.0/20 --action allow
gcloud app firewall-rules create 8 --source-range 188.114.96.0/20 --action allow
gcloud app firewall-rules create 9 --source-range 197.234.240.0/22 --action allow
gcloud app firewall-rules create 10 --source-range 198.41.128.0/17 --action allow
gcloud app firewall-rules create 11 --source-range 162.158.0.0/15 --action allow
gcloud app firewall-rules create 12 --source-range 104.16.0.0/12 --action allow
gcloud app firewall-rules create 13 --source-range 172.64.0.0/13 --action allow
gcloud app firewall-rules create 14 --source-range 131.0.72.0/22 --action allow
gcloud app firewall-rules create 15 --source-range 2400:cb00::/32 --action allow
gcloud app firewall-rules create 16 --source-range 2606:4700::/32 --action allow
gcloud app firewall-rules create 17 --source-range 2803:f800::/32 --action allow
gcloud app firewall-rules create 18 --source-range 2405:b500::/32 --action allow
gcloud app firewall-rules create 19 --source-range 2405:8100::/32 --action allow
gcloud app firewall-rules create 20 --source-range 2a06:98c0::/29 --action allow
gcloud app firewall-rules create 21 --source-range 2c0f:f248::/32 --action allow

# URL 取得サービスからのリクエストを許可
gcloud app firewall-rules create 22 --source-range 0.1.0.40 --action allow

# Blobstore または Cloud Storage からのリクエストを許可
gcloud app firewall-rules create 23 --source-range 0.1.0.30 --action allow

# アプリケーションのデプロイ リクエストを許可
gcloud app firewall-rules create 24 --source-range 10.1.0.41 --action allow

# defaultを拒否にして、Cloudflare以外からのアクセスを遮断
gcloud app firewall-rules update default --action deny
```

# CloudFlare設定の各項目
設定画面を見ればわかるので大まかな設定項目のみ説明します。
特にPageRulesでapiをバイパスしてキャッシュしない設定と、EDoS対策を忘れないようにしましょう。

- DNS設定
    - レコード設定
    - DNSSEC設定
- SSL設定
    - Fullを指定(今回はMinicaで作成したSSL証明書を利用するため)
- Firewall設定
    - Torをブロック等
- キャッシング設定
    - キャッシュ時間の設定
- **Page Rules設定**
    - apiのバイパス設定(キャッシュしないよう対策)
- **EDoS対策(クラウド破産防止)**
    - 別途GAEの課金上限を設定