ConohaのVPSのセキュリティグループをopenstackコマンドで追加する

背景

ConohaのVPSを触る機会があり、コントロールパネルを見た所、開放できるポートが限定的であることがわかりました。

もちろん全許可にしてfirewalldなどでやるのでも良いのですが、できるだけ低いレイヤーでいて、且つサーバーそのものではないレイヤーで制限が出来た方が良いので調べてみたところ、ConohaにはAPIがあることがわかりました。
ConohaのバックエンドはOpenStackなので、APIで使える情報を設定することでopenstackコマンドが使用できます。
そこで、openstackコマンドを使って、SGを設定することにしました。

openstackコマンドのインストール

手元にpython3.8.1がインストールされていたので、venvを使ってopenstackをインストールしました。

$ pyenv install 3.8.1
$ pyenv versions
$ python -m venv ~/.venv/global
$ source ~/.venv/global/bin/activate
$ easy_install pip
$ pip install -U pip
$ pip install python-openstackclient
$ openstack --version
openstack 5.3.1
$ which openstack
/Users/USERNAME/.venv/global/bin/openstack

環境変数のセット

コンパネでAPIユーザーを作成したあとに環境変数をセットします。
exportコマンドで各値をセットするのでも良いですが、envchainを使うとMacのkeychainで管理出来て便利なので今回はenvnchainを使って設定しています。

https://github.com/sorah/envchain

$ envchain --set conoha_example OS_TENANT_NAME
conoha_example.OS_TENANT_NAME: gnctXXXXXX

$ envchain --set conoha_example OS_PASSWORD
conoha_example.OS_PASSWORD: XXXXX

$ envchain --set conoha_example OS_USERNAME
conoha_example.OS_USERNAME: gncuXXXXX

$ envchain --set conoha_example OS_AUTH_URL
conoha_example.OS_AUTH_URL: https://identity.tyo2.conoha.io/v2.0

実際にopenstackコマンドを実行してみると、server listのサブコマンドでインスタンス一覧を確認できます。

$ envchain conoha_example openstack server list
+--------------------------------------+---------------+--------+--------------------------------------------------------------------+----------------------------+------------+
| ID                                   | Name          | Status | Networks                                                           | Image                      | Flavor     |
+--------------------------------------+---------------+--------+--------------------------------------------------------------------+----------------------------+------------+
| XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX | XX-XX-XXX-XXX | ACTIVE | ext-XXX-XXX-XXX-XXX=XXX.XXX.XX.X, 2400:8500:1801:450:XXX:XXX:XX:XX | vmi-centos-8.2-amd64-100gb | g-c2m1d100 |
+--------------------------------------+---------------+--------+--------------------------------------------------------------------+----------------------------+------------+

セキュリティグループの作成

既存では全部で5つのSGがあります。

$ envchain conoha_example openstack security group list
+--------------------------------------+---------------+---------------+---------+------+
| ID                                   | Name          | Description   | Project | Tags |
+--------------------------------------+---------------+---------------+---------+------+
| XXXXXXXX-XXXX-419b-9668-9ad94632123c | default       | default       | None    | []   |
| XXXXXXXX-XXXX-4cd9-9534-f599117b7cfd | gncs-ipv4-ssh | gncs-ipv4-ssh | None    | []   |
| XXXXXXXX-XXXX-4346-a886-10f06180353e | gncs-ipv4-web | gncs-ipv4-web | None    | []   |
| XXXXXXXX-XXXX-47f7-94a7-307a0031382a | gncs-ipv6-all | gncs-ipv6-all | None    | []   |
| XXXXXXXX-XXXX-49f1-95e2-30e71dc8e255 | gncs-ipv4-all | gncs-ipv4-all | None    | []   |
+--------------------------------------+---------------+---------------+---------+------+

今回はDNS用途になるので、DNSという名前をつけてSGを作成します。

$ envchain conoha_example openstack security group create example_dns --description example_dns
+-----------------+---------------------------------------------------------------------------------+
| Field           | Value                                                                           |
+-----------------+---------------------------------------------------------------------------------+
| created_at      | None                                                                            |
| description     | example_dns                                                                     |
| id              | XXXXXXXX-XXXX-4880-b74f-d20ad4f0cce6                                            |
| name            | example_dns                                                                     |
| project_id      | XXXXXXXXXXXXXXXXX                                                               |
| revision_number | None                                                                            |
| rules           | direction='egress', ethertype='IPv4', id='XXXXXXXX-XXXX-4c7a-9534-56015d7cb6bd' |
|                 | direction='egress', ethertype='IPv6', id='XXXXXXXX-XXXX-4d82-9c97-dd8e9eae3b87' |
| stateful        | None                                                                            |
| tags            | []                                                                              |
| updated_at      | None                                                                            |
+-----------------+---------------------------------------------------------------------------------+

作成したSGに53番のUDPを開放したルールを作成します。

$ envchain conoha_example openstack security group rule create example_dns --protocol udp --dst-port 53:53 --remote-ip 0.0.0.0/0
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| created_at        | None                                 |
| description       | None                                 |
| direction         | ingress                              |
| ether_type        | IPv4                                 |
| id                | XXXXXXXX-XXXX-4430-8a52-b78f0b0ade61 |
| name              | None                                 |
| port_range_max    | 53                                   |
| port_range_min    | 53                                   |
| project_id        | XXXXXXXXXXXXXXXXX                    |
| protocol          | udp                                  |
| remote_group_id   | None                                 |
| remote_ip_prefix  | 0.0.0.0/0                            |
| revision_number   | None                                 |
| security_group_id | XXXXXXXX-XXXX-4880-b74f-d20ad4f0cce6 |
| tags              | []                                   |
| updated_at        | None                                 |
+-------------------+--------------------------------------+

53番のUDPが開放されたルールが作成されていることがわかります。

$ envchain conoha_example openstack security group show XXXXXXXX-XXXX-4880-b74f-d20ad4f0cce6
+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field           | Value                                                                                                                                                                    |
+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| created_at      | None                                                                                                                                                                     |
| description     | example_dns                                                                                                                                                              |
| id              | XXXXXXXX-XXXX-4880-b74f-d20ad4f0cce6                                                                                                                                     |
| name            | example_dns                                                                                                                                                              |
| project_id      | XXXXXXXXXXXXXXXXX                                                                                                                                                        |
| revision_number | None                                                                                                                                                                     |
| rules           | direction='egress', ethertype='IPv4', id='XXXXXXXX-XXXX-4c7a-9534-56015d7cb6bd'                                                                                          |
|                 | direction='ingress', ethertype='IPv4', id='XXXXXXXX-XXXX-4430-8a52-b78f0b0ade61', port_range_max='53', port_range_min='53', protocol='udp', remote_ip_prefix='0.0.0.0/0' |
|                 | direction='egress', ethertype='IPv6', id='XXXXXXXX-XXXX-4d82-9c97-dd8e9eae3b87'                                                                                          |
| stateful        | None                                                                                                                                                                     |
| tags            | []                                                                                                                                                                       |
| updated_at      | None                                                                                                                                                                     |
+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

次にポートへ作成したSGを割り当てるため、IPアドレスから、対象ポートの特定します。※デフォルトで複数存在します。

$ envchain conoha_example openstack port list
+--------------------------------------+----------------------------+-------------------+-------------------------------------------------------------------------------------------------+--------+
| ID                                   | Name                       | MAC Address       | Fixed IP Addresses                                                                              | Status |
+--------------------------------------+----------------------------+-------------------+-------------------------------------------------------------------------------------------------+--------+
| XXXXXXXX-XXXX-42bb-acf4-3ee8fa1a8f8a | ext-i_100000-o_100000-p_0a | 02:02:a0:fb:08:b2 | ip_address='XXX.XXX.X.XXX', subnet_id='XXXXXXXX-XXXX-427c-bd15-9c0cf9ab5ba1'                    | ACTIVE |
|                                      |                            |                   | ip_address='2400:8500:1801:450:XXX:XXX:XX:XX', subnet_id='XXXXXXXX-XXXX-4da4-b1d0-42bfffbe6641' |        |
+--------------------------------------+----------------------------+-------------------+-------------------------------------------------------------------------------------------------+--------+

ポートに割当られているSGを確認しておきます。

$ envchain conoha_example openstack port show XXXXXXXX-XXXX-42bb-acf4-3ee8fa1a8f8a
+-------------------------+------------------------------------------------------------------------------------------------------------------+
| Field                   | Value                                                                                                            |
+-------------------------+------------------------------------------------------------------------------------------------------------------+
| admin_state_up          | UP                                                                                                               |
| allowed_address_pairs   | ip_address='2400:8500:1801:450:aXXX:XXX:XXX:XX/124', mac_address='02:02:a0:fb:08:b2'                             |
| binding_host_id         | None                                                                                                             |
| binding_profile         | None                                                                                                             |
| binding_vif_details     | None                                                                                                             |
| binding_vif_type        | None                                                                                                             |
| binding_vnic_type       | normal                                                                                                           |
| created_at              | None                                                                                                             |
| data_plane_status       | None                                                                                                             |
| description             | None                                                                                                             |
| device_id               | XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX                                                                             |
| device_owner            | compute:nova                                                                                                     |
| dns_assignment          | None                                                                                                             |
| dns_domain              | None                                                                                                             |
| dns_name                | None                                                                                                             |
| extra_dhcp_opts         |                                                                                                                  |
| fixed_ips               | ip_address='XXX.XXX.XX.XX', subnet_id='XXXXXXXX-XXXX-427c-bd15-9c0cf9ab5ba1'                                     |
|                         | ip_address='2400:8500:1801:450:XXX:XXX:XXX:XXX', subnet_id='XXXXXXXX-XXXX-4da4-b1d0-42bfffbe6641'                |
| id                      | XXXXXXXX-XXXX-42bb-acf4-3ee8fa1a8f8a                                                                             |
| ip_allocation           | None                                                                                                             |
| mac_address             | 02:02:a0:fb:08:b2                                                                                                |
| name                    | ext-i_100000-o_100000-p_0a                                                                                       |
| network_id              | XXXXXXXX-XXXX-4ed0-b483-e557eae2b687                                                                             |
| port_security_enabled   | False                                                                                                            |
| project_id              | XXXXXXXXXXXXXXXXX                                                                                                |
| propagate_uplink_status | None                                                                                                             |
| qos_network_policy_id   | None                                                                                                             |
| qos_policy_id           | None                                                                                                             |
| resource_request        | None                                                                                                             |
| revision_number         | None                                                                                                             |
| security_group_ids      | XXXXXXXX-XXXX-419b-9668-9ad94632123c, XXXXXXXX-XXXX-4cd9-9534-f599117b7cfd, XXXXXXXX-XXXX-47f7-94a7-307a0031382a |
| status                  | ACTIVE                                                                                                           |
| tags                    |                                                                                                                  |
| trunk_details           | None                                                                                                             |
| updated_at              | None                                                                                                             |
+-------------------------+------------------------------------------------------------------------------------------------------------------+

上記コマンドで確認したSGのIDと、新規で作成したDNSのSGを加えて、portにSGをセットします。

$ envchain conoha_example openstack port set XXXXXXXX-XXXX-42bb-acf4-3ee8fa1a8f8a --security-group XXXXXXXX-XXXX-419b-9668-9ad94632123c --security-group XXXXXXXX-XXXX-4cd9-9534-f599117b7cfd --security-group XXXXXXXX-XXXX-47f7-94a7-307a0031382a --security-group XXXXXXXX-XXXX-4880-b74f-d20ad4f0cce6

確認すると、SGが割当られていることがわかります。

$ envchain conoha_example openstack port show XXXXXXXX-XXXX-42bb-acf4-3ee8fa1a8f8a
+-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field                   | Value                                                                                                                                                  |
+-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
| admin_state_up          | UP                                                                                                                                                     |
| allowed_address_pairs   | ip_address='2400:8500:1801:450:aXXX:XXX:XXX:XXX0/124', mac_address='02:02:a0:fb:08:b2'                                                                 |
| binding_host_id         | None                                                                                                                                                   |
| binding_profile         | None                                                                                                                                                   |
| binding_vif_details     | None                                                                                                                                                   |
| binding_vif_type        | None                                                                                                                                                   |
| binding_vnic_type       | normal                                                                                                                                                 |
| created_at              | None                                                                                                                                                   |
| data_plane_status       | None                                                                                                                                                   |
| description             | None                                                                                                                                                   |
| device_id               | XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX                                                                                                                   |
| device_owner            | compute:nova                                                                                                                                           |
| dns_assignment          | None                                                                                                                                                   |
| dns_domain              | None                                                                                                                                                   |
| dns_name                | None                                                                                                                                                   |
| extra_dhcp_opts         |                                                                                                                                                        |
| fixed_ips               | ip_address='XXX.XXX.X.XXX', subnet_id='XXXXXXXX-XXXX-427c-bd15-9c0cf9ab5ba1'                                                                           |
|                         | ip_address='2400:8500:1801:450:XXX:XXX:XXX:XXX', subnet_id='XXXXXXXX-XXXX-4da4-b1d0-42bfffbe6641'                                                      |
| id                      | XXXXXXXX-XXXX-42bb-acf4-3ee8fa1a8f8a                                                                                                                   |
| ip_allocation           | None                                                                                                                                                   |
| mac_address             | 02:02:a0:fb:08:b2                                                                                                                                      |
| name                    | ext-i_100000-o_100000-p_0a                                                                                                                             |
| network_id              | XXXXXXXX-XXXX-4ed0-b483-e557eae2b687                                                                                                                   |
| port_security_enabled   | False                                                                                                                                                  |
| project_id              | XXXXXXXXXXXXXXXXX                                                                                                                                      |
| propagate_uplink_status | None                                                                                                                                                   |
| qos_network_policy_id   | None                                                                                                                                                   |
| qos_policy_id           | None                                                                                                                                                   |
| resource_request        | None                                                                                                                                                   |
| revision_number         | None                                                                                                                                                   |
| security_group_ids      | XXXXXXXX-XXXX-419b-9668-9ad94632123c, XXXXXXXX-XXXX-4880-b74f-d20ad4f0cce6, XXXXXXXX-XXXX-4cd9-9534-f599117b7cfd, XXXXXXXX-XXXX-47f7-94a7-307a0031382a |
| status                  | ACTIVE                                                                                                                                                 |
| tags                    |                                                                                                                                                        |
| trunk_details           | None                                                                                                                                                   |
| updated_at              | None                                                                                                                                                   |
+-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+

最後に

firewalldが動いている場合は停止します。

systemctl stop firewalld
systemctl disable firewalld

まとめ

ConohaのVPSでSGを新規で割り当てる方法で、openstackコマンドを使ってやってみました。

注意点としては、個別に追加したSGはコンパネに出てこないので、コンパネからはぱっと見わからない点が挙げられます。
個人的には、サーバーへ余計なトラフィックを流さずにポート制限が出来たほうが良いので今回はopenstackコマンドを使って作業をしましたが、管理が出来なくなってしまいそうであればfirewqalldでしっかり管理するのが良いかなとは思います。

ConohaのAPIをREST APIを使って実施する方法は、実際にやられている方も多いですし、ConohaのAPIドキュメントは非常に充実していて大変使い勝手が良いです。
サービスローンチした頃はお手軽に使えるVPSというイメージでしたが、今ではDBaaSやオブジェクトストレージもあるので、本格的な用途にも使用していけそうかなと感じました。
今までは、VPSと言えば自分でも契約していて、圧倒的に安定しているさくらのVPS推しでしたが、今後は相談を受けたらConohaもオススメしていきたいです。