Context-base Restrictionとは

# はじめに
IBM Cloudコンソールのトップにある「管理」メニューに表示される `コンテキスト・ベースの制限(Context-base Restriction)` と記載ありますが、あなたはいったい何者？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/d57405fe-f04f-14a4-76d0-d15d90cdba5d.png)

Qiitaに記事が見当たらなかったので、簡単にご紹介。

# 「どこからIBM Cloudのサービスを利用するか」を制限するもの
権限管理と言えば、一般的に `Administrator`, `Operator`, `Writer`, `Reader` といったように **何をして良いか？** を設定します。
IBM Cloudでは、IAMから各サービス単位でもそうですし、アカウント管理の権限についても細かく設定し安全な権限管理を実現できます。

Context-base Restrictionは、IAMの権限管理に **加えて** 、どこからのアクセスに限定する、もしくは拒否するといった設定を行うことが可能です。

　例えば、社用PCを家に持ち帰り、クローンしていたソースコードからコンテナを作成して、家からこっそりコンテナ等をデプロイしちゃえ！となっても、例えばContainer Registryのサービスを社内ネットワークからしかアクセスできないように塞いでおけば、セキュリティ対策をしていないネットワーク環境から何かしら更新される、というリスクを排除することができます。
 
 ![shigoto_zaitaku_cat_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/849a6961-6980-91ed-f2cf-14982e2de003.png)

　これはICOSといったObject Storageサービスも同様で、昨今ランサムウェアもどこから侵入されるかわからないので、せめてセキュリティチェックが走る社内ネットワークは良いけど、自宅ネットワークからクラウドサービスにアクセスするのは勘弁してと考えるCSO、CISOも決して少なくないでしょう。
![kaisya_komaru_man-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/692224b9-552a-02e1-a7a0-5bc6c69f57a3.png)



　従来、各サービスのアクセス元IPアドレスによるフィルタリングといった機能は、サービス毎に実装されていましたが、これがContext-base Restrictionで一元的に実装されつつあります。
 
 :::note warn
 現在Context-base Restrictionに対応しているIBM Cloudのサービスは限定的です
:::

# IAM権限管理の延長線上のサービス
　これでIPアドレス制限がいろんなサービスに設定できると思った方は注意が必要です。このアクセス管理はIAMの権限認証を通った後に行われます。
 つまり、IAMの権限認証を通らない部分に制限をかけることはできません。

:::note
アクセス制限をかけられるもの
- ICOSのUploadやDownload
- Containre RegistryのコンテナのPush/Pull
- VPCのInstance作成や設定変更
 
:::
 
:::note alert
アクセス制限をかけられないもの
- Code Engineにデプロイしたアプリケーション
- IKS/OpenShiftで外部公開したアプリケーション
- Context-base Restrictionに対応していないサービス
 
:::

デプロイされたアプリケーションは、IBM CloudのIAMの認証を通過せずに、直接そのアプリケーションのエンドポイントへアクセスする形になるので、Context-base Restrictionの適用対象外になっています。

一方、ICOSへのアクセス権限はIAMで厳密に設定するため、ICOSへのファイルアクセス前には必ずIAMの認証を通過しています。こういったサービスではContext-base Restrictionの恩恵を受けることが出来ますね。

執筆した2024/7/26時点の情報では各対応サービス毎に以下のイメージでできる/できないが分かれます。
わかりやすく記述すると `IBM Cloudのコンソール、もしくはCLIやAPIで操作可能な部分には対応可能、そうでない部分は対象外` になりますね。
|対応サービス|できる|できない|
|---|---|---|
|Catalog Management Service|・サービス自体の設定<br>・特定のサービスのカタログにアクセスして良いアクセス元の設定||
|Context-based restrictions Service|・サービス自体の設定||
|IAM Access Groups Service|・サービス自体の設定||
|IAM Access Management Service|・サービス自体の設定||
|IAM Identity Service|・サービス自体の設定||
|IAM User Management|・サービス自体の設定||
|Activity Tracker|・サービス自体の設定|・Activity Trackerに記録される操作者のアクセス元フィルタリング|
|App Configuration|・サービス自体の設定||
|Cloud Object Storage|・サービス自体の設定<br>・Upload/Downloadの利用者||
|Code Engine|・サービス自体の設定|・アプリケーションのアクセス元フィルタリング|
|Container Registry|・サービス自体の設定<br>・Push/Pull||
|Databases for DataStax|・サービス自体の設定<br>・DBへのアクセス元フィルタリング||
|Databases for EnterpriseDB|・サービス自体の設定<br>・DBへのアクセス元フィルタリング||
|Databases for Elasticsearch|・サービス自体の設定<br>・DBへのアクセス元フィルタリング||
|Databases for etcd|・サービス自体の設定<br>・DBへのアクセス元フィルタリング||
|Databases for MongoDB|・サービス自体の設定<br>・DBへのアクセス元フィルタリング||
|Databases for MySQL|・サービス自体の設定<br>・DBへのアクセス元フィルタリング||
|Databases for PostgreSQL|・サービス自体の設定<br>・DBへのアクセス元フィルタリング||
|Databases for Redis|・サービス自体の設定<br>・DBへのアクセス元フィルタリング||
|Direct Link|・サービス自体の設定|・通過するパケットのアクセス元フィルタリング|
|DNS Services|・サービス自体の設定|・DNSを参照するアクセス元サービスのフィルタリング|
|Event Notifications|・サービス自体の設定<br>・イベントを連携するアクセス元サービスのフィルタリング||
|Log Analysis|・サービス自体の設定|・Log Analysisに記録されるサービスのアクセス元フィルタリング|
|Event Streams|・サービス自体の設定||
|Key Protect|・サービス自体の設定||
|Kubernetes Service / Red Hat OpenShift|・サービス自体の設定|・アプリケーションのアクセス元フィルタリング|
|Messages for RabbitMQ|・サービス自体の設定<br>・MQへのアクセス元フィルタリング||
|Secrets Manager|・サービス自体の設定||
|Security and Compliance Center|・サービス自体の設定||
|Transit Gateway|・サービス自体の設定|通過するパケットのアクセス元フィルタリング|
|IBM Cloud® Virtual Private Cloud|・サービス自体の設定|・作成されたIaaSに対するアクセス元フィルタリング|
|Schematics|・サービス自体の設定|・デプロイのスクリプトがアクセスする先の外部サービスに対するフィルタリング|

# サービスのどのレベルにまで制限をかけられるのか？
各指定可能なサービス毎に設定項目を洗い出しました。
`Service ID` と `Instance ID`は同じでは、と作りながら思ったりしましたが、UI上異なる名称なので仕方ありませんね…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/462c7380-45e0-eacd-0893-fa917c6e9fbb.png)

例えば、Code Engineであれば、特定のロケーション(東京のみ)に制限をかけて、他のロケーションは変更可能としたり、IKSやOpenShift環境では特定のリソースグループのクラスターだけ制限をかける、といったことが可能です。

# どうやって設定するか
サンプルとしてContainer Registryに対するアクセス制御の手順を紹介します。

現在どのような状態かというと、東京のContainer Registryに `cbr-test-space`と `katahiro-space` の2つにそれぞれ `hello-world:latest` のイメージが格納されている状態で、どちらも参照できています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/109b791e-2553-45d5-b97b-52b869fae5db.png)

では、Context-base Restrictionの設定を行ってみましょう。
まず、Context-base Restrictionの設定ページで、`ネットワークゾーン` を選択し、どこからのアクセスを許可するかの設定から作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/f0ddb3b1-26da-5783-eddd-effda58c5b3b.png)

設定が何もない人も多いと思いますが、右側から `作成` を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/8ef20639-3398-7902-7389-e96ed35ebb27.png)

名称と、今回は許可するIPアドレスに適当にですが `192.168.0.0/24` を指定しています。インターネット越しのアクセスを行うので、それが制限できればいったん登録するのは何でも良いです。企業であれば、企業ネットワークから外向きに出ていくProxyのグローバルIPアドレス等を入れて頂ければ、社内ネットワークからのアクセスに制限できます。
今回は、RFC1918のPrivate Networkで利用するIPアドレスを指定してみています。（つまりインターネットからのアクセスを許可しない)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/e209285b-7925-72d2-653d-d2cc871d60db.png)

:::note
設定に `許可されたVPC` とあるように、アカウント内の特定のVPCからのみのアクセスに制限する、といった設定も可能です。
:::

設定に問題が無ければ `Create` で作成してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/9d0deb4b-cc37-de41-fcbb-cbdfd7f0ef67.png)

これで無事にネットワーク制約が作成できました。先に制約を作成しておくと、後でサービス毎に許可設定を作成する際に流用がしやすくなり、対象ネットワークの変更が発生した際にネットワーク制約を変更すれば各サービスへの制約もまとめて変更することが可能になります。

さて、今度は対象のサービスに対して制約を作成するので、 `ルール` を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/358ceb6a-6657-2f05-045e-3a827dd132cc.png)

右側から `作成` を選びます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/b7bf3009-ca19-057f-5f0f-c4857860594d.png)

対象のサービスを選択します。今回は `Container Registry` を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/e094f190-50d3-7bd2-8cbc-5ddb10e3a858.png)

デフォルトで設定されていますが、APIを通じた操作の全てを制限の対象とします。Container Registryはそれ以外の設定ができません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/01e07b47-7629-a1ab-309b-da64bd06cdf9.png)

今回はリソースを選択せずに、全てのリソースを対象とします。
※リソース選択する場合の動作の違いは後ほど紹介します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/a1da2699-7d2f-688f-4ba4-1719f4c70646.png)

エンドポイントタイプは特に指定せずに、許可されたネットワークゾーンとして、先ほど作成したネットワークゾーンを選択して `追加` します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/a91a10e9-8252-4592-77c4-13dd90b287a0.png)


:::note
エンドポイントタイプを指定すると、パブリックエンドポイントだけや、プライベートエンドポイントだけ、といった制限をかけることも可能です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/cda2302c-97af-3c06-7af1-4dd39ef41368.png)
:::

右側に表示されるルール内容に問題なければ `実行` を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/13be9c72-1a8c-d0e5-e0f9-25c1fef55aa2.png)

:::note
ネットワークゾーンの設定を複数作成していると、先ほどの画面でまとめてゾーンの設定が可能になります。
:::

ルールを即時反映させるには `有効` を選択してください。こちらでは、逆に有効だったルールを `無効` に変更することや、 `レポートのみ` を利用して、制限はしないけれど、Activity Trackerにこの制限に抵触したことをレポートさせることも可能です。

今回は即時有効にするため、 `有効` を選択して `作成` します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/352b2bc6-ccf3-0bd1-a1e1-c92613e5506f.png)

これで `Containre Registry` に対して `192.168.0.0/24` 以外からのアクセスを許可しない設定ができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/0172d908-7492-4cd9-4aa9-fbe9435498a5.png)

では、先ほどと同じように Container Registry に登録されたイメージ一覧を表示するコマンドを実行すると、インターネット越しにアクセスしている私の環境では何もみえなくなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/be4826ab-be78-8ffd-af65-9fa0e31a05bd.png)

これで無事にIPアドレス制限をかけることが出来たことがわかります。

では、もう少し工夫して、指定可能なリソースに限定して制限をかけてみましょう。

先ほどは `すべてのリソース` に対して制限を行いましたが、特定のリソースとし、今回は `cbr-test-space` のみをその対象としています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/c829afa7-a16c-2bed-0e85-1078e2f2d060.png)

これでルールを更新して、Container Registryのイメージ一覧を表示すると下記のようになります。
`cbr-test-space` と `katahiro-space` の2つのNamespaceがありましたが、 `cbr-test-space` にのみIPアドレスの制限を入れたため、 `cbr-test-space` のイメージはインターネット越しに確認できなくなりましたが、何の制約も入っていない `katahiro-space` のイメージは見える状態になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/9cac8b6c-62bd-4e19-776e-2e338232d11f.png)

このようにサービス全体に制限をかけることができますし、条件を指定可能なサービスはその条件に合わせて制限をかけることも可能です。

# さいごに
いかがでしたでしょうか？
Context-base Restrictionを利用すると、それに対応しているサービスについては一元的なアクセス制御を行うことが可能になり、サービスのパブリックエンドポイントを利用していたとしてもそのアクセス元を絞ることで、利用者にとって納得のいくセキュリティの構成に近づくことができるでしょう。

ただ、執筆時点では、まだContext-base Restrictionに対応していないサービスも多く、特にSaaS系サービスこそIPアドレス制限したいにも関わらず、対応していない、というのも多い状況です。

IBM Cloud上のサービスがことごとくContext-base Restrictionの対象となることを祈りながら、この記事を締めたいと思います。

読んで頂いた方はありがとうございました！