Red Hat OpenShift on IBM Cloudでアクセス元IPアドレスを制限する

# はじめに
当記事では、IBM Cloud上のマネージドなOpenShift環境である「Red Hat OpenShift on IBM Cloud」（以下ROKS）において、デプロイしたアプリケーション、および、OpenShift Webコンソールに対して、アクセス元のIPアドレスをホワイトリスト形式で制限する方法について説明します。

ROKS環境は、プライベートネットワークからのアクセスのみを可とする構成で作成することも可能です。ただ、パブリックからのアクセスは可としつつ、デプロイした（認証機能の無い）テストアプリケーションを限定的に公開したいため、アクセス元のIPアドレスを制限したいというケースがあると思います。

このような場合、VPCのセキュリティ・グループの機能を利用して、IPアドレスのホワイトリスト形式で制限をかけることが可能です。以下にその手順をご紹介します。

なお、当手順はVPCに作成したROKSクラスターのみに適用可能です。


# 前提環境
- Red Hat OpenShift on IBM Cloud (OpenShiftバージョン：4.11.4_1523）（VPC Gen2）


# ROKSクラスターに適用されるセキュリティ・グループ
手順のご紹介の前に、ROKSクラスターに適用されるセキュリティ・グループを整理しておきます。VPCにROKSクラスターを作成すると、ワーカーノード、VPEゲートウェイ、VPC ALBに対して以下の3つのセキュリティ・グループが適用されます。

- VPCセキュリティ・グループ
  - VPCの作成時に一緒に作成される
  - 名前：ランダムな単語の連結
  - ワーカーノードに関連付けられる（ただし、セキュリティ・グループの詳細ページを見ても、関連付けられたワーカーノードは表示されない）
- VPCクラスター・セキュリティ・グループ
  - ROKSクラスター作成時に一緒に作成される
  - 名前：kube-[cluster ID]
  - ワーカーノードに関連付けられる（ただし、セキュリティ・グループの詳細ページを見ても、関連付けられたワーカーノードは表示されない）
- Red Hat OpenShift on IBM Cloud セキュリティー・グループ
  - ROKSクラスター作成時に一緒に作成される
  - 名前：kube-[VPC ID]
  - ROKSクラスター作成時に作成されるVPEゲートウェイ、ALB（アプリケーション・ロード・バランサー）に紐付けられる

# 実施する設定の概要
上記のセキュリティ・グループのうち、ROKSにデプロイされたアプリケーション、および、OpenShift Webコンソールへのアクセスを制御する場合、「Red Hat OpenShift on IBM Cloud セキュリティー・グループ」の設定内容を変更します。

ただ、デフォルトで作成されている「Red Hat OpenShift on IBM Cloud セキュリティー・グループ」自体を変更することは[推奨されていません](https://cloud.ibm.com/docs/openshift?topic=openshift-vpc-security-group#vpc-sg-vpe-alb)。そのため、新たにセキュリティ・グループを作成し、そのセキュリティ・グループに必要な設定を行ったうえで、デフォルトの「Red Hat OpenShift on IBM Cloud セキュリティー・グループ」を置き換える（デフォルトのセキュリティ・グループの関連付けを削除し、新たに作成したものを関連付ける）という対応を実施します。


# 設定手順
[VPCのセキュリティ・グループの作成ページ](https://cloud.ibm.com/vpc-ext/provision/securityGroup)に遷移します。

任意の名前(ここでは「kube-vpc-custom」)を入力し、作成対象のVPCを選択し、「セキュリティー・グループの作成」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/e777ec05-8307-4829-3535-2884e5aefaf0.png)

セキュリティ・グループの一覧ページに遷移するので、作成したセキュリティ・グループを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/b0b47753-52c6-fe16-4902-56f4925d6030.png)

「ルール」タブをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/8212cffd-502a-7432-ab29-82b828555fbb.png)

インバウンド・ルール、アウトバウンド・ルールのそれぞれに「作成」ボタンがあるので、これをクリックし、ルールを作成していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/f9579e9c-1b93-61db-8056-0352385fe30e.png)

デフォルトのセキュリティ・グループを置き換えるにあたり、インバウンド・ルール、アウトバウンド・ルールともに、ROKSの動作のために最低限許可する必要のあるルールがいくつかあります（なお、セキュリティ・グループは「許可」するルールを登録します。ルールに該当しないアクセスは全て拒否されます）。

最低限必要なインバウンド・ルールは以下になります。

| プロトコル | ポート | ソース |
|:-:|:-:|:-|
| TCP  | 80  | クラスターが配置されているリージョンのコントロール・プレーンのCIDRブロックを許可します。CIDRブロックは、GitHubにリージョンごとに記載されています（[kube-samples/control-plane-ips](https://github.com/IBM-Cloud/kube-samples/tree/master/control-plane-ips) 参照)。東京リージョンは [control-plane-ips-tok.txt ファイル](https://github.com/IBM-Cloud/kube-samples/blob/master/control-plane-ips/control-plane-ips-tok.txt) です。 |


最低限必要なアウトバウンド・ルールは以下になります。

| プロトコル | ポート | 宛先 |
|:-:|:-:|:-|
| TCP  | 30000 - 32767  | 任意 |
| UDP  | 30000 - 32767  | 任意 |


また、ROKS上のアプリケーション、OpenShift Webコンソールにアクセスすることを許可するIPアドレス（またはCIDRブロック）、ポートをインバウンド・ルールに登録します。

これらを許可した結果のセキュリティ・グループは以下のようになります（赤枠部分は、アプリケーション・Webコンソールへのアクセスを許可するIPアドレス（CIDRブロック）です）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/2eeb763c-3da6-c17c-0847-a9220364fe95.png)


次に、作成したセキュリティ・グループをVPC ALBに設定していきます。[VPC ALBの一覧ページ](https://cloud.ibm.com/vpc-ext/network/loadBalancers)にアクセスします。

ROKSを作成済みの場合、「kube-xxxx」という名前のALBがあるので、それをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/8a18eec4-70e6-ea06-77fc-5bb67fc43391.png)

「接続されたセキュリティー・グループ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/2487165c-1478-9690-1592-041141eadf28.png)

「接続」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/0cc6b3e6-736c-de96-0b10-bbba4eb17bfb.png)

作成したセキュリティ・グループを選択し、「接続」ボタンをクリックします。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/30b6eca5-ee9e-2ff3-ca02-fb8acef45364.png">

作成したセキュリティ・グループが接続されていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/bfbd8ddd-a6b1-20cc-effa-6250ac5c49b3.png)

次に、デフォルトのセキュリティ・グループを切り離します。デフォルトのセキュリティ・グループ（「kube-[VPC ID]という名前のセキュリティ・グループ）の右側の「︙」をクリックし、「切り離し」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/4e15b8ce-0b3a-1343-d7cf-24827950a490.png)

「切り離し」ボタンをクリックします。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/35cab2f8-7bb6-27ea-cf6f-ffc84c026d06.png">

新たに作成したセキュリティ・グループのみが接続されていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/7f24432b-0ac0-c819-b85b-f434e67e3d8d.png)

これで全ての設定が完了しました。これにより、新たに作成したセキュリティ・グループのインバウンド・ルールで許可したIPアドレスからのみアクセスできるようになっているはずです。ROKS上のアプリケーション、および、OpenShift Webコンソールにアクセスし、試してみてください（許可されていないIPアドレスからもアクセスし、アクセスできないことも確認してみてください）。