OCI Load Balancerに直接アタッチするタイプのWeb Application Firewallを構成する

# 本記事で取り扱う内容
OCIでは2種類のWAFを提供しています。
1. Global WAF
2. Regional WAF

OCIのLoad Balancerを使用してVCN内に構築されているアプリケーションをOCIのWeb Application Firewallで保護する手順を紹介します。

# 1.前提知識の確認

### 1.1 Global WAFとは
OCI Load Balancerに直接デプロイするWAFです。
Global WAFは以下の通りです。
- エッジポリシーによるアクセス制御
- 世界中に点在するエッジノードをプロキシとしてWebトラフィックをフィルタ。
- IP Anycastによって一番近いPOPを経由する。※POP(Point of presence)ネットワークのインターフェース・ポイント
- -外部公開システムで利用するポリシー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763355/0627cda0-6486-0957-0c19-4e7e8ca43ffd.png)


### 1.2 Regional　WAF
サービス概要：お客様のアプリケーションのドメインに構築するWAF
- WAFポリシーによるアクセス制御
- OCI VCN内部でOCIロードバランサーにアタッチすることで透過的に動作する。
- 外部公開システムの他、プライベート通信でも利用可能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763355/9648ec77-90eb-031f-fc57-7728ae52b160.png)


それでは、いよいよWAFをデプロイしていきます！
# 手順
### 1. IAMポリシーの作成
OCIコンソール＞アイデンティティとセキュリティ＞ポリシーに移動
こちらから操作を実行するユーザーに以下のポリシーが付与されているか確認し、されていなければ以下のポリシーを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763355/603519b6-296f-5d4c-cfa4-9961fb0cd5ce.png)

ポリシーの作成
```
allow group <IAMグループ名> to manage waas-family in tenancy/compartment <コンパートメント名>
allow group <IAMグループ名> to manage web-app-firewall in tenancy/compartment <コンパートメント名>
allow group <IAMグループ名> to manage waf-policy in tenancy/compartment <コンパートメント名>
allow group <IAMグループ名> to manage waf-network-address-list in tenancy/compartment <コンパートメント名>
```
## 2.WAFポリシーの設定
OCIコンソール＞アイデンティティとセキュリティ＞Webアプリケーション・ファイアウォールに移動
次に、WAFポリシーの作成をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763355/c153bdca-172b-3fb5-e15c-612a6d0eb174.png)

### 2.1 基本情報の入力
- 名前は任意（今回はTest_WAFとします）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763355/b8d82024-d58d-ca86-7d1e-8ead8cecb3dc.png)

- アクションについて

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763355/3526a758-9ea1-54de-e344-bac34529a0bc.png)
- デフォルトで3種類のアクションが表示されます。
    - 1.Pre-configured Check Action - リクエストを許可するが、ログに記録する
    - 2.Pre-configured Allow Action - アクセスを許可する
    - 3.Pre-configured 401 Response Code Action - リクエストに対し401エラーを返す

    ※事前定義されたアクションのほか、ユーザーがカスタムでアクションを作成することも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763355/ab59b323-1105-3385-2d4c-94d50991b0c5.png)

本記事では、そのままデフォルトのアクションを使用します。

### 2.2 アクセス制御
アクセス制御の画面にて、「アクセス制御の有効化」ボタンにチェックを入れます。

リクエスト制御と、レスポンス制御を設定可能です。
概要はこちら↓
- 特定のURL、IPアドレス、国/地域、HTTPヘッダ（UserAgent含む）、HTTPメソッドに応じて、アクション定義することが可能
- 対応するアクション：チェック、許可、401応答コード or 新しい制御ルール
- カスタムアクションを設定して任意のWebレスポンス・ページを設定可能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763355/0595e004-f435-695b-cff3-fbc69cd1e989.png)

アクセス制御では、日本からのアクセスを許可し、日本以外の国からのアクセスには401コードを返却するようにルールを作成します。

- 名前 - 任意 
    - 例）access-rule1
- Condition type - Country/Region
-  Operator - Not in list
- Countries - Japan
- アクション名 - Pre-configured 401 Response Code Action

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763355/da8d2a29-fd12-8b4a-92f8-ceb65494a3e6.png)

### 2.3 レート制御の作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763355/427513bb-99e4-bebf-1135-7dff0fa712f5.png)
レート制限の画面にて、「レート制限ルールの構成の有効化」ボタンにチェックを入れます。

レート制限の概要はこちら。

- アクセス制御にプラスして、所定期間(秒)あたりのリクエスト制限数を設定し、アクションの継続時間(秒)をオプション指定できる
- 特定の条件 (オプション)に対して対応するアクションを設定することが可能

「レート制限ルールの追加」ボタンをクリックし、以下を入力します。

- 名前 - 任意 
    - 例）Rate-Rule1
- Conditions（optional） - 空欄
- リクエスト制限 - 100
- 期間（秒） - 1
- アクション期間　‐　空欄
- アクション名 - Pre-configured 401 Response Code Action

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763355/c82ee802-98d8-296c-647a-286263ee2c82.png)

### 2.4　保護ルールの有効化
保護ルールの概要はこちら↓
- Open Web Application Security Project (OWASP)のルール・セットとカスタムルール・セットをサポート
- SQLインジェクション、クロスサイト・スクリプティング、およびWAFルール・セットで検出およびブロックできるHTMLインジェクションなど様々な悪意のあるトラフィックからアプリケーションを保護
- 条件はオプションで指定可能

その他色々ありますが、保護ルールではOWASP Top10に分類されるようなWebアプリケーションへの代表的な攻撃、脅威を検知するルールを設定できるようですね。

本チュートリアルでは、リモートコード実行を検知する保護ルールを有効化し、リモートコード実行が検知された場合に401コードを返却するように設定をします。

リクエスト保護ルールの追加」ボタンをクリックし、以下を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763355/f76cfed1-c33b-afec-195a-dae38cf4cfff.png)

名前 - 任意 例）Protection-Rule1
Conditions（optional） - 空欄
アクション名 - Pre-configured 401 Response Code Action
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763355/599f952d-24ac-342b-1200-b4e944c195c1.png)

### 2-5. 強制ポイントの選択
事前準備で予め作成、構成していたファイアウォールを選択し、「次」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763355/32a3f977-9291-65d2-7183-63da49e47279.png)

### 2.6 確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763355/4c8cbf40-95f1-95bb-9256-0cf941728451.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763355/f37d2950-a0f8-517b-f8cd-92439f6b17ec.png)

5分ほどでプロビジョニングが完了します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763355/52f87784-c155-c083-0f6e-07644a51b429.png)
作成したWAFが作成されました！

### WAFの機能確認
試しにロードバランサのPublicIPアドレスにアクセスしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763355/4c9288e5-652e-6bae-ce4f-cdeff6f91b75.png)
IPアドレスを検索欄に貼り付けると、401:Unauthorizedエラーと返ってきます。
WAFで設定したアクセス制御通りに実行されていることが確認できました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763355/51c4a212-cf34-6f79-f744-5c91fedc568b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763355/d43ca2c5-3244-aba8-15dc-76a0260f1d6e.png)
ロードバランサ＞メトリックからもログを確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763355/0c9ac32e-3eed-1bc1-a814-c7474f500e4a.png)

まだまだWAFについては検証したいところですが、今回は一旦ここまで