ConoHaでセキュリティグループを設定する

[ConoHa](https://www.conoha.jp/)には基盤側にパケットフィルタが備わっており、TCPポートやソースIPアドレスによるフィルタリングが行えます。仮想サーバーが接続されている仮想スイッチでフィルタリングされるので、OSの設定に依存しない簡易的なファイアーウォールのように使えますし、フィルタリングルールを「セキュリティグループ」という形でまとめて、複数サーバーにまとめて適用したりもできるので台数が増えたときの管理も楽です。

ただ、設定するには[ConoHaのAPI](https://www.conoha.jp/docs/)を叩く必要があり、詳しくは下記のエントリなどで解説されています。

ConoHa APIでセキュリティグループを設定する
https://blog.noldor.info/2015/11/conoha-api-security-group

ConoHa API を叩いてインフラ側で Firewall を設定 - ConoHa で KUSANAGI その4
http://impov.hatenablog.com/entry/2016/05/30/210105

つまり仕組みとして

* 仮想サーバーは複数のポート(=仮想NIC)を持つ
* ポートには複数のセキュリティグループを割り当てられる
* セキュリティグループには複数のセキュリティグループルールを割り当てられる

という3層構造となります。これをAPIで設定するのは、なかなかしんどいですね...　

というわけでAPIを毎回叩くなんてやってられないので、雑なツールを作りました。といっても、元々自分用だったものを手直ししただけですが。

# conoha-net

conoha-netはセキュリティグループをコマンドラインから操作するツールです。インストール方法や使い方とかはgithubに書いてあります。

> hironobu-s/conoha-net: A security group management tool for ConoHa 
> https://github.com/hironobu-s/conoha-net

ちょっとした解説をすると、list-group　-aを実行するとデフォルトで用意されているルールが出てきますが、これコントロールパネルから設定できる「許可ポート」のことなんですね。

```shell-session
hiro@personal$ conoha-net list-group -a                                                                            UUID                                     SecurityGroup     Direction     EtherType     Proto     IP Range     Port
01c8f7d2-9a61-4158-bec9-882d9ea82c4e     gncs-ipv4-ssh     egress        IPv4          ALL                    ALL
a80a3376-5fff-41f1-b4de-6f975968e5a7     gncs-ipv4-ssh     egress        IPv6          ALL                    ALL
ee75d97a-fe30-4974-944d-850da19356d9     gncs-ipv4-ssh     ingress       IPv4          tcp                    22 - 22
0c905231-5ac8-4627-89d0-c8bb96b185f7     gncs-ipv6-all     egress        IPv6          ALL                    ALL
15962089-aaae-498f-86a9-7df572ce01fb     gncs-ipv6-all     ingress       IPv6          ALL                    ALL
f375fc43-bfab-48cc-a66d-418b6d709a60     gncs-ipv6-all     egress        IPv4          ALL                    ALL
1d1b7066-7da5-4694-9e8b-445b01d7df64     gncs-ipv4-all     ingress       IPv4          ALL                    ALL
771f3074-4fe8-4051-804e-6f5f7f4860b1     gncs-ipv4-all     egress        IPv6          ALL                    ALL
b8d81897-4229-4ddf-8325-11a7d0b42efd     gncs-ipv4-all     egress        IPv4          ALL                    ALL
448761e1-4943-453e-9edb-51d4bf81364c     default           egress        IPv4          ALL                    ALL
4f505718-d378-4f24-991a-02d20b8285e4     default           ingress       IPv6          ALL                    ALL
66619594-8dea-4fc6-8815-5db7ef623930     default           ingress       IPv4          ALL                    ALL
b950e586-53d5-4944-bdbd-fbba045c2d3d     default           egress        IPv6          ALL                    ALL
12d97dca-94a2-4b99-938e-ff8be875d8a9     gncs-ipv4-web     ingress       IPv4          tcp                    20 - 20
286a0a55-2c25-4810-9274-021d474126f6     gncs-ipv4-web     ingress       IPv4          tcp                    443 - 443
85421073-7b49-41bf-9da1-d6e48b0f6c88     gncs-ipv4-web     egress        IPv4          ALL                    ALL
ab501cfa-e67a-4255-9291-382400a45b2b     gncs-ipv4-web     ingress       IPv4          tcp                    21 - 21
b73d7eca-06b9-4252-ae9c-adad891dbb88     gncs-ipv4-web     egress        IPv6          ALL                    ALL
daf58069-fd85-4281-a86e-3a8d23fd389b     gncs-ipv4-web     ingress       IPv4          tcp                    80 - 80
05bb817c-5179-4156-99ec-f088ff5c5d8e     my-group          egress        IPv6          ALL                    ALL
5ecc4a23-0b92-4394-bca6-2466f08ef45e     my-group          egress        IPv4          ALL                    ALL
```

↓コントロールパネル

<img width="595" alt="ConoHaコントロールパネル.png" src="https://qiita-image-store.s3.amazonaws.com/0/44152/135e45b4-d29f-6b19-cfd9-12a34cdf4a0b.png">

コントロールパネルからは特定のポート(22, 80, 443とか)しか設定できませんが、conoha-netを使うと自由に設定できますし、ソースIPアドレスの指定もできるようになります。例えば、SSHへの接続を133.130.0.0/16からのみにしたい場合はこんな感じです。

```shell-session
hiro@personal$ conoha-net create-rule -d ingress -e IPv4 -p 22 -P tcp -i 133.130.0.0/16  my-group
5697eb75-3517-44a9-bc40-d532a4aedd89
hiro@personal$ conoha-net list-group                                                                               UUID                                     SecurityGroup     Direction     EtherType     Proto     IP Range           Port
05bb817c-5179-4156-99ec-f088ff5c5d8e     my-group          egress        IPv6          ALL                          ALL
5697eb75-3517-44a9-bc40-d532a4aedd89     my-group          ingress       IPv4          tcp       133.130.0.0/16     22 - 22
5ecc4a23-0b92-4394-bca6-2466f08ef45e     my-group          egress        IPv4          ALL                          ALL
```

JSON出力もできるので、スクリプトやプロビジョニングツールからも扱いやすいです。

```shell-session
hiro@personal$ conoha-net -o json list-group  | jq .                                                               [
  {
    "direction": "egress",
    "ether-type": "IPv6",
    "ip-range": "",
    "port": "ALL",
    "proto": "ALL",
    "security-group": "my-group",
    "uuid": "05bb817c-5179-4156-99ec-f088ff5c5d8e"
  },
  {
    "direction": "ingress",
    "ether-type": "IPv4",
    "ip-range": "133.130.0.0/16",
    "port": {
      "max": 22,
      "min": 22
    },
    "proto": "tcp",
    "security-group": "my-group",
    "uuid": "5697eb75-3517-44a9-bc40-d532a4aedd89"
  },
  {
    "direction": "egress",
    "ether-type": "IPv4",
    "ip-range": "",
    "port": "ALL",
    "proto": "ALL",
    "security-group": "my-group",
    "uuid": "5ecc4a23-0b92-4394-bca6-2466f08ef45e"
  }
]
```

ConoHaユーザーの皆様は、良かったら使ってみて下さい。