IBM CIS(Cloud Internet Services)でカスタムのエラーページを作成する

#1. はじめに

IBM CIS(Cloud Internet Services)ではエラーページはデフォルトで準備されています。例えば以下はIP Blockをされた時のエラーページです。

<img width="1254" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/11303990-9ab0-f784-3c3c-485f0459541c.png">

でも、エラーページを個別に用意したいということもありますよね？最近、CISにエラーページをカスタムで作成する機能が実装されたので、この記事でご紹介いたします。なお、

- この機能はStandard/Enterpriseの両方のプランで利用可能です。
- ドキュメント（コマンド解説？）は[こちら](https://cloud.ibm.com/docs/cis-cli-plugin?topic=cis-cli-plugin-cis-cli-commands#custom-page)です。

#2. ibmcloudコマンドラインの導入・更新

CISのPluginとしてv1.4.0で動作確認しています。
（本機能はv1.4.0から実装された機能です）

```
# ibmcloud update

# ibmcloud plugin install cis

# ibmcloud plugin list
インストール済みプラグインをリストしています...

プラグイン名                       バージョン   状況
cloud-internet-services            1.4.0

# ibmcloud cis |grep custom
     custom-page-update           Update a specific custom page.
     custom-page                  Retrieve a specific custom page.
     custom-pages                 Retrieve a list of currently existing custom pages.

# ibmcloud cis custom-page-update -help
名前:
   cloud-internet-services custom-page-update - Update a specific custom page.

使用法:
   ibmcloud cis custom-page-update PAGE_ID PAGE_URL [-d --domain DNS_DOMAIN_ID] [-i, --instance INSTANCE_NAME] [--output FORMAT]

引数:
   PAGE_ID The name of the Custom Page type. 有効な値: "basic_challenge", "country_challenge", "ip_block", "ratelimit_block", "serve_stale_content", "under_attack", "waf_block", "waf_challenge", "1000_errors", "500_errors".
   PAGE_URL A URL that is associated with the Custom Page. E.g. "http://www.example.com/example.html". Value "default" means to use the default page.

オプション:
   -d value, --domain value    DNS ドメイン ID。
   -i value, --instance value  インスタンス名。 設定しない場合、'ibmcloud cis instance-set INSTANCE' によって指定されるコンテキスト・インスタンスが使用されます。
   --output value              出力フォーマットを指定します。現時点では JSON のみがサポートされます。
```

#3. エラーページの作成
エラー発生時に表示するエラーページを作成しておきます。今回は以下を利用することにします。
`http://<My CIS Domain>/ipblock.html`

#4. カスタムエラーページの設定

カスタムエラーページを作成するためには、Instance名やドメインIDが必要です。以下のコマンドで確認してください。

```
# ibmcloud cis instances
サービス 'internet-svcs' のサービス・インスタンスを検索中...
OK
名前                        ID                                                                                                                     ロケーション   状態     サービス名
CIS-Enterprise-Usage1       crn:v1:bluemix:public:internet-svcs:global:a/039dbe6794084c7cb514a276dd2345da:cf4d8b04-b49e-4bf0-a99d-9303bba2cd90::   global         active   internet-svcs

# ibmcloud cis instance-set "CIS-Enterprise-Usage1"
コンテキスト・インスタンスを 'CIS-Enterprise-Usage1' に設定中...
OK
コンテキスト・サービス・インスタンスは正常に設定されました。

# ibmcloud cis domains
サービス・インスタンス 'CIS-Enterprise-Usage1' のドメインをリスト中...
OK
ID                                 名前                   状況         一時停止
a4135402d38fff24e32ef13c82c1ab4a   <My CIS Domain>       アクティブ   false

```

上記の情報を元に、カスタムエラーページを設定します。

```
# ibmcloud cis custom-page-update "ip_block" http://<My CIS Domain>/ipblock.html -d a4135402d38fff24e32ef13c82c1ab4a
Updating custom-page '{{.PageId}}' for domain '{{.Domain}}' ...
OK

ID                     ip_block
状態                   customized
説明                   IP or IP range block
URL                    http://<My CIS Domain>/ipblock.html
Preview Default Page   http://cloudflarepreview.com/preview-cpage?act=preview&target=block:ip-ban
Required Tokens        該当なし
作成日                 2019-04-18T01:39:33.766116Z
変更日                 2019-04-18T01:39:33.766116Z
```

以下のコマンドでも、`状態`が`default`から`customized`に変更され、URLとして指定したアドレスが定義されていることがわかります。

```
# ibmcloud cis custom-pages
（途中抜粋）
ID                     country_challenge
状態                   default
説明                   Country Challenge
URL                    該当なし
Preview Default Page   http://cloudflarepreview.com/preview-cpage?act=preview&target=block:country-captcha
Required Tokens        ::CAPTCHA_BOX::
作成日                 該当なし
変更日                 該当なし

ID                     ip_block
状態                   customized
説明                   IP or IP range block
URL                    http://<My CIS Domain>/ipblock.html
Preview Default Page   http://cloudflarepreview.com/preview-cpage?act=preview&target=block:ip-ban
Required Tokens        該当なし
作成日                 2019-04-18T01:39:33.766116Z
変更日                 2019-04-18T01:39:33.766116Z

（途中抜粋）
```

#5. エラーページの確認
わざとIP Firewallで引っかかるようにしてアクセスしてみると・・・ちゃんと表示されました。
<img width="725" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/c67f5c50-2f28-33a0-e766-38c115b39265.png">




# 元に戻す方法

エラーページのURLの代わりに、`default`というキーワードを使えば元に戻せます。

```
# ibmcloud cis custom-page-update "ip_block" default -d a4135402d38fff24e32ef13c82c1ab4a
Updating custom-page '{{.PageId}}' for domain '{{.Domain}}' ...
OK

ID                     ip_block
状態                   default
説明                   IP or IP range block
URL                    該当なし
Preview Default Page   http://cloudflarepreview.com/preview-cpage?act=preview&target=block:ip-ban
Required Tokens        該当なし
作成日                 2019-04-18T01:39:33.766116Z
変更日                 2019-04-18T01:57:54.303901Z
```