ネットワーク初心者が OCI WAF で不正アクセスを防御できるか試してみた (設定と保護ルール編)

## WAFの基本動作
OCI WAFは下図の手順で動作するものと理解してます。

![image-20200908165129125.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/665c06f2-9e44-de9f-2e93-198cfc178af5.png)

1. Webサーバ（オリジン）にアクセスするためDNSサービスへドメイン名（web.cocotaro.com(例)）の名前解決を問合せる

2. ドメイン名の別名として定義したWAFのエンドポイント（xxx.waas.oci.oraclecloud.net(例)）へ転送

3. WAFのエンドポイント（xxx.waas.oci.oraclecloud.net(例)）にアクセス。
   **WAFでトラフィックが多層の防御フローで分析され、不正なトフィックを防御**

4. 正常なトラフィックのみオリジンサーバへ転送

   

## テストするために事前に必要なもの

- 外部公開用のドメイン名
お試し用のドメインがなければ、**お名前.com** などから取得してください。

- オリジン（Webサーバ、もしくはロード・バランサ）のグローバルIPアドレス
  今回は Apache をコンピュートインスタンスにインストールし、サンプルのWebページを使用します。
 Webページについては任意のものを用意ください。

- SSL/TLSサーバ証明書 (※暗号化が必要な場合) - 今回は使用しません
![image-20200908171428335.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/950ffc35-ebee-f1a6-fc08-77234b2311e9.png)

## DNS 関連の用語

これまでネットワーク、DNSのしくみはよく知らなかったため、WAFの設定項目を見てもなんかピンとこなかったのですが、以下のDNS用語を知ることで OCI WAF の設定の意味と動きが理解できた気がしました。私含めネットワークに詳しくない方のためにも記載しておきます。既にご存知の方はスキップしてください。

|    DNS用語    | 意味                                                         |
| :-----------: | :----------------------------------------------------------- |
|      DNS      | DNS(Domain Name Service)はドメイン名をIPアドレスに変換してくれるサービス |
|   Aレコード   | Aレコードはアドレス(Address)のAからきており、名の通りドメイン名をIPアドレスに置き換える  例. web.cocotaro.com → 140.238.49.129 |
| CNAMEレコード | CNAMEレコードはキャノニカルネーム(Canonical NAME)の略でドメインを別のドメインに置き換える。特定のドメインを別のドメインに転送する場合に使用する。|

###### OCI WAF では CNAMEレコードを使い、オリジンへのリクエストを WAFのエンドポイントへ転送し、OCI WAFで不正なトラフィックを検知したり防御したりします。



## OCI WAF 設定

WAFの設定は、以下の２ステップです。

### 1. WAFポリシーの作成

ナビゲーションメニューから[セキュリティ]-[Webアプリケーション・ファイアウォール] を選択し、**WAFポリシーの作成**をクリックします。
![image-20200909131937795.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/5a2b4569-4e1b-acff-9f03-2bcd6204770a.png)
**[ポリシー名]** 任意のポリシー名
**[プライマリ・ドメイン**] 外部公開用ドメイン名
**[オリジン名]** オリジンのドメイン名
**[URI]** オリジンのグローバルIPアドレス

入力後、**WAFポリシーの作成**をクリックします。
![image-20200909132829520.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/a57f200d-2e91-bce6-0c76-65435a638a3e.png)
WAFポリシーが作成されると、DNSに登録する**CNAME（WAFのエンドポイント）**が表示されるのでコピーします。

### 2. DNSへのCNAMEレコードの登録

ナビゲーションメニューから[ネットワーキング]-[DNSゾーン管理] を選択し、DNSゾーンを選択します。ここでは ドメイン登録済みの cocotaro.com を選択します。
![image-20200909134211456.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/1d0e477a-3b60-3a25-2fe2-5a49175fc27e.png)
[レコード]を選択し、**レコードの追加**をクリックし、DNSへCNAMEレコードの登録をおこないます。
![image-20200909134751298.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/8f9b1ad5-ce16-f44e-f624-d811082aa733.png)
**[レコード型]** CNAMEを選択
**[名前 オプション**] web.cocotaro.com
**[TARGET(ターゲット)]** WAFポリシー作成時にコピーしたCNAME（WAFのエンドポイント）を入力します。

入力後、**送信**すると、レコードにCNAMEが追加表示されます。選択して**変更の公開**をクリックします。確認画面で、**変更の公開** をクリックすると、CNAMEの登録が公開されます。
![image-20200909140032694.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/6d5d0abe-f4b7-cf7c-e4bf-22d01687c58f.png)
変更の公開が反映されると、web.cocotaro.com へのリクエストは、WAFのエンドポイントへ転送されることになります。nslookup するとWAFのアドレスを指していることが確認できました。
![image-20200909141203174.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/a9522434-8be1-5db4-f1d3-de28c6740112.png)
続いてWAFの保護動作について試していきます。

## どうやって防御するのか
### 保護ルール
OCI WAF での不正アクセスや攻撃への検知／防御は保護ルールを使います。OCI WAF では現在643件（2020年9月時点）の保護ルールが事前定義されています。これらは適宜更新されています。
![image-20200910140444561.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/08a00e21-a86b-d973-f61c-c7e587a613c7.png)
## 1. 特定の保護ルールでの防御
事前定義済みの保護ルールから特定の保護ルールを選択し不正アクセスをしかけます。
#### 保護ルール 950002 "System Command Access" の不正アクセスをWAFで防御できるか？

### 保護ルールの設定
**保護ルール 950002** を選択し、検出時に**ブロック**(防御)するに変更します。特定の保護ルールを複数ページで探すのはたいへんなので、左下の**フィルタ**の機能をうまく使いましょう。
![image-20200910142047544.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/c530989d-79ba-b921-3d72-e4cf3b52d7e8.png)

**ブロック**（防御）を選択すると、
![image-20200910142336491.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/fcd3816d-de47-7ac5-ea0d-a846570d9b4a.png)

保護ルールの画面上部に公開するかを聞かれるので、**すべて公開**をクリックし公開します。
![image-20200910142704164.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/7aa47513-e301-4101-b71b-918754fbc67a.png)
### 防御できるか？
更改完了後に、コマンド、及びブラウザからWebサーバ（オリジン）に 950002 に該当するアクセスをおこないます。

コマンドからアクセス![image-20200910144452585.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/a1fb593b-ac26-5c7a-54a3-a2c10e91f392.png)

ブラウザからアクセス![image-20200910144422529.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/5304e60b-50d2-6dd1-a5bc-f819f30911e5.png)

**403 Forbidden が返されブロック（防御）されていることが確認できました。**

### 2. 保護ルールをすべてブロックとし、ログからも防御を確認
### 保護ルールの設定
保護ルール すべてを**ブロック**（防御）に設定します。
![image-20200910153157601.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/155f5b67-61dd-0d2c-ba3d-e1f21a9e24e5.png)

すべての保護ルール（643件）を**ブロック**（防御）で公開します。
![image-20200910153313379.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/4537baf9-b756-156f-f870-731eaba356e5.png)

公開されるまで、しばらく時間を要します。
![image-20200910153350088.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/eae4e10d-b402-9a09-6ad8-9d63651b592c.png)

#### 防御できるか？

公開完了後に次のコマンドを実行してアクセスを試みます。

**保護ルール 981317 “SQL SELECT Statement Anomaly Detection Alert” **を複数回実行します。

```
curl -lvk -verbose http://web.cocotaro.com/JS/displayName.js/?a=select%26b%3Dunion%26c%3Dtop%26d%3Dwhere%0A
```
![image-20200910161815523.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/692cc5f6-2c36-9ecb-5576-6d0b618a5e89.png)
また、複数回のアクセス後にログを参照するといくつかブロックされたことが確認できます。
![image-20200910162323452.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/e39eec88-a1f4-98a2-1735-1b3959ee910d.png)
各ブロックの行を展開し、**JSONの表示**をクリックすればさらに詳細なブロック情報が表示されます。
![image-20200910162943519.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/55e43804-1260-d945-7a89-9f1f987057de.png)

**403 Forbidden が返されブロック（防御）されていました。またログからもブロック（防御）されていることが確認できました。**

## まとめ
OCI WAF の基本の動きを理解すれば設定自体も非常に簡単で、WAFを使って素早く安全対策をうてることがわかりました。次回はBotの防御を予定しています。
## 参考URL
[Supported Protection Rules](https://docs.cloud.oracle.com/en-us/iaas/Content/WAF/Reference/protectionruleids.htm)