IBM Cloud Docs
控制对存储区中各个对象的访问

控制对存储区中各个对象的访问

本教程提供了有关如何将 IAM 访问策略与 IBM Cloud® Object Storage 存储区配合使用的示例,以授予用户对 存储区中各个对象 的访问权。

准备工作

IBM Cloud Object Storage 将数据存储在平面结构中,其中一个存储区可以包含数十亿个不同命名的对象。 可以通过在相关对象名中使用相同的前缀来模拟文件夹层次结构。 另外,可以将对象名称为对象键。 以下是示例:

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

在此示例中,前缀 User1EngineeringProduct 可能类似于根级别文件夹。 此外,20232024 可以表示子目录。 使用定界符 "/" 来表示文件层次结构。 定界符可以是任何受支持的字符。Orgchart.pdf 被视为根级别对象。

在存储区上运行列表请求时,可以指定用于列出对象的前缀或列出整个存储区的内容。 此外,还可以选择在列表请求中传递定界符值以模拟响应中的文件夹结构。 有关更多信息,请参阅使用 prefix and delimiter 条件语句的示例。

读或写操作通常以特定对象名为目标,该对象名也称为对象 path

场景

以下示例显示如何使用 IAM 策略和条件来授予对存储区中各个对象的访问权。 我们将继续使用上面显示的示例存储区。 这些示例显示了有关配置条件语句的完整访问策略的摘录。 有关更多信息,请参阅 使用 IAM 访问条件分配对存储区中对象的访问权

方案 1: 仅授予 Adam 对 User1 文件夹中所有对象的读访问权。

这将使 Adam 能够读取以 User1/键名开头的所有对象。 这不会使 Adam 能够列出对象,因此他无法浏览 UI 来访问这些对象。 Adam 只能通过非 UI 方法检索 User1 文件夹中的对象。 在策略中使用通配符以授予对以 User1/开头的所有可能对象的访问权。 未能包含通配符将使 Adam 只能访问名为 User1/的对象。

"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: 授予对 User1 文件夹中所有对象的 Adam 列表和读访问权。

这将使 Adam 能够读取和列出以 User1/键名开头的所有对象。 此外,请在 prefix 条件属性中使用通配符。 未能包含通配符将导致 Adam 仅对 User1 文件夹中的第一级对象或文件夹具有“列表”访问权。 此策略将不允许 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: 授予 Samantha 访问权,以仅列示,读取和复制 Product 文件夹下的 20232024 子目录中的文件。

这些操作集将要求 Samantha 至少具有 Writer 角色。 Writer 角色还包含一些未指定 PathPrefixDelimiter (例如 cloud-object-storage.bucket.put_replication) 的操作。 要允许这些操作,请将 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: 授予 Samantha 访问权以将 UI 导航到 20232024 文件夹中的文件,以及列出,读取和复制 20232024中的文件。

要将 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"