IBM Cloudの「コンテキストベースの制限事項」機能で Cloud Object Storageバケットに、Cloud Pak for Data as a Service からの Private Endpoint経由の通信のみを許可する

## 本記事の目的
本記事では IBM Cloudの「コンテキスト・ベースの制限事項」機能を利用し、特定のCloud Object Storageバケットについて、CP4DaaSクラスタのプライべートIPアドレス範囲からPrivate Endpoint経由の接続のみ許可する設定例を紹介します。

## 1. 本記事で利用するIBM Cloudの機能について

本記事の設定例で利用するIBM Cloudの機能について紹介します。

### 1. コンテキストベースの制限事項

2021 年 9 月に追加された機能です。
IBM Cloud リソースに対して、ネットワーク・ロケーション（IP アドレス構造、VPC、サービス参照）に基づくアクセス制限を構成および適用するために使用します。

従来より、IBM Cloud アカウントやユーザー単位での許可IPアドレスを構成可能（[Allowing specific IP addresses](https://cloud.ibm.com/docs/account?topic=account-ips&interface=ui)）でしたが、コンテキストベースの制限事項によってIBM Cloudリソース単位でのよりきめ細かいアクセス制御が可能となりました。

- 製品資料：IBM Cloudの概要 ＞ リリース情報 2021年9月
  https://cloud.ibm.com/docs/overview?topic=overview-whatsnew&locale=ja#overview-sept2721

- 製品資料：What are context-based restrictions?
  https://cloud.ibm.com/docs/account?topic=account-context-restrictions-whatis

  上記URLより引用し一部改変：Figure 1. A diagram that shows how context-based restrictions work.
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/dad1d991-af2b-2fe5-b504-467585cd6206.png)


2022年9月現在、コンテキストベースの制限事項に対応しているIBM Cloudサービスは以下となります。
最新のサポート状況は、下記の製品資料をご確認ください。

- 製品資料：Services integrated with context-based restrictions
  https://cloud.ibm.com/docs/account?topic=account-context-restrictions-whatis#cbr-adopters

|Service  |Service type  |
|---|---|
|IAM Access Groups Service  |Account Management  |
|IAM Access Management Service  |Account Management  |
|IAM Identity Service|Account Management|
|IAM User Management|Account Management|
|IBM Cloud Object Storage|IAM-enabled|
|Code Engine|IAM-enabled|
|Container Registry|IAM-enabled|
|Key Protect|IAM-enabled|

#### コンテキストベースの制限の利用方法

コンテキストベースの制限を利用する際には、`ネットワーク・ゾーン`と`ルール`を定義します。

**ネットワークゾーン**
対象IBM Cloudリソースへのアクセスを許可するネットワーク・ローケーションを指定します。
ネットワーク・ローケーションとして指定できる項目は、IP アドレス構造、VPC、サービスとなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/ea9f289d-a8ef-3d07-080f-33582ddd611f.png)

- ネットワークゾーンの作成画面
  ネットワークローケーションとして,IPアドレス、VPC、サービスを指定可能です。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/9079cf23-2ecc-a5ff-4dbe-15af04017c2b.png)

- 作成済みネットワークゾーンのリスト画面
  ネットワークゾーン作成時に指定したネットワーク・ローケーション（例ではIPアドレス範囲）が表示されます。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/6518e134-19d9-487b-e929-62328ed0e72b.png)

**ルール**
コンテキスト（ネットワークゾーン、エンドポイント）とコンテキストからのアクセスを許可するIBM Cloudリソースを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/2731af51-896e-f0dd-ddf7-e52674a9f6d4.png)

- ルールの設定項目
ルールの作成時、以下の各項目について値を設定します。

|項目| 選択肢 |説明|
|---|---|---|
|ルールを強制するか   |有効|この規則を強制適用します。 アクセス試行の拒否は、 Activity Trackerに報告されます。|
|   |無効|この規則を強制適用しません。 アカウント・リソースには制限は適用されません。|
|   |Report-only   |このルールが適用されずに、ユーザーにどのような影響を与えるかをモニターします。 このアカウント内のリソースへのアクセス試行はすべて、 Activity Trackerに記録されます。 ルールを適用する前に、30日間モニターすることをお勧めします。　 |
|サービス|コンテキストベースの制限事項に対応したIBM Cloudサービス|先述のコンテキストベースの制限事項に対応しているIBM Cloudサービスを指定可能です。|
|リソース|「すべてのリソース」または「特定のリソース」|「特定のリソース」を選択すると、条件に合致した特定のサービス・インスタンスのみを指定可能です。|
|ネットワークゾーン|事前に作成済みの1つ以上のネットワークゾーン|IBM Cloudリソースへのアクセスを許可するネットワーク・ローケーションを定義したネットワークゾーンを指定します。|
|エンドポイント・タイプ|Public|どこからの要求も受け入れ、発信帯域幅に基づいて課金が評価されます。|
||Private|IBM Cloud 内から送信されるほとんどの要求に使用できます。|
||Direct|Cloud Object Storageで利用可能です。VPC 内のリソースから送信される要求の場合、個人所有の IP (BYOIP) シナリオで使用されます。|

- ルールの作成画面
  任意のルール名を指定し、ルールを強制するか選択します。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/1ca7a3eb-415d-c1d9-85cc-dd6166712630.png)
  対象のIBM Cloudリソースを選択します。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/63afb2e4-1461-b03a-4969-d6a14362955a.png)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/045a7275-930e-e02d-d1e4-b8949bad4cce.png)
  エンドポイント・タイプとネットワークゾーンを選択し、保存します。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/a77ad810-2490-0274-fefa-c1816d6aab91.png)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/173c459b-d739-4e2e-52cf-dcf1b379af9e.png)

- 作成済みのルールののリスト画面
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/a8ba564d-b51a-51c7-38af-6d792157c805.png)

**ルール違反のモニタリング**

オプションとしてIBM Cloudのサービスとして提供されているActivity Trackerを併用すると、ルールの違反をモニタリングすることができます。
ルールの設定項目「ルールを強制するか」で、`有効`または`Report-only`を指定したルールが、モニタリングの対象となります。

- 製品資料：Monitoring context-based restrictions
  https://cloud.ibm.com/docs/account?topic=account-cbr-monitor

  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/55c1857a-6be4-a613-ae4b-2322fa9842f9.png)

:::note warn
IBM CloudのサービスのActivity Trackerを作成する際、`ルールを定義したIBM Cloudリソース`と`Activity Trackerインスタンス`のリージョンを一致させることが必要です。
両者のリージョンが異なると、Activity Trackerはモニタリングすることができません。

また、IAMに関連するAccount Managementタイプのサービスをモニタリングする場合、**eu-de（フランクフルト）** のActivity Trackerインスタンスの利用が必要となります。

- 製品資料：Auditing events for account, IAM, catalog management
  https://cloud.ibm.com/docs/account?topic=account-acct_iam_tracking#tracking-iam

>＜該当箇所の抜粋＞
You must create an instance of the Activity Tracker service in the **eu-de** region to start **tracking IAM events**. 
:::

### 2. Private Endpoint

Private Endpointは、IBM Cloudのサービス・エンドポイント対応サービスで利用可能なオプションです。
対応サービスのリソースでPrivate Endpointを有効化すると、IBM Cloudプライベート・ネットワーク経由でのリソース・アクセスが可能になります。
例えば、IBM Cloud上の仮想サーバー(Virtual Server Instance:VSI)にデプロイしたアプリケーションから、IBM Cloud上のCloud Object Storageやデータベース・サービスにアクセスする場合など、IBM Cloud上のリソース同士の通信に利用することができます。
Private Endpointのみを有効化したリソースは、インターネットでルーティング可能な IP アドレスを持たないため、パブリック・インターネットへのアクセスを制限したい場合に役に立ちます。

- Private Endpointを利用可能なサービス
    - 「サービス・エンドポイントを使用したサービスへのセキュアなアクセス」＞「サービス・エンドポイントの使用」参照
    - https://cloud.ibm.com/docs/account?topic=account-vrf-service-endpoint&interface=ui

- 上記URLより引用：図 1. サービス・エンドポイントを介してルーティングされるトラフィック 
    ![image.png](https://cloud.ibm.com/docs-content/v1/content/ff9c5ffeb676ecd87041bd8ea0fc6ed9dbcac6c6/nl/ja/account/images/CSE.png)


## 2. Cloud Object Storageバケットに対してCP4DaaSからPrivate Endpoint経由でのアクセスのみ許可する設定例

データを蓄積用のCloud Object Storageバケット（以下、COSバケット）を作成し、東京リージョンのCP4DaaS製品が使用するクラスタIPアドレスからプライベートエンド・ポイント経由でのアクセスのみ許可する方法を確認します。

- 実現するイメージ
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/59b493b9-4f76-b576-6c1a-b3fa637a2580.png)

以降の手順は、下記の製品資料の手順を「コンテキスト・ベースの制限事項」に読み替えて実施したものとなります。

- 製品資料：Firewall access for Cloud Object Storage
  https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/firewall-cfg-private-cos.html?audience=wdp&locale=en

### 1. 東京リージョンのCP4DaaS製品が使用するIPアドレス範囲の確認
- 東京リージョンのCP4DaaSへログインし、ナビゲーションメニューより「管理」＞「クラウド統合」と進みます。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/a54e5130-09cf-3dbd-7ad5-9f74cef52022.png)
- 「クラウド統合」ページの右上より「ファイアウォール構成」をクリックします。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/92cb7ea8-78fa-2df1-211f-4958c1ebaa8b.png)
- 「クラウド・ファイアウォールの構成」ウィンドウが表示されます。2つのチェックボックスを☑します。
- Private IPsのアドレス範囲を全て控えます。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/66d6a428-449b-9166-4c0e-0234c1eea0a9.png)

### 2. COSバケットの準備
- IBM CloudのWebコンソールより、Cloud Object StorageのUIへ進みます。
- COSバケットアクセス用にサービス資格情報を新規作成します。
  - 「サービス資格情報」ページを開き、「新規資格情報」をクリックします。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/775b01e7-a56c-18b6-b392-e671836f2958.png)
  - 任意の名前、役割「ライター」を指定し、詳細オプションをクリックします。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/88353b34-3072-299f-99e9-b4d77b3e6647.png)
  - 「HMAC資格情報を含める」をオンに設定し、「追加」をクリックします。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/ac4d3e44-1171-c3dd-4d61-3de5a25a3264.png)
  - 作成されたサービス資格情報のJSONを控えます。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/c1c10f9d-e73e-3ae8-f1d8-ffd59a45a696.png)
- COSバケットを新規作成します。
  - 「バケット」ページを開き、「バケットのカスタマイズ」 をクリック
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/21d645ed-b754-18e6-b198-3f70e830b01e.png)
  - 任意のバケット名・ロケーション・回復力を指定し、バケットを作成します。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/007da5b7-1f4d-2ed2-1e6b-f97fa734a866.png)
  - 作成が完了したCOSバケットの詳細画面が表示されます。
  - COSバケットへ分析のデータソース用のCSVファイルをアップロードします。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/be215c2f-95e6-4ae2-3912-4a5016b384c3.png)
  - COSバケットの詳細画面より「Configuration」＞「エンドポイント」へ進み、プライベート・エンドポイント用のURLを控えます。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/21d207f6-7a17-9af1-7aa9-4a4f342c90a1.png)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/f1aa703a-ea6c-1c24-51cc-5e2cff43737d.png)

### 3. COSバケット用のコンテキストベースの制限事項の作成
- COSバケットの詳細画面より「Permission」＞「コンテキスト・ベースの制限事項」＞「ルールの作成」へ進みます。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/f68a0a45-237d-905e-b990-22f0e49bee04.png)

- 新規のルールを作成します。
  - 強制 では「有効」を選択し、続行します。 
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/8f8107d4-deac-7943-df0c-3b275f807988.png)
  - サービスとして、「Cloud Object Storage」を選択し、続行します。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/66e314b2-8f04-c0cd-4fae-ba96ee4d4171.png)
  - リソースとして、「特定のリソース」を選択します。
  - リソースの条件へ以下の3つの条件を指定し、続行します。
    - サービスインスタンス：自分のCOSインスタンス
    - リソースID：作成したバケット名
    - リソース・タイプ：bucket
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/d73bd679-ad42-c303-3f92-d6110d4c884a.png)
  - エンドポイント・タイプとして以下を指定します。
    - すべてのエンドポイント・タイプを許可しますか：いいえ
    - プライベート・エンドポイントを選択
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/aa9647da-062a-3c9e-bff7-57bc84838d91.png)
  - ネットワーク・ゾーンのセクションにて「作成」をクリックします。
  - 任意のゾーン名を指定し、「許可されたIPアドレス」へ控えておいたCP4DaaSの製品IPアドレス範囲を全て記載します。その後、次へ進みます。

:::note warn
本手順では、簡単のため、`東京リージョンのCP4DaaS製品が使用するクラスタIPアドレス`からの接続のみを許可していますが、実際の設定時は`COSバケットにデータをアップロードする環境のIPアドレス`の追加も必要です。
この設定が抜けてしまうと、COSバケットへのデータ・アップロードがエラーとなってしまうため、ご注意ください。
:::

  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/c12416cf-5dc2-f0f6-4148-a3ebc4091061.png)
  - 内容を確認し、ネットワーク・ゾーン作成します。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/c7856329-5422-09e0-ccad-e4b000e098f3.png)
  - ルールの作成画面へ戻ります。作成したネットワークゾーンを選択し、追加します。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/650c5674-3dd0-8256-aa05-8821106737d7.png)
  - ルールの内容を確認し、作成します。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/332312f1-83b3-c5c3-87d8-2ef09abb373e.png)
  - 作成されたルールが一覧へ表示されます。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/d4f08641-eac9-0e70-1160-e277fd981a5b.png)

### 4. CP4DaaSからCOSバケットへ接続 

**①東京リージョンのCP4DaaSからPrivate Endpoint経由でCOSバケットへ接続　→　接続OK**
許可したコンテキスト（エンドポイント・タイプ、IPアドレス）から接続できることを確認します。

- 東京リージョンのCP4DaaSへアクセスします。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/55980525-d02a-3d31-23bc-fb4c48586aef.png)
- テスト用にプロジェクトを新規作成します。
- プロジェクトへ接続資産を作成します。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/006693de-f5f0-919a-1acd-123f2cd5fb47.png)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/08401c7a-9150-f2dc-b34b-524f191fe1ee.png)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/38c536af-6b6b-935d-1aad-c27caa72041b.png)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/0faceaea-0534-6e82-85b9-89566a9a531e.png)
  控えておいたCOSバケットのエンドポイントURLとサービス資格情報を利用します。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/cad0f43c-11c3-ee95-16ad-e8ce4bcabbd3.png)
- テスト接続を実行します。接続に成功します。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/ed5d25ca-c7d8-c4ad-65f9-2b34190d9a23.png)

**②ダラス・リージョンのCP4DaaSからPrivate Endpoint経由でCOSバケットへ接続　→　接続NG**
許可していないコンテキスト（IPアドレス）から接続が失敗することを確認します。

- ダラス・リージョンのCP4DaaSへアクセスします。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/216f9ce0-a723-0c31-ce75-ecf8e3e52798.png)
- テスト用にプロジェクトを新規作成します。
- プロジェクトへ接続資産を作成します。
- テスト接続を実行します。接続は失敗します。
  `テストは正常に終了しませんでした
  The assets request failed: CDICO0103E: Invalid username or password: Amazon s 3 error: Access Denied 
  (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: 9909c95b-e3c6-49d3-b777- 
  eb0674e9ffb9)`
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237849/bce8abcc-08a7-9197-a565-71bcf88cb2bd.png)

期待通りCOSバケットへ、東京のCP4DaaSからPrivate Endpoint経由の接続のみ許可することができました。

## 参考資料

- 製品資料：What are context-based restrictions?
  https://cloud.ibm.com/docs/account?topic=account-context-restrictions-whatis

- 製品資料：Monitoring context-based restrictions
  https://cloud.ibm.com/docs/account?topic=account-cbr-monitor

- 製品資料：Firewall access for Cloud Object Storage
  https://dataplatform.cloud.ibm.com/docs/content/wsj/admin/firewall-cfg-private-cos.html?audience=wdp&locale=en