Oracle WAF(Web Application Firewall)を利用してOCM(Oracle Content Management)インスタンスを保護する

# はじめに

*こちらの記事は、Shengjun Zhuさんの協力の下に作成しました。

**Oracle Content Management(OCM)とは**
製品の詳細はこちらを参照ください。](https://www.oracle.com/jp/cloud/paas/dx/overview/)

このガイドでは、Oracle WAF(Web Application Firewall)を利用してOCM(Oracle Content Management)インスタンスの保護を実現する方法を説明します。DNS レコードの CNAME エントリを使用して、自分の管理ドメインへの全てのリクエストを WAF にルーティングされ、さらにOracle Content Managementに適切に転送します。HTTPS サポートを有効にするため、管理ドメインの証明書と秘密鍵を事前に用意する必要があります。

**アーキテクチャ図**
![architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/a0b5614d-0fdd-3e6f-b88c-663878765aea.png)

**関連リンク**

- [Configure a Web Application Firewall](https://docs.oracle.com/en/cloud/paas/content-cloud/administer/understand-your-deployment-architecture-options.html#GUID-78F5C417-2BCB-4EB9-A4D4-B7C8853C46C3)

## 1.1. OCMインスタンスの作成

1. OCMインスタンス（このガイドでは`ocm01`）を作成します。 （インスタンス作成の[詳細ステップ](https://oracle-japan.github.io/ocitutorials/content-management/)は、こちらを参照ください。）
![create-ocm-instance-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/0e22092e-c387-fa3d-991a-f264452e1c60.png)
2. 後でWAFポリシーの構成に必要になるため、作成したOCMインスタンスのURL（例：`https://ocm01-<tenancy>.cec.ocp.oraclecloud.com/documents/home`）をメモします。
![create-ocm-instance-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/e8ea8f77-cc29-978c-f81f-9fb8e462b718.png)

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

1. クラウドアカウント管理者としてOracle Cloudにサインインします。

1. OCIコンソールで、ナビゲーションメニューから『Webアプリケーション・ファイアウォール』をクリックします。
![create-waf-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/3ff26458-a351-7452-eb93-dd85ebd08679.png)

1. 『WAFポリシーの作成』をクリックします。
![create-waf-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/381135e5-5f7c-9d56-b7f8-9404ec75c230.png)

1. 『非OCI Webアプリケーションを保護する必要がある場合は、ここでレガシー・ワークフローを使用します。』の青文字の “ここ”をクリックします。
![create-waf-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/3ac2d757-682d-c30e-94f6-e6924eaa4803.png)


1. 次の詳細を入力します
   
    - 名前：ポリシーに一意の名前（例えば、ocm_waf）を付けます。機密情報の入力は避けてください。
    - プライマリ・ドメイン：アプリケーションの完全修飾ドメイン名（このガイドは自分のドメイン`www.shengjun.tk`を利用）を入力します。これは、ユーザーがアプリケーションにアクセスするために使用するURLです。このURLは、OCMインスタンスを指します。
    - 追加のドメイン：オプションで、ポリシーを適用する必要があるサブドメインを入力します。
    - オリジン名：オリジンに一意の名前（例えば、ocm01）を付けます。
    - URI：OCMインスタンスのドメイン名を入力します（このガイドでは、作成したOCMインスタンスのドメイン名：`ocm01-<tenancy>.cec.ocp.oraclecloud.com`を入力します）。
![create-waf-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/62337133-dbd7-8386-1c25-6d3b0369a961.png)

1. ポリシーを保存すると、CNAME値を含むメッセージが表示されます。例えば、d`efault-cname-oci.o.waas.oci.oraclecloud.net`。後でドメインのDNS構成のCNAMEを更新するときに必要になるため、この名前をメモしてください。
![create-waf-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/04478904-a9b7-2d07-6f46-fa6302781f42.png)

## 1.3. SSL証明書とキーのアップロード

1. 『設定』をクリックし、『編集』をクリックします。
![create-waf-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/9f881c51-2198-d9fc-1112-be28855a62ac.png)

1. 『HTTPSサポートの有効化』をチェックオンにします。このオプションを選択すると、ブラウザーとWebアプリ間の通信が暗号化されます。
![create-waf-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/15b2188c-e6b0-7a89-2e6e-d691139ca5a6.png)

1. 『設定の編集』ダイアログで、次の詳細を入力します。
   - 証明書ソース：証明書と秘密キーのアップロードまたは貼付け
   - SSL証明書： PEM形式の有効なSSL証明書をドラッグ・アンド・ドロップ、選択または貼付けします。中間証明書も含める必要があります(Webサイト証明書を最初にする必要があります)。 （このガイドでは自分のドメイン`www.shengjun.tk`の証明書を使用）。
   - 秘密キー：PEM形式の有効な秘密鍵をドラッグ＆ドロップ、ファイルを選択、または貼り付けます。秘密鍵はパスワードで保護できません。（このガイドでは自分のドメイン`www.shengjun.tk`の秘密鍵を使用）
   - 自己署名証明書：自己署名証明書を使用してブラウザにSSL警告を表示する場合は、このオプションを有効にします。
   - HTTPからHTTPSへのリダイレクト：このオプションを有効にすると、すべてのHTTPトラフィックが自動的にHTTPSにリダイレクトされます。
   - 変更の保存をクリックします。
![create-waf-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/6b3bf9c9-fe9e-4210-4f2a-0058d31354ac.png)

2. WAFポリシーの更新が未公開の変更に表示されます。『すべて公開』をクリックします。
![create-waf-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/b4328930-7d5f-8e8e-ef0d-ed2f4b0cbfbe.png)

3. 『変更の公開』ダイアログで、『すべて公開』をクリックします。
![create-waf-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/828f5f34-3e73-a0b3-6199-ba596103f6b3.png)

## 1.4. DNS構成を更新する

DNS構成で、ゾーンのCNAMEを更新して、インターネットクライアントからのリクエストをWAFにルーティングします。DNS設定が別のプロバイダーに存在する場合、それらのドキュメントを参照してください。

1. OCIコンソールのナビゲーションから、『ネットワーキング』に移動し、『DNS管理』の配下にある『ゾーン』をクリックします。
![dns-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/aa8ec7c0-d957-43c6-4329-f182dcc2f5a0.png)

2. レコードを更新するプライマリドメイン（このガイドは自分のドメイン`shengjun.tk`）のゾーン名をクリックします。ゾーンの詳細とレコードのリストが表示されます。
![dns-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/d429c853-8491-4972-6834-2e26bdc21761.png)

1. CNAMEレコードが存在しない場合、『レコードの追加』を、CNAMEレコードが存在する場合、 CNAMEレコードのチェックボックスをオンにし、『アクション』ドロップダウンメニューから『編集』を選択します。このガイドでは、 `www.shengjun.tk`と言う名前のCNAMEレコードを追加します。『レコードの追加』ダイアログボックスで、次を入力します。
   - レコード型：CNAME
   - 名前： `www.shengjun.tk` 
   - TTL：30（秒）
   - ターゲット：メモしたCNAMEターゲット`default-cname-oci.o.waas.oci.oraclecloud.net`
![dns-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/c698fcb6-36dc-d0f7-0cce-3c3e503f629f.png)

1. 『送信』をクリックします。『変更の公開』をクリックします。確認ダイアログボックスで、『変更の公開]をクリックします。これにより、`www.shengjun.tk`へのリクエストをWAFにルーティングします。
![dns-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/28c58c59-cd1d-ae7c-1747-ab527fd085c8.png)

## 1.5. インスタンスでWAFを構成する

1. OCMインスタンスの詳細画面で『WAFの構成』をクリックします。
![ocm-waf-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/c48c7c10-2978-b6ed-898a-7bbfb3f812c9.png)

1. 『Webアプリケーション・ファイアウォールの構成』ダイアログで、前に作成したWAFポリシーを選択します。WAFポリシーが別のコンパートメントにある場合は、『コンパートメントの変更』をクリックし、正しいコンパートメントを選択します。『変更の保存』をクリックします。
![ocm-waf-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/769a1a77-f0c1-69de-9797-7e32946fdc1a.png)
2. 管理者としてOracle Content Management webアプリケーションにサインインした後、ナビゲーション・メニューの管理領域で「システム」をクリックします。「システム設定」ドロップダウン・メニューで、「ドメイン」を選択します。「簡易管理ドメイン」ボックスに、CNAMEレコードに追加したドメイン (`www.shengjun.tk`)を入力し、「保存」をクリックます。
![ocm-waf-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/3e9f148d-1af4-b4a1-9c0e-378b6d6895dd.png)

2. 簡易管理ドメインの追加には、最大30分かかります。このプロセスが完了すると、ドメインが機能していることをテストするよう求める電子メールを受信します。
![ocm-waf-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/40fe3376-6aee-4635-1a22-cfadad0feebb.png)
![ocm-waf-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/175b7b49-a23c-4e56-a5c4-eb9e4820e7af.png)

3. 電子メールを受信した後に、Oracle Content Management web画面をリフレッシュします。そちらから「ドメインの検証」をクリックします。60分以内にドメインを検証する必要があります。そうしないと、変更が元に戻されます。 
![ocm-waf-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/ade5355f-61c3-b808-83bc-528063df3763.png)

4. ドメインを検証すると、「ドメインがアクティブです」というメッセージが表示されます。Oracle Content Managementによって、簡易管理ドメインを介してインスタンスにアクセスできることを通知する電子メールがすべてのユーザーに送信されます。
![ocm-waf-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/88a42894-252b-43bf-a5f7-371c631d8211.png)
![ocm-waf-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/f88d9900-b069-c8b4-2e17-8b362b238e43.png)

## 1.6. WAFとOCMの連携の動作確認

1. `https://www.shengjun.tk/documents/home`をアクセスし、OCMサイトが表示することを確認します。（自己署名証明書を利用する場合、警告が表示されたら、承知した上で続行します）
![confirm-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/ef405373-3dfd-b49c-3b9a-280cb2ab5e94.png)
1. オリジナルOCMインスタンスのURL（例：`https://ocm01-<tenancy>.cec.ocp.oraclecloud.com/documents/home`）をアクセスし、設定した簡易管理ドメイン（`https://www.shengjun.tk/documents/home`）に自動的にリダイレクトされることを確認します。

## 1.7. WAFポリシー更新

1. 作成したWAFポリシー`ocm_waf`を更新します。WAFポリシー詳細画面で『保護ルール』をクリックし、`Shellshock exploit attempt` を保護ルールから選択し、ブロックをクリックします。
    
    ```
    画面左側の『フィルタ』から、ルールIDによる保護ルールの検索が可能です。
    保護ルールID:1000000から検索してください。

    Shellshock exploit attemptはシェルからの攻撃を指します。
    ```
![update-waf-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/d1037912-b31f-2669-56b0-c26986cd75bf.png)
2. 続いて、保護ルールの『設定』のタブを開きます。『ルール設定の編集』をクリックします。
![update-waf-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/2aff57e0-a16f-b43d-b47c-6649b4d8f33b.png)
3. 『ルール設定の編集』画面にて、ブロック・アクションを『エラー・ページを表示』に変更し、画面下部の『変更の保存』ボタンをクリックします。
![update-waf-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/7a2577ee-b7b4-4dcd-17a5-84b07c664c43.png)
4. WAFの更新を公開します。20-30分ほどで、変更内容が公開されます。
![update-waf-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/1f98ee7f-6203-b28d-17ca-72d884b6fbbe.png)

## 1.8. 再度WAFとOCMの連携の動作確認


1. Curlコマンドでアプリにアクセスできることを確認PCでターミナルを開き、以下コマンドを入力します。

    `$ curl –k https://www.shengjun.tk/documents/home(-k オプションで自己署名証明書の警告を無視できます)`
 ![confirm-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/05e9ef24-7617-d91e-92d5-73dc5ff88406.png)

1. 続いて、攻撃コマンドを実行します。保護ルールで設定した エラー・メッセージが表示されます

    `curl -A -k "() { :;};echo Content-type text/plain;echo:/bin/cat/etc/passwd" https://www.shengjun.tk/documents/home`
![confirm-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/e782364e-ab4e-c972-22e8-c447739e47e5.png)

1. WAFポリシーの詳細画面で、『ログ』をクリックします。WAFポリシーのログが表示されます。
    ```
    デフォルトは、直前のログだけ表示されます。
    ログが見つけない場合、フィルタ条件の『開始日』、『開始時間』、『終了日』または『終了時間』を変更してください。
    ```

![confirm-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597244/9705eeaf-4e7d-edd7-9f40-459af8314050.png)


**以上になります。**