IBM Cloud：CIS FWをCLIで設定する

# 概要
CISのfirewallを設定する場合、通常GUI([IBM Cloudポータル上](https://cloud.ibm.com/))で設定します。しかし、設定するルールの数が多いとGUIで一つづつ設定するのは大変です。そこで本記事では、CLIのコマンドを用いて設定する方法を記載します。

# CISとは

詳しくは以下の記事をご覧ください。
[CIS(IBM Cloud Internet Service)についてのFAQ](https://qiita.com/testnin2/items/bfa08112616ebdfb5244)

# CLIでのCIS Firewallの書式
以下のような書式でコマンド実行します。
```
cis firewall-create (-t, --type Type) (--json @JSON_FILE | JSON_STRING) [-d, --domain DNS_DOMAIN_ID] [-i, --instance INSTANCE] [--output FORMAT]
```

- `-t, --type`：作成するfirewallのタイプを選択します。"access-rules"、"ua-rules"、"lockdowns"から選択できます。
    - "access-rules"： ウェブサイトへの許可・チャレンジ・ブロックをリクエストできます。同じサービスインスタンス内の1つ、あるいは全てのドメインに適用できます。
    - "ua-rules"：ユーザーエージェントに対してのアクセス制御を実現します。
    - "lockdowns"：許可されたIP/IPレンジのみアクセスできるようブロックします。
 
- `-d, --domain`：DNS Domain IDを指定します。
- `--json`：rulesの書かれたJSONファイル、あるいはJSON stringを指定します。

## jsonファイルでの指定方法
### typeで"access-rules"を使用する場合
```test.json
{
   "mode": "block",
   "notes": "This rule is added because of event X that occurred on date xyz",
   "configuration": {
      "target": "ip",
                               "value": "233.233.233.234"
   }
}
```
- "mode"：アクションを指定します。("block"、"challenge"、"whitelist"、"js_challenge")
- "notes"：rulesに関するメモを記載します。
- "configuration"：Target/Valueでルールのターゲットを指定します。
    - "target": ターゲットの種類を指定します。("ip"、"ip_range"、"asn"、"country")
    - "value": valueを指定します。
        - "ip"：IPアドレスを指定します。
        - "ip_range"：/16 and /24の範囲でIPレンジを指定します。
        - "asn"：AS numberを指定します。
        - "country"：国名コードを指定します。

### typeで"ua-rules"を使用する場合
```
{
   "mode": "block",
   "description": "This rule is added because of event X that occurred on date xyz",
   "configuration": {
      "target": "ua",
      "value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/603.2.4 (KHTML, like Gecko) Version/10.1.1 Safari/603.2.4"
   }
}
```
- "mode"：アクションを指定します。("block"、"challenge"、"js_challenge")
- "description": rulesに関するメモを記載します。
- "configuration"：Target/Valueでルールのターゲットを指定します。
    - "target": ターゲットを指定します。("ua")
    - "value": valueを指定します。
   
### typeで"lockdowns"を使用する場合
```
{
   "urls": [
      "api.mysite.com/some/endpoint*"
   ],
   "configurations": [
      {
         "target": "ip",
         "value": "127.0.0.1"
      },
      {
         "target": "ip_range",
         "value": " 2.2.2.0/24"
      }
   ]
}
```
- "description": rulesに関するメモを記載します。
- "urls":このルール定義に含まれるURLを指定します。ワイルドカードを使用できます。
- "configuration"：Target/Valueでルールのターゲットを指定します。
    - "target": ターゲットを指定します。("ip"、"ip-range")
    - "value": valueを指定します。
 
# 実行例
CISの"access-rules"を、コマンド内でjsonファイルを指定する場合と、json stringで指定する場合を記載します。
### コマンド内でjson形式で指定する場合
```
$ ibmcloud cis firewall-create -t access-rules --json '{"mode": "block","notes": "This rule is added because of test","configuration": {"target": "ip","value": "233.233.233.233"}}'
Creating Firewall access rule for service instance '' ...
OK

ID              xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Scope
    Type        instance
Mode            block
Created On      2022-03-28 10:08:10.841358631 +0000 UTC
Modified On     2022-03-28 10:08:10.841358631 +0000 UTC
Configuration
    Target      ip
    Value       233.233.233.233
Notes           This rule is added because of test
```

### コマンド内でjsonファイルを指定する場合
上記jsonファイルをコマンドラインで指定します。
```
$ ibmcloud cis firewall-create -t access-rules --json @test.json
Creating Firewall access rule for service instance '' ...
OK

ID              xxxxxxxxxxxxxxxxxxxxxxxx
Scope
    Type        instance
Mode            block
Created On      2022-03-28 10:08:10.841358631 +0000 UTC
Modified On     2022-03-28 10:08:10.841358631 +0000 UTC
Configuration
    Target      ip
    Value       233.233.233.234
Notes           This rule is added because of test
```

# 設定結果
無事IP Firewallが設定できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/7e10cd37-2f9a-8466-31ff-c09a89f0074c.png)