【初心者】AWS Transfer Family Web Apps を使ってみる (2) CloudFront/WAF連携

# 1. はじめに
- 前回の記事「[【初心者】AWS Transfer Family Web Apps を使ってみる](https://qiita.com/mksamba/items/35bb8c70d766c890a346)」で、S3バケットのフォルダ/ファイルを、ユーザ認証をかけた上で外部公開できることを確認した。
- 追加で以下の改善を行う。
    - CloudFront/WAFを追加し、WAFでSRCIP制限を行う(前回記事での設定では、許可されていないSRCIPからもログイン自体はできてしまうため、そもそもログイン画面に到達できないようにする）
    - Route53/ACMで、自ドメインのFQDNをCloudFrontに付与し、ユーザ向けのエンドポイントをわかりやすいURLに変更する。（前回記事の設定ではTransfer Family Web Appsの標準URLを用いているため） 

# 2. やったこと
- AWS公式から提供されているCloudFormationテンプレートを用いて、Transfer Family Web Appsをオリジンとし、カスタムドメイン名を持つCloudFrontディストリビューションを作成する。
- カスタムドメイン名でユーザがWebAppsにアクセスできることを確認する。
- CloudFrontにWAFをアタッチし、SRCIP制限を行う。

# 3. 構成図
## 作業前の構成図（前回の記事で作成した環境）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/5a408442-8ff3-4846-9b49-9ce29ecf0dce.png)
- Transfer Family Web Apps のURLに直接アクセスさせる。

## 作業後の構成図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/121ece0b-3bc4-4045-bbed-d0fac385ac8e.png)
- CloudFrontとWAF(付随してRoute53レコード及びACMでの証明書)を追加。

# 4. 手順
## 4.1 カスタムドメイン名(FQDN)の作成
- Route53 パブリックホストゾーンにて、TransFer Family Web Appsのユーザ向けのエンドポイントとするレコードを作成する。本記事では仮に「webapp-demo.xxxxx.net」とする。(手順は割愛)
- 最終的な設定は 「webapp-demo.xxxxx.net CNAME [CloudFrontディストリビューション名]」とするが、レコード登録時にCloudFrontが未設定のため、いったん適当な値にしておく。

## 4.2 証明書の作成
- 作成したカスタムドメイン名(FQDN)に対する証明書をACMで作成する。(手順は割愛)

## 4.3 CloudFront ディストリビューションの作成
- AWS公式ドキュメント「[Update your access endpoint with a custom URL](https://docs.aws.amazon.com/transfer/latest/userguide/webapp-customize.html)」を用いて、CloudFrontディストリビューションを作成する。
- パラメータとして以下3点を設定する。
    - WebAppEndpoint: Transfer Family WebApps作成時に生成されたURL
    - AccessEndpoint: 手順4.1で作成した、カスタムドメイン名のURL
    - AcmCertificateArn: 手順4.2で作成した、証明書のARN

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/fb20fc0c-8c86-4f5e-a3bb-3dcc27c1f040.png)

- Stackの作成完了後、Transfer Family Web Appsをオリジンとし、カスタムドメイン名が設定されたCloudFrontディストリビューションが作成されていることを確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/a0cbbf7d-4b1c-49fc-94dc-4b7e78ee1f9a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/cb735659-bf91-4343-9210-d090d767f2fa.png)

## 4.4 Route53 レコードの修正
- Route53の該当レコードのCNAME設定を、作成したCloudFrontディストリビューション名に変更する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/b6c4b9f8-3cbc-40aa-a334-06a543c308ba.png)

## 4.5 Transfer Family Web Apps のカスタムURL設定
- 作成済のTransfer Family Web Appsの「カスタムURL」の値を、作成したカスタムドメイン名に変更する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/50e3b398-d252-4a47-9486-47d8e3dd58cd.png)

## 4.6 S3バケットのCORS設定修正
- 対象のS3バケットのCORSの設定(AllowedOrigins)を、作成したカスタムドメイン名に変更する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/30f3d751-dc04-4cc1-8070-478c28a8d3bb.png)


- ここまで設定した内容で以下が実現できる。
    - ユーザ(ohtani)は、カスタムドメイン名を用いてアクセスする。
    - ID認証後、Transfer Family Web Appsにアクセスできる。SRCIPが許可されたものである場合はフォルダ・ファイルの参照が可能だが、SRCIPが許可されていない場合、バケットポリシーによりアクセスが拒否される。

## 4.7 WAFの追加
- SRCIPが許可されたものでない場合、そもそもTransfer Family Web Appsのログイン画面にアクセスできないようにするため、CloudFrontディストリビューションに対してWAFを追加し、SRCIP制限を行う。

- 手順は「[AWS WAFで特定IPのリクエストからアクセス許可しよう](https://www.sunnycloud.jp/column/20210601-01/)」を参照。詳細は割愛するが、主な設定内容は以下。
    - 「IP set」を作成する。アクセスを許可するCIDRのリストを登録する。
    - 「Web ACL」を作成する。
        - このWeb ACLの適用先として、作成したCloudFrontディストリビューションを指定する。
        - Rule typeを「IP Set」として、リストにあるSRCIPからのアクセスを許可する。
        - RuleにマッチしないアクセスはBlockする。

- WAF設定の追加後、許可されたSRCIP以外からカスタムドメイン名にアクセスすると、403 ERRORとなるようになった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/09f326f9-064a-4bb5-8031-8274023238b3.png)

# 5. 所感
- SRCIP制限をより確実な形で実装することができて満足感があった。コストは余計かかってしまうが、、