ConohaのVPSのセキュリティグループをopenstackコマンドで追加する
背景
ConohaのVPSを触る機会があり、コントロールパネルを見た所、開放できるポートが限定的であることがわかりました。
もちろん全許可にしてfirewalldなどでやるのでも良いのですが、できるだけ低いレイヤーでいて、且つサーバーそのものではないレイヤーで制限が出来た方が良いので調べてみたところ、ConohaにはAPIがあることがわかりました。
ConohaのバックエンドはOpenStackなので、APIで使える情報を設定することでopenstackコマンドが使用できます。
そこで、openstackコマンドを使って、SGを設定することにしました。
openstackコマンドのインストール
手元にpython3.8.1がインストールされていたので、venvを使ってopenstackをインストールしました。
$ 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
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のサブコマンドでインスタンス一覧を確認できます。
+--------------------------------------+---------------+--------+--------------------------------------------------------------------+----------------------------+------------+
| 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があります。
+--------------------------------------+---------------+---------------+---------+------+
| 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を作成します。
+-----------------+---------------------------------------------------------------------------------+
| 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を開放したルールを作成します。
+-------------------+--------------------------------------+
| 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が開放されたルールが作成されていることがわかります。
+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 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アドレスから、対象ポートの特定します。※デフォルトで複数存在します。
+--------------------------------------+----------------------------+-------------------+-------------------------------------------------------------------------------------------------+--------+
| 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をセットします。
確認すると、SGが割当られていることがわかります。
+-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
| 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 disable firewalld
まとめ
ConohaのVPSでSGを新規で割り当てる方法で、openstackコマンドを使ってやってみました。
注意点としては、個別に追加したSGはコンパネに出てこないので、コンパネからはぱっと見わからない点が挙げられます。
個人的には、サーバーへ余計なトラフィックを流さずにポート制限が出来たほうが良いので今回はopenstackコマンドを使って作業をしましたが、管理が出来なくなってしまいそうであればfirewqalldでしっかり管理するのが良いかなとは思います。
ConohaのAPIをREST APIを使って実施する方法は、実際にやられている方も多いですし、ConohaのAPIドキュメントは非常に充実していて大変使い勝手が良いです。
サービスローンチした頃はお手軽に使えるVPSというイメージでしたが、今ではDBaaSやオブジェクトストレージもあるので、本格的な用途にも使用していけそうかなと感じました。
今までは、VPSと言えば自分でも契約していて、圧倒的に安定しているさくらのVPS推しでしたが、今後は相談を受けたらConohaもオススメしていきたいです。