IBM Cloud Docs
バケット内の個々のオブジェクトへのアクセスの制御

バケット内の個々のオブジェクトへのアクセスの制御

このチュートリアルでは、 IBM Cloud® Object Storage バケットで IAM アクセス・ポリシーを使用して、 バケット内の個々のオブジェクト へのアクセス権限をユーザーに付与する方法の例を示します。

開始前に

IBM Cloud Object Storage は、1 つのバケットに何十億もの明確に名前が付けられたオブジェクトを含めることができるフラットな構造でデータを保管します。 フォルダー階層は、関連オブジェクト名に同じ接頭部を使用することによってシミュレートできます。 また、オブジェクト名をオブジェクト・キーとして参照することもできます。 以下に例を示します。

Bucket Name: MyBucket
Objects in MyBucket:

User1/userDoc1.txt
User1/userDoc2.zip
Engineering/project1.git
Engineering/project2.git
Product/2023/roadmap1.ppt
Product/2024/roadmap2.ppt
Orgchart.pdf

この例では、接頭部 User1Engineering、および Product をルート・レベル・フォルダーのようにすることができます。 さらに、 2023 および 2024 はサブディレクトリーを表すことができます。 ファイル階層を表すには、区切り文字「/」を使用します。 区切り文字は、サポートされている任意の文字にすることができます。 Orgchart.pdf は、ルート・レベル・オブジェクトと見なされます。

バケットに対してリスト要求を実行する場合は、オブジェクトをリストするための接頭部を指定するか、バケット全体の内容をリストすることができます。 さらに、オプションで、リスト要求で区切り文字の値を渡して、応答内のフォルダー構造をシミュレートすることができます。 詳しくは、 接頭部および区切り文字 条件ステートメントの使用例を参照してください。

通常、読み取り操作または書き込み操作は、オブジェクト・ パス とも呼ばれる特定のオブジェクト名をターゲットとします。

シナリオ

以下の例は、IAM ポリシーおよび条件を使用して、バケット内の個々のオブジェクトへのアクセス権限を付与する方法を示しています。 上記のバケットの例を引き続き使用します。 以下の例は、条件ステートメントの構成に関する全アクセス・ポリシーの抜粋です。 詳しくは、 IAM アクセス条件を使用したバケット内のオブジェクトへのアクセス権限の割り当て を参照してください。

シナリオ 1: User1 フォルダー内のすべてのオブジェクトに対する読み取り権限のみを Adam に付与します。

これにより、Adam は User1/というキー名で始まるすべてのオブジェクトを読み取ることができます。 これにより、Adam はオブジェクトをリストすることができないため、UI をナビゲートしてこれらのオブジェクトにアクセスすることができません。 Adam は、非 UI メソッドを介してのみ、 User1 フォルダー内のオブジェクトをリトリーブすることができます。 User1/で始まるすべての可能なオブジェクトにアクセス権限を付与するには、ポリシーでワイルドカードを使用します。 ワイルドカードを含めないと、 User1/という名前のオブジェクトに対するアクセス権限のみが Adam に付与されます。

"control": {
    "grant": {
      "roles": [
         { "role_id":
             "crn:v1:bluemix:public:cloud-object-storage::::serviceRole:ObjectReader"
         }
       ]
     }
   },
   "rule": {
     "conditions": [
       {
         "key": "{{resource.attributes.path}}",
         "operator": "stringMatch",
         "value": "User1/*"
       }
     ]
   },
   "pattern": "attribute-based-condition:resource:literal-and-wildcard"

シナリオ 2: Adam に User1 フォルダー内のすべてのオブジェクトに対する読み取り権限を付与します。

これにより、Adam は User1/というキー名で始まるすべてのオブジェクトを読み取ってリストすることができます。 また、 prefix 条件属性でワイルドカードを使用します。 ワイルドカードを含めない場合、 User1 フォルダー内の第 1 レベルのオブジェクトまたはフォルダーに対するリスト・アクセス権限のみが Adam に付与されます。 このポリシーでは、Adam がルート・レベルでバケットをリストすることは許可されません。 Adam が UI を使用する場合、アクセス権限を持つオブジェクトを確認するには、 User1/ という特定の接頭部を持つバケットを検索する必要があります。

"control": {
    "grant": {
      "roles": [
        {
          "role_id":
          "crn:v1:bluemix:public:cloud-object-storage::::serviceRole:ContentReader"
        }
      ]
    }
  },
  "rule": {
    "operator": "or",
    "conditions": [
      {
        "operator": "and",
        "conditions": [
          {
            "key": "{{resource.attributes.prefix}}",
            "operator": "stringMatch",
            "value": "User1/*"
          },
          {
            "key": "{{resource.attributes.delimiter}}",
            "operator": "stringEquals",
            "value": "/"
          }
        ]
      },
      {
        "key": "{{resource.attributes.path}}",
        "operator": "stringMatch",
        "value": "User1/*"
      }
    ]
  },
  "pattern": "attribute-based-condition:resource:literal-and-wildcard

シナリオ 3: Product フォルダーの下の 2023 サブディレクトリーおよび 2024 サブディレクトリー内のファイルのみをリスト、読み取り、および複製するためのアクセス権限を Samantha に付与します。

これらのアクション・セットでは、Samantha が少なくとも Writer 役割を持っている必要があります。 Writer ロールには、 cloud-object-storage.bucket.put_replicationなど、 PathPrefixDelimiter も指定しないいくつかのアクションも含まれています。 これらのアクションを許可するには、リソース属性ベースの条件で StringExists 演算子を使用します。

Samantha には、ルートフォルダから UI をナビゲートするためのアクセス権がありません。 このシチュエーションは、 シナリオ 4 に示されています。

"control": {
    "grant": {
      "roles": [
        {
          "role_id": "crn:v1:bluemix:public:iam::::serviceRole:Writer"
        }
      ]
    }
  },
  "rule": {
    "operator": "or",
    "conditions": [
      {
        "operator": "and",
        "conditions": [
          {
            "key": "{{resource.attributes.prefix}}",
            "operator": "stringMatchAnyOf",
            "value": [
              "Product/2023/*",
              "Product/2024/*"
            ]
          },
          {
            "key": "{{resource.attributes.delimiter}}",
            "operator": "stringEquals",
            "value": "/"
          }
        ]
         },
         {
            "key": "{{resource.attributes.path}}",
            "operator": "stringMatchAnyOf",
            "value": [
              "Product/2023/*",
              "Product/2024/*"
        ]
    },
    {
      "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"

シナリオ 4: 2023 および 2024内のファイルのリスト、読み取り、および複製に加えて、 2023 フォルダーおよび 2024 フォルダー内のファイルに UI をナビゲートするためのアクセス権限を Samantha に付与します。

UI を MyBucketにナビゲートするには、Samantha にはプラットフォーム役割 Viewerが必要です。 さらに、Samantha にはターゲットフォルダの上のすべてのディレクトリへのアクセス権が与えられます。 この場合、Samantha はルート・レベル (空ストリングの接頭部によって定義される) と Product/ フォルダーをリストするためのアクセス権を必要とします。 これにより、Samantha はすべてのルート・レベルのフォルダーとオブジェクトを表示できます。

"control": {
    "grant": {
      "roles": [
        {
          "role_id": "crn:v1:bluemix:public:iam::::serviceRole:Writer"
        },
        {
          "role_id": "crn:v1:bluemix:public:iam::::role:Viewer"
        }
      ]
    }
  },
  "rule": {
    "operator": "or",
    "conditions": [
      {
        "operator": "and",
        "conditions": [
          {
            "key": "{{resource.attributes.prefix}}",
            "operator": "stringMatchAnyOf",
            "value": [
              "Product/2023/*",
              "Product/2024/*"
          ]
        },
        {
          "key": "{{resource.attributes.delimiter}}",
          "operator": "stringEquals",
          "value": "/"
          }
        ]
      },
      {
        "operator": "and",
        "conditions": [
          {
            "key": "{{resource.attributes.prefix}}",
            "operator": "stringEqualsAnyOf",
            "value": [
              "",
              "Product/"
            ]
          },
          {
            "key": "{{resource.attributes.delimiter}}",
            "operator": "stringEquals",
            "value": "/"
          }
        ]
      },
      {
        "key": "{{resource.attributes.path}}",
        "operator": "stringMatchAnyOf",
        "value": [
          "Product/2023/*",
          "Product/2024/*"
        ]
      },
      {
        "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"