AWS WAFをAPI Gatewayに設定してみた

# 背景・目的
[API Gatewayを試してみた（REST API）](https://qiita.com/zumastee/items/b11bb6653f3f46adb674)で作成したAPIに、AWS WAFを設定してみます。

# サマリ
- WAFは簡単に構築でき、AWSリソースに簡単にアタッチ可能でした。
- ルールが最新化されていき信頼性が高いと感じました。
- AWS Managerdルール、Market Placeのベンダールールが豊富にあり、要否を判断するには、深い知識が求められ選定が難しそうと感じました。

# 概要
## そもそもWAFとは？
- [Wikipedia](https://ja.wikipedia.org/wiki/Web_Application_Firewall)の内容を以下に抜粋します。
> Web Application Firewall（略称:WAF、ワフ）とはウェブアプリケーションの脆弱性を悪用した攻撃からウェブアプリケーションを保護するセキュリティの一種[1]。

- Web Application Firewallの略。ワフといいます。

> WAFはウェブサイトの前に設置し、ウェブアプリケーションの脆弱性に対する攻撃と思われる通信の遮断等を行うものであり、LANとインターネットの境界などに設置されることが多い通常のファイヤーウォールとは（その名称にもかかわらず）機能が異なる[4]。WAFが検知する攻撃はウェブサイトへのものに特化しており、HTMLを解釈してクロスサイトスクリプティングやSQLインジェクションなどの攻撃を遮断する。

- 以下の特徴を持ちます。
    - ウェブアプリの前に通信の遮断を行う。
    - 検知する攻撃対象は、ウェブサイトへのものに特化
    - XSSやSQLインジェクションなど遮断する。

> 攻撃を遮断する点においてIPSと類似するが、IPSはOSやファイル共有サービスなど様々なものに対する攻撃を遮断するために不正な通信パターンをブラックリストとして登録しておくのに対し、WAFの防御対象はウェブアプリケーションに限定されている為ブラックリスト型の遮断のみならず、正常な通信を事前登録してホワイトリスト型の遮断も行うことができる[5]。

- ブラックリスト型とホワイトリスト型の両方に対応できます。（遮断できる）

> WAFにはHTTP通信（リクエスト、レスポンス）を検査し、検査結果に基づいて通信を処理し、処理結果をログとして出力する機能がそなわっている[6]。通信の検査は前述のようにホワイトリスト、ブラックリストを用いて行う。検査結果に基づいた通信の処理としては、そのまま通過させる、エラー応答を返す、遮断する、通信内容の一部を書き換えた上で通過させる、という４通りがある[7]。またセッションのパラメータの正当性やHTTPリクエストの正当性を確認してCSRF等の攻撃を防ぐ機能、ウェブサイトの画面遷移の正当性を確認する機能、ホワイトリストやブラックリストを自動更新する機能、ログをレポートの形で出力する機能、不正な通信を管理者にメール等で通知する機能等がついている事もある[8]。

- 以下の機能を有します。
    - ログ出力機能
    - 通信の検査機能
        - 通貨
        - エラー応答
        - 遮断
        - 一部を書き換える（サニタイズ）
    - セッションのパラメータの正当性、HTTPリクエストの正当性の確認機能
    - Webサイトの画面遷移の正当性確認機能
    - ホワイトリスト、ブラックリストの自動更新機能
    - ログレポート出力機能
    - 管理者へのメール通信機能

> WAFはウェブアプリケーションがあるサーバ（＝ウェブサーバ）にインストールする場合と、ウェブサーバとインターネットの間に別サーバを設置してそこにインストールする場合がある。

- Webアプリケーションの前に検査するので、Webサーバにインストールするタイプと、Webサーバの前に配置するパターンがある。

## AWS WAFとは？
- 上記に記載したWAFの機能に加えて以下の特徴を有します。

### ウェブ攻撃に対する俊敏な保護
- AWS WAF ルールの伝播と更新には1分もかからない。これにより、問題が発生した場合に環境全体のセキュリティをすばやく更新可能。
- WAF は、着信トラフィックへの遅延の影響を最小限に抑えながら、ウェブリクエストのあらゆる部分を検査できる数百のルールをサポート。

### マネージドルールにより時間を節約する
- AWS WAF 用のマネージドルールにより、素早く開始して、ウェブアプリケーションまたは API を一般的な脅威から保護できる。
- Open Web Application Security Project (OWASP) の上位10のセキュリティリスク、コンテンツ管理システム (CMS) 固有の脅威、または新しい Common Vulnerabilities and Exposures (CVE) などの問題に対処するルールなど、多くのルールタイプから選択可能。
    - マネージドルールは新しい問題が出現すると自動的に更新されるため、アプリケーションの構築により多くの時間を費やすことが可能。
- 向上したウェブトラフィック可視性
    - AWS WAF は、ウェブトラフィックに対するほぼリアルタイムの可視性を提供。これは、CloudWatch で新しいルールまたはアラートを作成するために使用可能。
    - メトリックの発行方法をきめ細かく制御できるため、ルールレベルからインバウンドトラフィック全体までモニタ可能。
    - セキュリティの自動化、分析、または監査の目的で使用するために、検査された各ウェブリクエストの完全なヘッダーデータをキャプチャすることにより、包括的なログを提供する。

### 簡単なデプロイとメンテナンス
- 以下にデプロイ可能。
    - Amazon CloudFront
    - EC2 上で動作するウェブサーバー
    - オリジンサーバーの手前に配置した Application Load Balancer
    - REST API を使用するための Amazon API Gateway
    - GraphQL API 用の AWS AppSync

### ボットの監視、ブロック、リミット制限が簡単に
- AWS WAF Bot Control によって、アプリケーションへの一般的で普及しているボットトラフィックの可視性とコントロールが得られる。
- AWS WAF コンソールでは、ステータスモニターや検索エンジンなどの一般的なボットを監視可能。
- ボットのトラフィックのカテゴリ、ID、およびその他の特性を詳細にリアルタイムに可視化可能。
- スクレイパーやスキャナー、クローラーといった、普及しているボットからのトラフィックをブロックまたはレート制限可能
- AWS Firewall Manager を使用すると、AWS 組織にある複数のアカウントにわたり、ボットコントロールマネージドルールグループをデプロイ可能。

### アプリケーションの開発方法に統合されたセキュリティ
- すべての機能は、AWS WAF API または AWS マネジメントコンソールのいずれかを使用して設定可能。これにより、DevOps チームがアプリケーションを開発する際のウェブセキュリティを向上させる、アプリケーション固有のルールを定義可能。
- これは、最初にコードを記述するデベロッパーから、ソフトウェアをデプロイする DevOps エンジニア、そして組織全体でルールのセットを実施するセキュリティ専門家まで、開発チェーンの複数のポイントでウェブセキュリティを実装することを可能にする。

# 実践
[AWS WAFの開始方法](https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/getting-started.html#getting-started-aws-account)をもとに試してみます。

## ステップ 1: AWS WAF セットアップ
- 設定済みなので省略。

## ステップ 2: ウェブ ACL を作成する
1.AWS WAFファイアウォールのトップページで「Create web ACL」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/0ed86f5c-b61b-5535-3a32-92a6febee1e8.png)

2.以下の項目を設定し、「Next」をクリックします。
- Name
- Description
- CloudWatch metric name
- Resource TypeをRegional resources
- Region をAsia Pacific(Tokyo)
- Associated AWS resourcesにAPI GatewayのAPI
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/859e9486-b430-14e1-41fd-27340d44cb58.png)

### ステップ 3: 文字列一致ルールを追加する
1. Add rulesのプルダウンで「Add my own rules and rule groups」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/28d936fb-3111-b3d8-0476-0b7c190a2e4b.png)

2.以下の項目を入力し、「Add rule」をクリックします。
- Rule TypeをRule builder
- Rule Name
- TypeをRegular rule
- if a requestを、matches the statement
- inspectをHeader
- Header field nameをUser-Agent
- Match TypeをExactly matches string
- String to matchをMyAgent
- Text TransformationをNone
- ActionをCount
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/0392148d-557d-c780-cb6e-add1e86d065b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/edb02799-47e6-a614-cb8c-886eade5359f.png)


### ステップ 4: AWSマネージドルールグループの追加
1.Add rules and rule groupsの画面でAdd rulesから、Add managed rule groupsを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/17c113ec-0bd9-f49e-ead1-61a12ddfe413.png)

2.該当するルールをEnable＆Editで有効化するルールを詳細に設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/aa842f1b-3ab9-3077-e3ee-0cc81937213d.png)

3.最後にAdd ruleをクリックし元の画面に戻り、Nextをクリックします。

### ステップ 5: ウェブ ACL の設定を完了する
1.Set rule priorityの画面で、選択したルールの優先度を上下に動かして変更します。独自のルールのweb-acl-ruleを一番下に移動し、Nextをクリックします。

2.Configure metrics画面で、Amazon CloudWatch metricsの名前を確認(変更も可)します。
3.Request sampled optionsで「Enable sampled requests」（**※後述**）を選択しNextをクリックします。
4.最後に確認画面で、問題なければ「Create web ACL」をクリックします。

## API Gatewayの確認
- WAFの欄に、ウェブACLが設定されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/439aaf68-2b61-4283-981f-f89dc725bb60.png)

## ウェブリクエストのサンプルの表示
[ウェブリクエストのサンプルの表示](https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/web-acl-testing.html#web-acl-testing-view-sample)を参考に試す。

1.Web ACLsで作成したACLをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/06fbf7a5-7f04-1337-84fb-f088ac4a1c2c.png)

2.Sampled requestを確認します。
- 表示されない。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/02d1334e-4f7d-a4ca-dae9-963805f56c51.png)

# 考察
- 今後は、OWASPなどのセキュリティ知識を高めていく。
- サンプルが表示されないので、今後、原因調べる。

# 参考
https://ja.wikipedia.org/wiki/Web_Application_Firewall

https://aws.amazon.com/jp/waf/

https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/getting-started.html#getting-started-aws-account

https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/web-acl-testing.html#web-acl-testing-view-sample

https://aws.amazon.com/jp/waf/pricing/