IBM Cloud Docs
IAM アクセス条件を使用したバケット内のオブジェクトへのアクセス権限の割り当て

IAM アクセス条件を使用したバケット内のオブジェクトへのアクセス権限の割り当て

IAM アクセス・ポリシーにより、 Cloud Object Storage バケット内の許可を特定のオブジェクト・グループに付与できます。 この方法により、データ・アクセスに対するきめ細かいアクセス制御が可能になり、バケットのさまざまな部分にさまざまなユーザーまたはアプリケーションがアクセスする必要があるシナリオで役立ちます。

バケット全体へのアクセスが必要な場合 (つまり、微細化されたアクセス制御が不要な場合) は、 個々のバケットへのアクセス権限の割り当て に関する情報に従ってください。

Cloud Object Storage バケットに保管される各オブジェクトには固有のキーがあり、これらのキーは多くの場合、ファイル・システムと同様の階層構造に従います。

IAMアクセスポリシーの関連リンク

  • キー "folder1/subfolder1/file.txt" を持つ個々のオブジェクトは、フォルダーまたはディレクトリー階層をシミュレートできます。ここで、ディレクトリー “folder1” には、ファイル *"file.txt"*を含む “sub-folder1” という名前のサブディレクトリーが含まれます。 アクセス権限は、任意のフォルダー・レベルで割り当てることができます。
  • アクセス・ポリシーは、すべてのオブジェクトに対して作成することも、 *“folder1”*という名前のフォルダー内に作成することも、 *“subfolder1”*という名前のサブディレクトリー内のオブジェクトに対してのみ割り当てることもできます。

ポリシー管理者は、IAM アクセス・ポリシーの作成時に条件を構成することにより、個々のオブジェクトおよびフォルダーへのアクセス権限を割り当てることができます。 次のセクションでは、これらのタイプのポリシーを構成する方法について説明します。

微細化されたアクセス制御ポリシーの構成

バケット内の個々のオブジェクトへのアクセス権限を付与するための最初のステップは、IAM ポリシーを構成することです。 Object Storage の IAM アクセス・ポリシーの構成について詳しくは、 Cloud Object Storage チュートリアル 単一の Object Storage バケットへのアクセスの制限 を参照してください。 IAM ポリシーの作成に関する一般情報については、 How IBM Cloud IAM works を参照してください。 以下の項目は、Object StorageリソースのIAMアクセスポリシーを構築するための重要な構成要素です。

件名

アクセス・ポリシーの対象は、個々のユーザー、アクセス・グループ、サービス ID、またはトラステッド・プロファイルにすることができます。 ポリシーに適用できるサブジェクトのタイプについて詳しくは、 IAM ポリシーとは何ですか? 誰が割り当てることができますか? を参照してください。

サービス

このサービスは、アクセス権限を割り当てようとしているリソースが含まれている IBM Cloud サービスです。 個々のオブジェクトへのアクセス権限を割り当てるには、 Cloud Object Storage サービスを使用します。

リソース

IBM Cloud® Object Storage は、以下のリソース・ターゲットをサポートします。

  • リソース・グループ ID
  • サービス・インスタンス
  • 値が "bucket" のリソース・タイプ
  • リソース ID (バケット名)

ロール

IBM Cloud のアクセス役割は、アクションのグループです。 アクセス・ロールは、ポリシーで定義された対象リソースのコンテキスト内で、対象者が特定のタスクを完了することを許可する。 Cloud Object Storage は、許可の割り当てを容易にするいくつかの事前定義サービス役割をサポートします。 Cloud Object Storage では、カスタム役割を作成することもできます。 Cloud Object Storageでサポートされる役割について詳しくは、 Identity and Access Management roles を参照してください。

Cloud Object Storage の役割とそれらの役割の条件との対話のリストについては、この を参照してください。

条件

リソースが識別されると、条件を使用して、バケット内の個々のオブジェクトに対するアクセスのスコープをさらに設定することができます。これは、微細化されたアクセス制御と呼ばれます。

OR または AND ステートメントを使用して複数の条件を結合することにより、単一の IAM ポリシーに複数の条件を含めることができます。 条件ステートメント (1 つ以上の条件を含む) は、ユーザー要求がアクションの実行を許可されるためには、 TRUE と評価される必要があります。 IAM ポリシーは、 TRUE と評価されないすべてのアクションを拒否します。 ポリシー・ステートメントには、役割が必要とするすべての条件属性が含まれている必要があります。 ポリシー・ステートメントに、役割が必要とするすべての条件属性が含まれていない場合、省略された条件属性に従うアクションは拒否されます。

役割で定義されているように、ターゲット・リソースに対する全アクセス権限を付与するには、条件属性を持たないポリシーを使用します。

属性ベースの条件を使用して IAM ポリシーを構成するには、 IAM v2 ポリシー を使用します。

IAM ポリシーでの条件の使用

Cloud Object Storage は、 Cloud Object Storage リソースに対する微細化されたアクセス権限を割り当てるための条件を指定する以下の属性をサポートしています。

接頭部および区切り文字

PrefixDelimiter は、バケツ内の特定のオブジェクトに対するすべてのリスト権限をスコープするために一緒に使われます。

  • Prefix 条件属性は、オブジェクトまたはフォルダーのリストに対してこの条件が許可する必要があるオブジェクト・キーのセットの接頭部を定義します。 例えば、 *"folder1/subfolder1/file.txt"*という名前のオブジェクトでは、 "folder1/"“folder1/subfolder1/” の両方が可能な接頭部です。

  • 区切り文字 は、ユーザーがファイル階層であるかのようにバケットをナビゲートするのに役立ちます。 区切り条件ステートメントを割り当てると、ユーザーがリストに生成できるフォルダー構造のタイプが制限されます。 *"folder1/subfolder1/file.txt"*という名前のオブジェクトでは、区切り文字 "/" を使用して、各フォルダーが *"/"*で区切られているフォルダー階層をシミュレートできます。 条件ステートメントで区切り文字 *"/"*のみが許可されている場合、他の区切り文字値を指定したリスト要求は許可されません。

通常、接頭辞と区切り文字は、'AND 演算子を持つ条件文の中で一緒に使われる。 条件ステートメントでは、区切り文字なしの接頭部を使用することができます。 ポリシーが、区切り文字条件ステートメントではなく接頭部のみを使用して構成されている場合、ユーザーは、オブジェクトをリストするために任意の区切り文字を使用することも、区切り文字を使用しないこともできます。

接頭部および区切り文字条件ステートメントの使用例

*"folder1/subfolder1/file.txt"*という名前のオブジェクトについて考えてみます。

"folder1/" AND の接頭部の区切り文字なし

  • 区切り文字を指定せずに folder1/ でリスト要求を行うことにより、 folder1/ で始まるすべてのオブジェクトのリストを返すことができます。
  • リスト要求で区切り文字 "/" を使用すると、 *folder1/*内の第 1 レベルのオブジェクトおよびサブフォルダーのみが表示されるように制限されます。
  • ユーザーがサブフォルダーをリストしようとすると (接頭部 = *“folder1/subfolder1/”*をリストする要求)、アクセスは拒否されます。

"folder1/" AND 区切り文字 "/" の接頭部

  • folder1の第 1 レベルにあるオブジェクトおよびサブフォルダーのみをリストできます。
  • 区切り文字 *"/"*を指定したリスト要求のみを実行できます。
  • subfolder1の内容をリストしようとすると、アクセスが拒否されます ( subfolder1の内容をリストできるようにするには、接頭部 “folder1/subfolder1/" を許可する条件が必要になります)。

以下の API は、接頭部/区切り文字の条件に従います。

アクションとサポートされる条件属性の完全なリストについては、 Identity and Access Management アクション を参照してください。

UI で自分のフォルダーにナビゲートするためのきめ細かいユーザー・アクセス権限を付与するには、バケットのルート・フォルダーをリストするためのアクセス権限が必要です。 これを有効にするためのポリシーの構成方法については、 シナリオ 4 を参照してください。

パス

パスは、特定のオブジェクトに対するすべての読み取り、書き込み、または管理アクセスの有効範囲を指定するために使用されます。

*"folder1/subfolder1/file.txt"*という名前のオブジェクトの場合、完全なオブジェクト・キーはパスです。 このオブジェクトに対する読み取り、書き込み、または管理アクションを制限するには、 *"folder1/subfolder1/file.txt"*のパスを使用して条件を定義します。

オブジェクトに対して直接動作するすべての Cloud Object Storage API は、パス条件に従います。 パスをサポートする Cloud Object Storage API アクションのリストについては、 Identity and Access Management アクション を参照してください。

同じポリシーでユーザーに読み取り、書き込み、またはリスト・アクションを付与する場合は、接頭部/区切り文字条件とパス条件の両方を定義することをお勧めします。 ManagerWriterReader、および Content Reader は、接頭部/区切り文字とパス条件の両方を定義することをお勧めする役割の例です。 これを有効にするためのポリシーの構成方法については、 シナリオ 4 を参照してください。 接頭部/区切り文字を指定する条件とパスを指定する条件は、両方のタイプの操作 (オブジェクトまたはリスト・オブジェクトの読み取り、書き込み、または管理) を許可するために、IAM ポリシー・ステートメントで論理的に ORed 指定する必要があります。

条件属性で使用される演算子

条件属性を定義するときに使用できる演算子がいくつかあります。 接頭部、区切り文字、およびパス条件属性に使用できる演算子の完全なリストは、 リソース属性ベースの条件 に記載されています。

ワイルドカードの使用

演算子が stringMatch または stringMatchAnyOf の場合、条件属性の値に ワイルドカード を含めることができます。

条件ステートメントでのワイルドカードの使用例:

*"folder1/subfolder1/file.txt"*という名前のオブジェクトについて考えてみます。

“folder1/*” のパス

  • 役割で定義されているように、 *“folder1/”*で始まるすべてのオブジェクトに対する読み取り、書き込み、または管理のアクセス権限が付与されます。

"folder1/*" AND の接頭部の区切り文字なし

  • 接頭部が “folder1/” に設定され、区切り文字がないオブジェクト・リスト要求の場合、ユーザー要求は *“folder1/”*で始まるすべてのオブジェクトを返します。
  • 接頭部が “folder1/” に設定され、区切り文字が *"/"*であるオブジェクト・リスト要求の場合、要求は、 folder1の第 1 レベルにあるオブジェクトとフォルダーのビューを返します。
  • 接頭部が “folder1/subfolder1/” に設定され、区切り文字が *"/"*に設定されたオブジェクト・リスト要求の場合、要求は、 folder1/subfolder1の第 1 レベルにあるオブジェクトとフォルダーのビューを返します。

"folder1/*" AND 区切り文字 "/" の接頭部

  • 接頭部が “folder1/” に設定され、区切り文字が *"/"*であるオブジェクト・リスト要求の場合、要求は、 folder1の第 1 レベルにあるオブジェクトとフォルダーのビューを返します。
  • 接頭部が “folder1/subfolder1/” に設定され、区切り文字が *"/"*に設定されたオブジェクト・リスト要求の場合、要求は folder1/subfolder1内のオブジェクト (および任意のサブフォルダー) を返します。
  • 接頭部が “folder1/” に設定され、区切り文字がないオブジェクト・リスト要求の場合、このポリシーが true と評価されるには、リスト要求で区切り文字 "/" を使用する必要があるため、要求は許可されません。

接頭部/区切り文字またはパスを使用しないアクション

パスまたは接頭部と区切り文字を指定しない Cloud Object Storage API がいくつかあります。 Cloud Object Storage サービス役割: ManagerWriterReader、および Content Reader は、これらのアクションを含む役割の例です。 これは、カスタム役割にも適用されます。 「接頭部/区切り文字」 または 「パス」 条件を使用するときにこれらのアクションを許可するには、IAM ポリシーに以下の条件ステートメントが必要です。

((path stringExists = false) AND (prefix stringExists = false) AND (delimiter stringExists= false))

接頭部/区切り文字 または パス 条件をサポートせず、詳細アクセスを使用する場合に上記のステートメントを必要とする API アクションの完全なリストについては、 Identity and Access Management アクション の表を参照してください。

IAM ポリシーでこの節を使用する方法については、 条件付きでユーザーの新規ポリシーを作成する 方法に関するセクションを参照してください。

Cloud Object Storage サービス役割での条件の使用

COSサービス・ロールを使用した条件の使用
アクセス役割 アクションの説明 サポートされる条件属性
マネージャー オブジェクトの公開、バケットとオブジェクトの作成、破棄。 注を参照
ライター バケットとオブジェクトの作成と破棄。 注を参照
リーダー バケットをリストし、オブジェクトをリストし、オブジェクトをダウンロードします。 注を参照
コンテンツ・リーダー オブジェクトをリストしてダウンロードします。 注を参照
オブジェクト・リーダー オブジェクトをダウンロードします。 パス
オブジェクト・ライター オブジェクトをアップロードします。 パス

注: これらの役割は、接頭部/区切り文字およびパス条件属性をサポートします。 役割には、パスまたは接頭部と区切り文字を指定しないアクションも含まれます。 これらのアクションを許可するには、条件ステートメントで stringExists 節を使用します。

各 Cloud Object Storage サービス役割のアクションの完全なリスト、および各アクションでサポートされる条件属性のリストについては、 リンク を参照してください。

条件付きでユーザーの新規ポリシーを作成

以下の例では、 “Writer” Cloud Object Storage サービス役割を持つユーザーに、以下の機能を提供します。

  1. *"folder1/subfolder1"*という名前のフォルダー内のオブジェクト階層全体に対するアクセス権限をリストします。
  2. *"subfolder1"*という名前のフォルダー内のすべてのオブジェクトに対する読み取り権限、書き込み権限、または削除権限。
  3. HEAD BucketGET/PUT Bucket Versioning などのバケット構成管理を実行します。

条件付きの IAM ポリシーの CLI

CLI の使用方法に関する一般情報については、 IBM Cloud® コマンド・ライン・インターフェースの使用 に関するセクションを参照してください。

policy.json:

{
"type": "access",
  "subject": {
    "attributes": [
      {
        "value": "IBMid-664001QJNU",
        "operator": "stringEquals",
        "key": "iam_id"
      }
    ]
  },
  "resource": {
    "attributes": [
      {
        "value": "cloud-object-storage",
        "operator": "stringEquals",
        "key": "serviceName"
      },
      {
        "value": "e6156134-5ed7-4f73-80d3-d6d1ef56f1f9",
        "operator": "stringEquals",
        "key": "serviceInstance"
      },
      {
        "value": "bucket",
        "operator": "stringEquals",
        "key": "resourceType"
      },
      {
        "value": "fgac-tf-test",
        "operator": "stringEquals",
        "key": "resource"
      }
    ]
  },
  "control": {
    "grant": {
      "roles": [
        {
          "role_id": "crn:v1:bluemix:public:iam::::serviceRole:Writer"
        }      ]
    }
  },
  "rule": {
    "operator": "or",
    "conditions": [
      {
        "operator": "and",
        "conditions": [
          {
            "key": "{{resource.attributes.prefix}}",
            "operator": "stringMatch",
            "value": "folder1/subfolder1/*"
          },
          {
            "key": "{{resource.attributes.delimiter}}",
            "operator": "stringEqualsAnyOf",
            "value": [
              "/",
              ""
            ]
          }
        ]
      },
      {
        "key": "{{resource.attributes.path}}",
        "operator": "stringMatch",
        "value": "folder1/subfolder1/*"
      },
      {
        "operator": "and",
        "conditions": [
          {
            "key": "{{resource.attributes.delimiter}}",
            "operator": "stringExists",
            "value": false
          },
          {
            "key": "{{resource.attributes.prefix}}",
            "operator": "stringExists",
            "value": false
          },
          {
            "key": "{{resource.attributes.path}}",
            "operator": "stringExists",
            "value": false
          }
        ]
      }
    ]
  },
  "pattern": "attribute-based-condition:resource:literal-and-wildcard"
}
ibmcloud iam  user-policy-create hello@ibm.com --file policy.json --api-version v2

リソースベースの属性条件では、--api-version v2を使用してください。

条件付きの IAM ポリシーの API

要求

curl -X POST 'https://iam.cloud.ibm.com/v2/policies' \
-H 'Authorization: Bearer $TOKEN' \
-H 'Content-Type: application/json' \
-d '{
  "type": "access",
  "description": "access control for RESOURCE_NAME",
  "resource": {
    "attributes": [
      {
        "key": "serviceName",
        "operator": "stringEquals",
        "value": "cloud-object-storage"
      },
      {
        "key": "serviceInstance",
        "operator": "stringEquals",
        "value": "$SERVICE_INSTANCE"
      },
      {
        "key": "accountId",
        "operator": "stringEquals",
        "value": "$ACCOUNT_ID"
      },
      {
        "key": "resourceType",
        "operator": "stringEquals",
        "value": "bucket"
      },
      {
        "key": "resource",
        "operator": "stringEquals",
        "value": "$RESOURCE_NAME"
      }
    ]
  },
  "subject": {
    "attributes": [
      {
        "key": "iam_id",
        "operator": "stringEquals",
        "value": "IBMid-123453user"
      }
    ]
  },
  "control": {
    "grant": {
      "roles": [
        {
          "role_id": "crn:v1:bluemix:public:iam::::serviceRole:Writer"
        }
      ]
    }
  },
  "rule": {
    "operator": "or",
    "conditions": [
      {
        "operator": "and",
        "conditions": [
          {
            "key": "{{resource.attributes.prefix}}",
            "operator": "stringMatch",
            "value": "folder1/subfolder1/*"
          },
          {
            "key": "{{resource.attributes.delimiter}}",
            "operator": "stringEqualsAnyOf",
            "value": [
              "/",
              ""
            ]
          }
        ]
      },
      {
        "key": "{{resource.attributes.path}}",
        "operator": "stringMatch",
        "value": "folder1/subfolder1/*"
      },
      {
        "operator": "and",
        "conditions": [
          {
            "key": "{{resource.attributes.delimiter}}",
            "operator": "stringExists",
            "value": false
          },
          {
            "key": "{{resource.attributes.prefix}}",
            "operator": "stringExists",
            "value": false
          },
          {
            "key": "{{resource.attributes.path}}",
            "operator": "stringExists",
            "value": false
          }
        ]
      }
    ]
  },
  "pattern": "attribute-based-condition:resource:literal-and-wildcard"
}'

応答

{
    "id": "d4078e99-d78a-4a50-95d6-b528e3c87dff",
    "description": "access control for RESOURCE_NAME",
    "type": "access",
    "subject": {
        "attributes": [
            {
                "key": "iam_id",
                "operator": "stringEquals",
                "value": "IBMid-123453user"
            }
        ]
    },
    "resource": {
        "attributes": [
            {
                "key": "serviceName",
                "operator": "stringEquals",
                "value": "cloud-object-storage"
            },
            {
                "key": "serviceInstance",
                "operator": "stringEquals",
                "value": "$SERVICE_INSTANCE"
            },
            {
                "key": "accountId",
                "operator": "stringEquals",
                "value": "$ACCOUNT_ID"
            },
            {
                "key": "resourceType",
                "operator": "stringEquals",
                "value": "bucket"
            },
            {
                "key": "resource",
                "operator": "stringEquals",
                "value": "$RESOURCE_NAME"
            }
        ]
    },
    "pattern": "attribute-based-condition:resource:literal-and-wildcard",
    "rule": {
        "operator": "or",
        "conditions": [
            {
                "operator": "and",
                "conditions": [
                    {
                        "key": "{{resource.attributes.prefix}}",
                        "operator": "stringMatch",
                        "value": "folder1/subfolder1/*"
                    },
                    {
                        "key": "{{resource.attributes.delimiter}}",
                        "operator": "stringEqualsAnyOf",
                        "value": [
                            "/",
                            ""
                        ]
                    }
                ]
            },
            {
                "key": "{{resource.attributes.path}}",
                "operator": "stringMatch",
                "value": "folder1/subfolder1/*"
            },
            {
                "operator": "and",
                "conditions": [
                    {
                        "key": "{{resource.attributes.delimiter}}",
                        "operator": "stringExists",
                        "value": false
                    },
                    {
                        "key": "{{resource.attributes.prefix}}",
                        "operator": "stringExists",
                        "value": false
                    },
                    {
                        "key": "{{resource.attributes.path}}",
                        "operator": "stringExists",
                        "value": false
                    }
                ]
            }
        ]
    },
    "control": {
        "grant": {
            "roles": [
                {
                    "role_id": "crn:v1:bluemix:public:iam::::serviceRole:Writer"
                }
            ]
        }
    },
    "href": "https://iam.test.cloud.ibm.com/v2/policies/d4078e99-d78a-4a50-95d6-b528e3c87dff",
    "created_at": "2023-10-09T16:24:52.391Z",
    "created_by_id": " IBMid-12345user",
    "last_modified_at": "2023-10-09T16:24:52.391Z",
    "last_modified_by_id": " IBMid-12345user",
    "counts": {
        "account": {
            "current": 785,
            "limit": 4020
        },
        "subject": {
            "current": 1,
            "limit": 1000
        }
    },
    "state": "active",
    "version": "v1.0"
}

条件付きの IAM ポリシーの Terraform

data "ibm_resource_group" "cos_group" {
      name = "Default"
}

resource "ibm_iam_user_policy" "example" {
 ibm_id = “user_email_id”
 roles = ["Writer"]
 resources {
  service = "cloud-object-storage"
  resource_type = "bucket"
  resource_instance_id = "cos instance guid"
  resource = "bucket-name"
}


rule_conditions {
 operator = "and"
 conditions {
  key = "{{resource.attributes.prefix}}"
  operator = "stringMatch"
  value = ["folder1/subfolder1/*"]
 }
 conditions {
  key = "{{resource.attributes.delimiter}}"
  operator = "stringEqualsAnyOf"
  value = ["/",""]
 }
 }
rule_conditions {
  key = "{{resource.attributes.path}}"
  operator = "stringMatch"
  value = ["folder1/subfolder1/*"]
 }
rule_conditions {
 operator = "and"
  conditions {
   key = "{{resource.attributes.delimiter}}"
   operator = "stringExists"
   value = ["false"]
  }
  conditions {
   key = "{{resource.attributes.prefix}}"
   operator = "stringExists"
   value = ["false"]
  }
  conditions {
   key = "{{resource.attributes.path}}"
   operator = "stringExists"
   value = ["false"]
  }
 }
rule_operator = "or"
 pattern = "attribute-based-condition:resource:literal-and-wildcard"
}

詳細情報

Prefix/Delimiter または Path 条件属性の使用方法の例については、バケット内の個々のオブジェクトへのアクセスの制御に関する チュートリアル を参照してください。