Network Security Group にCLI でルールを追加する

以下の記事でOCI CLIを使用してNetwork Security Group(以下、NSG)を作成しました。
今回は作成したNSGに対してCLIでルールを追加していきます。

[OCIのNetwork Security Group をCLIで作成する](https://qiita.com/ponnjinnka/items/346122829e234c11e895)

# 前提条件

前回の記事の内容が完了していれば問題ありません。
一応この記事単体で見た場合は以下が準備できていれば問題ありません。

* OCI CLI が利用できること
* 作成済みのNSGがあること

# 作成済みのNSGを確認しておく

作成済みのNSGを確認しておきます。

OCIのコンソール画面で
ハンバーガーメニュー > ネットワーキング > 仮想クラウド・ネットワーク > 仮想クラウド・ネットワークの詳細 > ネットワーク・セキュリティ・グループ
と進むとNSGが確認できます。

ここでNSGのOCIDをコピーしておきます。後で使用するため。

![スクリーンショット 2020-08-29 13.18.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62936/cfd4b1a0-fbf2-1acd-e37c-bcfddf1f0017.png)

# NSGにルールを追加する

まずはNSGにルールを追加するためのjsonフォーマットを取得します。
リファレンスは以下です。

https://docs.cloud.oracle.com/en-us/iaas/tools/oci-cli/2.12.3/oci_cli_docs/cmdref/network/nsg/rules/add.html

以下のコマンドでjson フォーマットを取得します。

```
oci network nsg rules add --generate-full-command-json-input > add_rule.json
```

生成されたファイルは以下です。

``` add_rule.json
{
  "nsgId": "string",
  "securityRules": [
    {
      "description": "string",
      "destination": "string",
      "destinationType": "string",
      "direction": "string",
      "icmpOptions": {
        "code": 0,
        "type": 0
      },
      "isStateless": true,
      "protocol": "string",
      "source": "string",
      "sourceType": "string",
      "tcpOptions": {
        "destinationPortRange": {
          "max": 0,
          "min": 0
        },
        "sourcePortRange": {
          "max": 0,
          "min": 0
        }
      },
      "udpOptions": {
        "destinationPortRange": {
          "max": 0,
          "min": 0
        },
        "sourcePortRange": {
          "max": 0,
          "min": 0
        }
      }
    },
    {
      "description": "string",
      "destination": "string",
      "destinationType": "string",
      "direction": "string",
      "icmpOptions": {
        "code": 0,
        "type": 0
      },
      "isStateless": true,
      "protocol": "string",
      "source": "string",
      "sourceType": "string",
      "tcpOptions": {
        "destinationPortRange": {
          "max": 0,
          "min": 0
        },
        "sourcePortRange": {
          "max": 0,
          "min": 0
        }
      },
      "udpOptions": {
        "destinationPortRange": {
          "max": 0,
          "min": 0
        },
        "sourcePortRange": {
          "max": 0,
          "min": 0
        }
      }
    }
  ]
}
```

今回は最低限必要な項目として イングレス(INGRESS)ルールを2つ、エグレス(EGRESS)を1つ作成します。
ルールは以下の3つで、利用する jsonは以下のようになります。(IPは適当です)
OCIDは末尾をマスクしているので適宜修正してください。

* イングレス： 153.200.200.200/32からの22番portへのsshを許可
* イングレス： 0.0.0.0/0から80番ポートへのHTTPを許可
* エグレス：153.200.200.201/32 の 80番portへのHTTP通信を許可

``` add_rule.json
{
  "nsgId": "ocid1.networksecuritygroup.oc1.ap-tokyo-1.XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "securityRules": [
    {
      "description": "ssh",
      "direction": "INGRESS",
      "isStateless": false,
      "protocol": "6",
      "source": "153.200.200.200/32",
      "tcpOptions": {
        "destinationPortRange": {
          "max": 22,
          "min": 22
        }
      }
    },
    {
      "description": "HTTP",
      "direction": "INGRESS",
      "isStateless": false,
      "protocol": "6",
      "source": "0.0.0.0/0",
      "tcpOptions": {
        "destinationPortRange": {
          "max": 80,
          "min": 80
        }
      }
    },
    {
      "description": "ex",
      "destination": "153.200.200.201/32",
      "direction": "EGRESS",
      "isStateless": false,
      "protocol": "6",
      "tcpOptions": {
        "destinationPortRange": {
          "max": 80,
          "min": 80
        }
      }
    }
  ]
}
```

jsonをファイルをもとに追加するコマンドは以下。
今回はファイルの指定を相対パスで行っている。
追加のリファレンスは以下。

https://docs.cloud.oracle.com/en-us/iaas/tools/oci-cli/2.12.3/oci_cli_docs/cmdref/network/nsg/rules/add.html

```
oci network nsg rules add --from-json file://./add_rule.json
```

追加されたルールはこんな感じになっています。

![スクリーンショット 2020-08-29 13.40.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62936/cf230f96-d8d1-3d0a-bdfa-650bb3a1b5ac.png)


# まとめ

CLIを使ってNSGのルールを付与すれば
大量にルールがある場合や、似ているNSGを作る場合はコンソール上から作るよりも簡単にできますね。