PowerVSのNetwork Security Groups(NSG)を試してみる

# はじめに
PowerVSのNetwork Security Groups（NSG）機能がGAしたので試してみます。
https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-nsg

新規に作成したPER対応ワークスペースで利用可能です。既存ワークスペースは6月までに順次対応するようです。

名称は同じですが、VPCのSecurity Groupsとは仕様が異なります。（どちらかというとVPCのACLに似ていますが、それとも少し違う部分があります。）

主な特徴は下記です。詳細は上記docsをご一読ください。
・statelessである。
・denyルールまたはallowルールで制御。
・暗黙的なdenyルールが存在し、どのallowルールにもマッチしなければdenyされる。
・ユーザーが作成したdenyルールは最初に評価され、そこでdenyルールにマッチすればそこでブロックして処理を完了する。（allowルールがあっても評価されない）
・sourceポートとdestinationポートを両方指定。
・inbound（外部からPowerVSに入ってくるパケット）について制御。
・PowerVSから出ていくパケットについては全て許可（outboundルールという概念が無い）。
・1つのネットワークインターフェースは1つのSecurity Groupsのみの対象とできる（同時に2つ以上のSecurity Groupsの対象にできない）。
・定義可能なNSGとNAGは1ワークスペースあたり10個まで。caseで追加の依頼は可能。-> [Limitation](https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-nsg#quotas-limitations)の項を参照。
・Private Endpoint（161.26.0.0/16、166.8.0.0/14）との通信について考慮する必要がある（後述）。
・Security Groupsで保護できるのはPrivate側インターフェースのみ。Public IP（External IP）が付いているインターフェースはSecurity Groupsの保護対象にできない。

以下、実際に触ってみます。

# デフォルトではSecurity Groupsはワークスペースに対し有効になっていない
Security Groupsに対応しているワークスペースでは、左側のメニューの`Networking`の配下に`Network security groups`のメニューが表示されています。

ただし、Security Groupsが利用可能なワークスペースであっても、デフォルトでは有効になっていません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/2b133cc8-8f12-4c47-bfa7-927cb11a0bed.png)

上記画面で`Enable for workspace`のボタンを押すと、Workspace detailsの設定画面に遷移します。それの一番下に`Network security groups`のトグルボタンがあるので有効にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/55dd3829-9ae5-43d7-8a19-9861ea7c1de1.png)

↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/b0c2e562-16ff-408e-a98d-fd02c86f134d.png)

↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/0580f707-64a9-4bf2-b234-4660566e1926.png)

# 有効にした直後は、全てallowの状態

デフォルトで、`Default local addresses`という名前のSecurity Groupが存在します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/2dce8ef9-43e7-458d-8840-0a7c1901ca3e.png)

このデフォルトルールは、Allow Anyのルールを持っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/3ffd2b43-de44-4c39-a565-d81c6224a2ca.png)

サーバー作成時、デフォルトでこのSecurity Groupsが選択されています。（後述の手順で自分でSecurity Groupsを作ってあれば、それを選択可能です。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/77e26cf8-2340-405f-81ae-bf469fac21e4.png)

よって、Security Groupsを有効にした初期状態（ユーザーが何もSecurity Groupsを作っていない状態）で作成するサーバーは、外部からの通信が全て許可された状態でプロビジョニングされます。

# Network address groups(NAG)
PowerVSのSecurity Groupsには、Network address groupsという概念があります。これは、送信元のIPアドレス範囲を定義しておく定義体です。
例えば、オンプレミスのIPアドレス範囲が`192.168.0.0/16`だったとして、Security GroupのAllowまたはDenyのルールを作成する際に、ソースIPとして`192.168.0.0/16`を直接指定するのではなく、例えば`on-prem`という名前のnetwork address groupを192.168.0.0/16の値で定義しておき、そのnetwork address groupをルール作成時に指定するような使い方をします。

デフォルトでは全てのアドレス範囲を包括するNetwork address groupsが定義されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/1eeaa6e3-40fe-4c2a-9a7d-886f08462480.png)

例えば下記のように定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/e5b8de98-45b1-4701-94ee-1b79066c3f7b.png)


# 実装例

## Network address groups
送信元になるVSIはx86（Classic Infrastructure）にあるサーバーなので、Network address groupsとして`myclassic`という名前で`10.192.0.0/16`を定義しました。
デフォルトのNetwork address groupsは削除できないのでそのまま残っています。ユーザーが作成したNetwork address groupsに合致しないIP範囲は、全てデフォルトのNetwork address groupsとして扱われます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/08193d44-4b52-48fb-995a-262082f135c1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/c73d6ba1-a108-4dcc-9ce8-fd8bc7bc0276.png)

## Security Groups
Security Groupとして1つ作成しました（`mysg`）。デフォルトのSecurity Groupは削除できないのでそのまま残っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/41d10890-ba8b-457c-93da-756f318d17d1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/2387efb6-d89d-4579-8087-3114dd90fd42.png)

ClassicからのSSHを許可したいので下記ルールを作成しています。先述したように、ソースのIPアドレスやCIDRを直接入力する事はできず、"Remote"欄で、あらかじめ定義しておいたNetwork address groupsとして指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/266099b9-89e9-42e0-a3fa-decccf3026d7.png)

Advancedの欄で、フラグを指定することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/216aab5d-5eb9-4fe0-91a8-226ebead35b8.png)

:::note
作成したSecurity Groupsは、サーバー作成時に指定できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/91a40644-259e-4b02-ac8c-be2ab2e1806c.png)
:::

## member

`member`は、Security Groupsを適用するネットワークインターフェースです。
まずサーバーを指定し、次の画面でそのサーバーのどのインターフェースを対象とするかを指定します。
なお、memberは同時に2つ以上のSecurity Groupsに属することができません。追加したいmemberが他のSecurity Groupsに属している場合、そちらから削除した上で、目的のSecurity Groupsのmemberとして指定する必要があります。

サーバーを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/d68d3dfc-ada8-4994-b8c7-a3c31e452800.png)

そのサーバーのどのインターフェースを指定するか選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/102b27e8-64df-467c-944b-6e8331a917a3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/602d0a20-a469-4264-ab76-27a05a6bad3c.png)

サーバーの詳細画面でもmemberになっているSecurity Groupsを確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59627/270cb3ed-a611-410a-a254-07d676225334.png)


## 結果
期待通り、ClassicのVSIからPowerVSのサーバーにSSHが疎通するようになりました。
GUIからルールを作成してmemberを追加したら、数秒程度で反映されました。

# Private Endpointとの通信について
Security Groupsを使う際は、ICOSやDNS、NTPといった、IBM Cloudサービスとの通信について考慮する必要があります。
PowerVSからこれらのサービスにアクセスする際は、PowerVSから出ていく向きのoutbound通信ですので、全て許可されます。Security Groupsはstatelessですので、それに対するレスポンスの通信を考慮したルールを作っておく必要があります。docs（[この項](https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-nsg#create-manage-nag)の⑧）に記載がありますが、下記のIPアドレス範囲となります。
161.26.0.0/16: ICOS、DNS、NTP、Linuxレポジトリ等
166.8.0.0/14: IBM Cloud Databases等

# まとめ
PER環境ではオンプレミスからPowerVSに直接ルーティングできるようになりましたが、ネットワーク保護の観点でGRE経由でClassicのGateway Applianceを経由する構成も引き続き多かったです。
inbound方向（外部ネットワークからPowerVSに入ってくる通信）のL4 Firewall機能があればOKという要件であれば、Gateway Applianceの代替として今回のSecurity Groupsをご検討いただけるのではないかと思います。

以上