OCI WAFで脆弱なアプリを保護する - WAFポリシーの場合 -

OCI WAFは、Global WAFと呼ばれるエッジポリシーと、Regional WAFのWAFポリシーという2種類のWAFを作成することができます。Global WAFは、グローバルに展開された各PoPにパブリッシュされ、静的コンテンツのキャッシュにも対応した負荷分散型、Regional WAFは、OCIのロードバランサーに直接アタッチし、OCIのサービスとの連携がより強化されたOCIネイティブ型と区別することができます。

下記のように、それぞれ機能が若干異なりますので、用途に合わせて使い分けが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/d12eecf7-ecc2-f9fc-27e4-ddadab233b0c.png)

ここでは、作成した[DVWA(脆弱なアプリケーション)](https://qiita.com/western24/items/92bc1b82d164d9be41f6)をWAFで保護するまでの設定の流れと動作について紹介します。今回は、Regional WAFを作成していきます。

※詳細な手順は、[OCIチュートリアル](https://oracle-japan.github.io/ocitutorials/id-security/)にもありますので、こちらもあわせてご参照下さい。

# ロードバランサーの作成
DVWAをバックエンドサーバーとするロード・バランサーを作成
OCIメニューから、ネットワーキング -> ロード・バランサー -> ロード・バランサーの作成
- パブリック、フレキシブル・シェイプ最小でOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/59841bd3-754a-2103-0551-cd5820f37cf3.png)

- バックエンドにDVWAのインスタンスを追加し、ヘルスチェックのURLには、/DVWA-master/login.phpを指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/37ebdd5b-2ac5-827a-8e76-94622320c648.png)

- リスナーにはHTTPを指定し、LBのログの有無は好みで作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/cd43cd09-8994-0337-c408-b04d3c154369.png)


- 作成後、バックエンドのヘルスチェックがOKになっていれば完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/d7b90b0b-2798-751a-e1d2-7672b890b81c.png)


## WAFポリシーの作成
OCIメニューから、アイデンティティとセキュリティ -> WEBアプリケーション・ファイアウォール -> ポリシーからWAFポリシーの作成
- WAFポリシーの場合は、このまま次に進み、今回は④の保護ルールを追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/f02b631f-40d0-9718-a109-0f6a9dbc528d.png)

- ルール・アクションで新規アクションの作成、好みのレスポンス・コードとメッセージを追加する。追加後、画面下部の保護機能の選択をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/13beb12a-1367-76bf-96cd-e8a4725faeee.png)

- デフォルトでReccomendedタグになっているので、すべてのルールをチェックして保護機能の選択をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/23277a55-6e81-ac68-75d7-1556fe550206.png)

- ルールアクションと保護機能の追加が完了後に、画面下部のリクエスト保護ルールをクリックする。最終的に下記のようにリクエスト保護ルールにレコードが追加されていればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/fcba1b4c-1ba3-6cfa-558a-430db7a1210f.png)


- 強制ポイントの選択にで、作成したロードバランサを選択して、WAFポリシーの作成を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/09d4cb81-42bb-65bb-b73f-d75ac0a1066e.png)

- WAFポリシーの作成には、約1分ほどで作成される。ログを有効にするためファイアウォールを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/1ac02aa9-3156-a76f-f257-d56b706b8b1c.png)


- ファイアウォールのログを有効にする
ログ・グループがなければ新規作成、ログ名、ログの保持期間はお好みで
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/865379bd-aea7-ab0e-0138-2b78e40c73ea.png)


## ＷAFポリシーの動作確認
ロードバランサーのIPアドレスでDVWAにアクセス
http://LoadBalancerのIP/DVWA-master/login.php

- [この手順](https://qiita.com/western24/items/92bc1b82d164d9be41f6#dvwa%E3%81%AE%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D)でクロスサイト・スクリプティングとSQLインジェクションを実行する。正しくWAFが動作していれば、以下のようなリクエストをブロックしたメッセージが表示される
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/64b33fdb-dcb2-a5a2-9848-e5d6db11320f.png)

- ログを確認
OCIメニューから、管理及び管理 -> ロギング -> ログから作成したWAFのログ名を選択。ブロックされたリクエストのログの詳細が分かる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/f946746d-f35c-b15b-5edd-ab9373d254dd.png)

## Logging Analyticsとのログ連携
LoggingのログはJSONファイルとして格納されており、簡単な検索やグラフの機能を持っているがあまり可読性が良くないので、Service Connector Hub経由でLogging Analyticsにログを転送し、ログを見やすくビジュアライズする
Logging Analyticsの必要なIAMポリシーについて[こちら](https://oracle-japan.github.io/ocitutorials/management/audit-log-analytics/)を参照

- 監視及び管理 -> 関連サービス -> サービス・コネクター・ハブから、サービス・コネクターの作成を選択
- ソースを作成したロギングのWAFログ、ターゲットをログ・アナリティクスに指定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/013bbc07-5f74-3298-4876-03f2cbccdbd4.png)

- Logging Analyticsのログ・グループを指定。(なければ新規作成)。必要なポリシーも自動で作成しておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/9620d9a1-684f-18ff-4e8b-f7b8118ebe32.png)

- 作成したサービス・コネクター・ハブがログ転送開始すればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/2057828a-6d48-cd48-e789-58f3797e4a57.png)

- 監視及び管理 -> ログ・アナリティクス -> ログ・エクスプローラーにWAFのログが表示される。
LoggingのJSONフォーマットは、時間、ステータスコード、URIといったフィールドにマッピングされ、フィルターや文字検索が簡単になる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/d468916b-d6ec-df24-ffa4-135d99ba7ab5.png)

## ログに含まれるIPアドレスからジオロケーション、脅威インテリジェンスを取得する
- WAFのログにあるHost IP Addressには、アクセス元のクライアントのIPアドレスが記録されている。このIPアドレスを引用してジオロケーションや脅威分析の情報を取得するようにWAFのログ・ソースを拡張する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/13e0cf20-bf3e-4bea-3149-af3949550bdb.png)

- ソース -> OCI WAF Logsの編集をクリックし、フィールド・エンリッチメントを追加
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/660d0308-5f19-8535-f6fa-61a290d046de.png)

- ファンクションをジオロケーション、IPアドレスをHost IP Address(Client)とマッピング、脅威インテリジェンスをチェックし、追加、変更の保存を行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/b6ab063c-e19c-7788-95cb-f071159ec17e.png)

- ソースの変更後に取得されたログ・レコードにはClient Host CountryやCity、Threat IPsという新しいフィールドが追加される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/e29d441f-274b-5e7b-dd35-0fca78fa54bb.png)

## WAF用のダッシュボードをインポートする
[このWeb記事](https://blogs.oracle.com/oracle4engineer/post/ja-monitoring-oci-waf--la)で紹介されているOracleのManagementチームが作成したWAF用のダッシュボードをインポートする

```
#Zipファイルをダウンロードし解凍する
wget http://www.oracle.com/webfolder/technetwork/tutorials/sample_JSONs/WAFDashboards.zip

#以下３つのファイルのCOMPARTMENT_IDを自身のテナントのコンパートメントIDに置き換える
WAF_Activity_Overview.json,
WAF_Access_rule_and_Rate_limiting.json
WAF_Protection_Rules.json

sed -i 's/COMPARTMENT_ID/ocid1.compartment.oc1../g' WAF_Activity_Overview.json
sed -i 's/COMPARTMENT_ID/ocid1.compartment.oc1../g' WAF_Access_rule_and_Rate_limiting.json
sed -i 's/COMPARTMENT_ID/ocid1.compartment.oc1../g' WAF_Protection_Rules.json

#ダッシュボードをLogging Analyticsにインポート (※oci-cliが実行できるように事前設定が必要)
oci management-dashboard dashboard import --from-json file://WAF_Activity_Overview.json
oci management-dashboard dashboard import --from-json file://WAF_Access_rule_and_Rate_limiting.json
oci management-dashboard dashboard import --from-json file://WAF_Protection_Rules.json
```

- ログ・アナリティクス -> ダッシュボードに追加される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/7d2edde0-e82e-572b-8dae-e65c6a636cd7.png)

以上がロード・バランサーにアタッチするRegional WAFの設定手順の流れでした。
今回は設定しませんでしたが、WAFポリシーの作成フローには、アクセス制御やレート制限などのポリシーも指定できるので、ポリシーを修正しながら、動作を確認するとより理解が深まるかと思います。[チュートリアル](https://oracle-japan.github.io/ocitutorials/id-security/web-application-firewall-v2/#4-1-%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%AB%E3%83%BC%E3%83%AB%E3%81%AE%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D)にも手順があります。

また、提供されている保護ルールの一覧は[こちら](https://docs.oracle.com/ja-jp/iaas/Content/WAF/Reference/protectionruleids.htm#Supported_Protection_Rules)です。ルールは、Oracleで管理されており、ルールの更新や追加は、決まった日時ではなく非定期でCVEのリスクに応じて柔軟に行われています。
ポリシーのチューニングは運用における永遠の課題ですが、このWAFポリシーの場合、保護ルールをPHP、Weblogic、WordpressなどWAFを運用しているセキュリティ・チームがタグ付けしているので、アプリケーションの用途に合わせてタグで保護ルールを選択し、Logging Analyticdでログ分析をしながら適宜見直していく、というのも泥臭いですが確実なチューニング方法の一つかなとも思います。

次回は、Global WAFであるエッジポリシーでの設定方法を紹介します。