控制對儲存區中個別物件的存取權

本指導教學提供範例,說明如何將 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 條件陳述式的範例。

讀取或寫入作業通常以特定物件名稱為目標,也稱為物件 路徑

情境

下列範例顯示如何使用 IAM 原則及條件來授與儲存區中個別物件的存取權。 我們將繼續使用上面顯示的範例儲存區。 這些範例顯示關於配置條件陳述式的完整存取原則摘錄。 如需相關資訊,請參閱 使用 IAM 存取條件指派對儲存區內物件的存取權

實務範例 1: 僅授與 Adam 對 User1 資料夾中所有物件的讀取權。

這將讓 Adam 能夠讀取以 User1/索引鍵名稱開頭的所有物件。 這不會讓 Adam 能夠列出物件,因此他無法導覽使用者介面來存取這些物件。 Adam 只能透過非使用者介面方法來擷取 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: 授與 Adam 清單及 User1 資料夾中所有物件的讀取權。

這將讓 Adam 能夠讀取並列出以 User1/索引鍵名稱開頭的所有物件。 此外,在 prefix 條件屬性中使用萬用字元。 如果未包含萬用字元,則會導致 Adam 僅具有 User1 資料夾中第一層物件或資料夾的「清單」存取權。 此原則將不允許 Adam 列出根層次的儲存區。 如果 Adam 使用使用者介面,則他必須使用特定字首 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 無權從根資料夾導覽使用者介面。 此狀況顯示在 實務範例 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 存取權,除了在 20232024中列出、讀取和抄寫檔案之外,還可以將使用者介面導覽至 20232024 資料夾中的檔案。

若要將使用者介面導覽至 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"