Red Hat OpenShift on IBM Cloud(Classic Infrastructure): Security Groupを使った外部アクセス制御

# 1. はじめに

Classic InfrastructureでのRed Hat OpenShift on IBM Cloud(ROKS)では、[ここ](https://qiita.com/testnin2/items/22307e5a2eda851c1438)で説明した通り、L4 Load BalancerはNLB Pod(`ibm-cloud-provider-ip-<IPアドレス>-xxxxxxxx`)で実装されているため、外部アクセスはworker node上のNLB Podを直接経由する。

<img width="750" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/08cdfb2a-5af6-ec82-3248-7a88e8b8fe6a.png">

NLB Podに割り当てられるIPアドレスは、実際にはworker node上のeth1インターフェースに割り当てられるPublic Portable IPであるため、Security Groupでも通信制御が可能なはずである。本稿では、確かに制御できることを確認してみた。

※ なお、NLB Podには外部から直接アクセスされることになるのでCalicoのセキュリティー機能を組み合わせるのも有効であり、IBM Cloud docsではそちらの手法が紹介されている（[参考](https://cloud.ibm.com/docs/openshift?topic=openshift-policy_tutorial)）。影響範囲がeth1全体ではなく、NLB Podだけに留めることがので、有力な選択肢であると思われる。

# 2. Security Group適用における注意点

- アプリケーションごとに制限することが難しい（eth1への一括適用になる）
- security groupを初回適用するためにはcustomer portalからの再起動が必要になる。
- 新たなworker nodeが追加される度に適用作業が必要である。
- アクセス許可の制御漏れに注意。少なくとも以下のアクセス許可は必要だと思われる。
    - ノード間のVRRP
    - CISからのヘルスチェック


# 3. アプリケーション準備

```txt:アプリケーションの作成と公開
[root@syasudacentos7 ~]# oc new-app --docker-image=nginx:latest
[root@syasudacentos7 ~]# oc expose svc nginx
[root@syasudacentos7 ~]# oc get routes
NAME    HOST/PORT                                                                                                     PATH   SERVICES   PORT     TERMINATION   WILDCARD
nginx   nginx-default.xxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-0000.jp-tok.containers.appdomain.cloud          nginx      80-tcp                 None
```

# 4. Security Group適用前のアクセス確認

```txt:IBM Cloud上のサーバーからのアクセス
[root@syasudacentos7 ~]# curl -I http://nginx-default.xxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-0000.jp-tok.containers.appdomain.cloud
HTTP/1.1 200 OK
server: nginx/1.25.1
date: Mon, 14 Aug 2023 00:20:13 GMT
content-type: text/html
content-length: 615
last-modified: Tue, 13 Jun 2023 15:08:10 GMT
etag: "6488865a-267"
accept-ranges: bytes
set-cookie: 3bc5f7a8aec67b74b33e81d956f57cb9=c3d3e037efd05ebc09dfdb4c6919f5c1; path=/; HttpOnly
cache-control: private
```
```txt:自宅端末からのアクセス
syasuda@ShinobunoMacBook-Pro ~ % curl -I http://nginx-default.xxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-0000.jp-tok.containers.appdomain.cloud
HTTP/1.1 200 OK
server: nginx/1.25.1
date: Mon, 14 Aug 2023 00:20:29 GMT
content-type: text/html
content-length: 615
last-modified: Tue, 13 Jun 2023 15:08:10 GMT
etag: "6488865a-267"
accept-ranges: bytes
set-cookie: 3bc5f7a8aec67b74b33e81d956f57cb9=c3d3e037efd05ebc09dfdb4c6919f5c1; path=/; HttpOnly
cache-control: private
```

# 5. Security Groupの適用

## 5-1. Security Groupの作成

- eth1におけるノード間のVRRPが許可されるように、このSecurity Groupを適用しているインターフェース間は全て許可する。ただし、Classic InfrastructureにおけるSecurity Groupの初回適用時にはVSIの再起動を要するため、いきなり最終段階のSecurity Groupを適用すると、Security Group適用後のVSIは、Security Group未適用のVSIからのVRRP通信を受け付けることができなくなる。よって以下のように、一時的にSecurity Groupの設定として「全ての通信を許可するルール」も追加しておき、全てのWorker nodeでSecurity Groupを有効にした後に、「全ての通信を許可するルール」を削除する方針とした。 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/93206cb5-0da4-55f1-d93b-235fe1b58e35.png)
- CISからのヘルスチェック(https://api.cis.cloud.ibm.com/v1/ips) を許可 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/be7832cb-481e-658a-4468-7dfd2724fca8.png)
- 利用者固有の通信制御 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/9eff20db-a85e-5a28-e04c-51b7aed8ca42.png)

## 5-2. Security Groupをworker nodeのVSIに適用

- 上記で作成した3つのSecurity Groupをeth1に適用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/5004448c-a6b4-ae07-805f-b68ebed13cfd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/e4886427-e3f6-83b3-62a9-cf9d62e0340a.png)
- Security Groupを初めて適用する際は、Customer Portalからの再起動が必要。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/817852b0-c5ca-d61a-a197-5bf843bfaae3.png)

## 5-3. Security Groupの修正

全てのWorker nodeのeth1にSecurity Groupを適用した後、「全ての通信を許可するルール」を以下のように削除。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/1042d89e-e2ac-fe48-946f-236fd57927b8.png)

# 6. Security Group適用後のアクセス確認

```txt:IBM Cloud上のサーバーからのアクセス（応答がない。ブロック成功）
[root@syasudacentos7 ~]# curl -I http://nginx-default.xxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-0000.jp-tok.containers.appdomain.cloud
（応答なし）
```
```txt:自宅端末からのアクセス（アクセスに成功）
syasuda@ShinobunoMacBook-Pro ~ % curl -I http://nginx-default.xxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-0000.jp-tok.containers.appdomain.cloud
HTTP/1.1 200 OK
server: nginx/1.25.1
date: Mon, 14 Aug 2023 00:35:43 GMT
content-type: text/html
content-length: 615
last-modified: Tue, 13 Jun 2023 15:08:10 GMT
etag: "6488865a-267"
accept-ranges: bytes
set-cookie: 3bc5f7a8aec67b74b33e81d956f57cb9=49a05c8390329603b2121331038518e4; path=/; HttpOnly
cache-control: private
```