IBM Cloud Object Storage(ICOS)に定義された権限

# はじめに
こちらの記事は下記Advent Calendar 2024で紹介しているIBM Cloud権限設定における `Cloud Object Storage(ICOS)` になります。

https://qiita.com/katahiro/items/274bec5ad4a9e2604dcf

# 共通権限は割愛
こちらの記事に記載しているように、プラットフォーム・アクセス、サービス・アクセスの権限でそれぞれどのようなものが共通して設定されているかを紹介させて頂きました。

https://qiita.com/katahiro/items/b5e367666fe984944d4b

こちらの記事では共通部分で出現する権限を除いた各サービス毎の権限設定を紹介します。

# ICOSで指定可能な権限のアクセス範囲
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/f7b8f87e-9202-963d-47f4-6fb47a917804.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/b8538a15-76b6-42a8-d5e0-cdb339eade80.png)

- リソース・グループ
- サービス・インスタンス
- リソースID
- リソース・タイプ
- Prefix
- Delimiter
- Path

## リソース・グループの指定
これは指定されたリソース・グループに所属するICOSのみに対してアクセス権限を適用します。異なるリソース・グループのICOSに対しては別途権限を設定する必要があります。

## サービス・インスタンスの指定
これは既に作成されたICOSのインスタンスを指定して許可を与えることが可能です。勝手に新しいインスタンスを作成しないようにする、予期せぬインスタンスに保管しないようにするといった対策が必要な場合は利用しても良いですね。

## リソースID リソース・タイプの指定
これはちょっとトリッキーでセットになっています。リソース・タイプに `bucket`を指定して、リソースIDに`bucket名`を指定することで、特定のBucketのみに権限を与えることが可能です。

## Prefixの指定
これは指定された文字列から開始されるオブジェクトのみに権限が与えられます。
例えばファイルサーバのように `folder1/subfolder1/test.txt`といった階層管理のようにICOSに保管をしている場合、Prefixに `folder1/`を指定すると、その階層を含む環境でしかファイルの配置、削除ができなくなります。

## Delimierの指定
これは先のPrefixと組合せで利用します。先のPrefixで `folder1/`を指定し、かつDelimiterで `/`を指定すると、 `folder1/sample.txt`はアクセス可能ですが、`folder1/subfolder1/test.txt`といったもう1階層深い部分にはアクセスできなくなります。この場合、Prefixで `folder1/subfolder1/`を追加するか、Delimiterの指定をしない、といった対応が必要です。

## Pathの指定
これは条件指定に*(ワイルドカード)が利用可能になります。条件指定で `stringMatch`もしくは `stringMatchAnyOf`を選択して値を設定することで柔軟な条件指定が可能になります。

ICOSの権限範囲の指定は複雑さがかなり高い(自由度が高いとも言える)ので、下記で公開されている方法を念入りに確認することをお勧めします。

https://cloud.ibm.com/docs/cloud-object-storage?topic=cloud-object-storage-fgac-iam-access-conditions&interface=cli

# ICOSに設定された権限
## プラットフォーム・アクセスの権限
※Admin : Administrator, KM : Key Manager, SCR : Service Configuration Reader
|権限|Viewer|Operator|Editor|Admin|KM|SCR|
|:---|:---:|:---:|:---:|:---:|:---:|:---:|
|cloud-object-storage.cip.read||||||〇|

プラットフォーム・アクセスとして設定されているICOSの権限はService Configuration Readerの権限のみで、基本的には共通する権限部分に準ずるという形ですね。

## サービス・アクセスの権限
ICOSのサービス・アクセスの権限はかなり多いです。いったんまとめて記載します。
|権限|Reader|Writer|Manager|Object Reader|Content Reader|Object Writer|
|:---|:---:|:---:|:---:|:---:|:---:|:---:|
|cloud-object-storage.bucket.get|〇|〇|〇||〇|
|cloud-object-storage.bucket.head|〇|〇|〇||〇|
|cloud-object-storage.bucket.put_bucket||〇|〇|||
|cloud-object-storage.bucket.post_bucket||〇|〇|||
|cloud-object-storage.bucket.delete_bucket||〇|〇|||
|cloud-object-storage.account.delete_fasp_connection_info||〇|〇|||
|cloud-object-storage.account.get_account_buckets|〇|〇|〇|||
|cloud-object-storage.bucket.get_acl|||〇|||
|cloud-object-storage.bucket.put_acl|||〇|||
|cloud-object-storage.bucket.get_activity_tracking|〇|〇|〇|||
|cloud-object-storage.bucket.put_activity_tracking||〇|〇|||
|cloud-object-storage.bucket.get_basic|〇|〇|〇|||
|cloud-object-storage.bucket.get_cors|〇|〇|〇|||
|cloud-object-storage.bucket.put_cors||〇|〇|||
|cloud-object-storage.bucket.delete_cors||〇|〇|||
|cloud-object-storage.bucket.get_fasp_connection_info|〇|〇|〇|||
|cloud-object-storage.bucket.get_firewall|||〇|||
|cloud-object-storage.bucket.put_firewall|||〇|||
|cloud-object-storage.bucket.get_lifecycle|〇|〇|〇|||
|cloud-object-storage.bucket.put_lifecycle||〇|〇|||
|cloud-object-storage.bucket.get_location|〇|〇|〇||〇|
|cloud-object-storage.bucket.get_metrics_monitoring|〇|〇|〇|||
|cloud-object-storage.bucket.put_metrics_monitoring||〇|〇|||
|cloud-object-storage.bucket.get_object_lock_configuration|〇|〇|〇|||
|cloud-object-storage.bucket.put_object_lock_configuration||〇|〇|||
|cloud-object-storage.bucket.get_protection|〇|〇|〇|||
|cloud-object-storage.bucket.put_protection|||〇|||
|cloud-object-storage.bucket.get_protection_management|||〇|||
|cloud-object-storage.bucket.put_protection_management|||〇|||
|cloud-object-storage.bucket.get_public_access_block|||〇|||
|cloud-object-storage.bucket.put_public_access_block|||〇|||
|cloud-object-storage.bucket.delete_public_access_block|||〇|||
|cloud-object-storage.bucket.get_quota||〇|〇|||
|cloud-object-storage.bucket.put_quota|||〇|||
|cloud-object-storage.bucket.get_replication|〇|〇|〇|||
|cloud-object-storage.bucket.put_replication||〇|〇|||
|cloud-object-storage.bucket.delete_replication||〇|〇|||
|cloud-object-storage.bucket.get_uploads|〇|〇|〇|||
|cloud-object-storage.bucket.get_versioning|〇|〇|〇|||
|cloud-object-storage.bucket.put_versioning||〇|〇|||
|cloud-object-storage.bucket.get_versions|〇|〇|〇||〇|
|cloud-object-storage.bucket.get_website|〇|〇|〇|||
|cloud-object-storage.bucket.put_website||〇|〇|||
|cloud-object-storage.bucket.delete_website||〇|〇|||
|cloud-object-storage.bucket.list_bucket_crn|〇|〇|〇|||
|cloud-object-storage.bucket.list_crk_id||〇|〇|||
|cloud-object-storage.object.get|〇|〇|〇|〇|〇|
|cloud-object-storage.object.head|〇|〇|〇|〇|〇|
|cloud-object-storage.object.post||〇|〇|||〇
|cloud-object-storage.object.put||〇|〇|||〇
|cloud-object-storage.object.delete||〇|〇|||
|cloud-object-storage.object.copy||〇|〇|||
|cloud-object-storage.object.copy_get|〇|〇|〇|||
|cloud-object-storage.object.copy_get_version|〇|〇|〇|〇|〇|
|cloud-object-storage.object.copy_part||〇|〇|||
|cloud-object-storage.object.copy_part_get|〇|〇|〇|||
|cloud-object-storage.object.copy_part_get_version|〇|〇|〇|〇|〇|
|cloud-object-storage.object.get_acl|||〇|||
|cloud-object-storage.object.put_acl|||〇|||
|cloud-object-storage.object.get_acl_version|||〇|||
|cloud-object-storage.object.put_acl_version|||〇|||
|cloud-object-storage.object.get_legal_hold|〇|〇|〇|||
|cloud-object-storage.object.get_object_lock_legal_hold|〇|〇|〇|||
|cloud-object-storage.object.get_object_lock_legal_hold_version|〇|〇|〇|||
|cloud-object-storage.object.get_object_lock_retention|〇|〇|〇|||
|cloud-object-storage.object.get_object_lock_retention_version|〇|〇|〇|||
|cloud-object-storage.object.get_tagging|〇|〇|〇|||
|cloud-object-storage.object.put_tagging||〇|〇|||〇
|cloud-object-storage.object.delete_tagging||〇|〇|||〇
|cloud-object-storage.object.get_tagging_version|〇|〇|〇|||
|cloud-object-storage.object.put_tagging_version||〇|〇|||〇
|cloud-object-storage.object.delete_tagging_version||〇|〇|||〇
|cloud-object-storage.object.get_uploads|〇|〇|〇|||〇
|cloud-object-storage.object.delete_upload||〇|〇|||〇
|cloud-object-storage.object.get_version|〇|〇|〇|〇|〇|
|cloud-object-storage.object.head_version|〇|〇|〇|〇|〇|
|cloud-object-storage.object.delete_version||〇|〇|||
|cloud-object-storage.object.post_complete_upload||〇|〇|||〇
|cloud-object-storage.object.post_extend_retention||〇|〇|||
|cloud-object-storage.object.post_initiate_upload||〇|〇|||〇
|cloud-object-storage.object.post_legal_hold||〇|〇|||
|cloud-object-storage.object.post_md||〇|〇|||〇
|cloud-object-storage.object.post_multi_delete||〇|〇|||
|cloud-object-storage.object.put_object_lock_legal_hold||〇|〇|||〇
|cloud-object-storage.object.put_object_lock_legal_hold_version||〇|〇|||〇
|cloud-object-storage.object.put_object_lock_retention||〇|〇|||〇
|cloud-object-storage.object.put_object_lock_retention_version||〇|〇|||〇
|cloud-object-storage.object.put_part||〇|〇|||〇
|cloud-object-storage.object.restore||〇|〇|||
|cloud-object-storage.object.restore_version||〇|〇|||

長い！

Readerの権限は、GET,HEAD要求に限定しているのに対して、Writer、ManagerからPOST,PUT,DELETE要求が可能と当たり前になっています。

便利な点として役割に `Object Reader`, `Content Reader`, `Object Writer`がある点でしょうか。

## Object Readerの権限
- cloud-object-storage.object.get
- cloud-object-storage.object.head
- cloud-object-storage.object.copy_get_version
- cloud-object-storage.object.copy_part_get_version
- cloud-object-storage.object.get_version
- cloud-object-storage.object.head_version

ICOS上に配置されたObjectの取得のみに焦点をおいた権限なので、バッチ処理的にICOS上のファイルを取得して処理するようなプログラム実行時に渡す権限は、Reader権限まで渡さずともObject Readerのみで十分かもしれません。先のアクセス範囲の指定で対象のBucketまで指定するとかなり最小限の権限付与が出来そうですね。

## Content Readerの権限
- cloud-object-storage.bucket.get
- cloud-object-storage.bucket.head
- cloud-object-storage.bucket.get_location
- cloud-object-storage.bucket.get_versions
- cloud-object-storage.object.get
- cloud-object-storage.object.head
- cloud-object-storage.object.copy_get_version
- cloud-object-storage.object.copy_part_get_version
- cloud-object-storage.object.get_version
- cloud-object-storage.object.head_version

Object Readerと比べるとBucketの情報自体にアクセスできる点が異なります。

## Object Writerの権限
- cloud-object-storage.object.post
- cloud-object-storage.object.put
- cloud-object-storage.object.put_tagging
- cloud-object-storage.object.delete_tagging
- cloud-object-storage.object.put_tagging_version
- cloud-object-storage.object.delete_tagging_version
- cloud-object-storage.object.get_uploads
- cloud-object-storage.object.delete_upload
- cloud-object-storage.object.post_complete_upload
- cloud-object-storage.object.post_initiate_upload
- cloud-object-storage.object.post_md
- cloud-object-storage.object.put_object_lock_legal_hold
- cloud-object-storage.object.put_object_lock_legal_hold_version
- cloud-object-storage.object.put_object_lock_retention
- cloud-object-storage.object.put_object_lock_retention_version
- cloud-object-storage.object.put_part

Object Readerの真逆でObjectの書込みに特化した権限になります。参照系の権限はほぼ無いのでファイルの書込み専用になります。
先のように定期的にファイルを書き込む処理がある場合にWriter権限を与えてしまうと、Bucket自体を新規作成したり削除したりBucketの設定を一部書き換えたり、割と強い権限を与える形になります。Object Writerの権限をうまく利用できれば、不必要に強いWriterの権限を付与せずにすみます。

# さいごに
ICOSで定義可能なサービス・アクセスの権限は多いほうだったと思います。
ただ、指定可能な役割がICOS独自に拡張しているので、不用意にReader,Writerといった何でも参照できたり、いろいろ削除してしまえるような権限を付与することなく必要最低限の権限を付与できそうなところが良いですね。

またICOSで指定可能なアクセス範囲は応用ができそうで、IBM Cloudの提供するサービスの中でもかなり細かく定義できる部類になります。

ICOSは利用者も多く、権限設定も手間なのでReader,Writerといった権限を付与しがちですが、最低限の権限付与を目指すのであれば、今回紹介した役割やアクセス範囲を活用して権限設定して頂けたらと思います。