控制對儲存區中個別物件的存取權
本指導教學提供範例,說明如何將 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
在此範例中,字首 User1、Engineering及 Product 可能類似於根層次資料夾。 此外,2023 和 2024 可以代表子目錄。 使用定界字元 "/" 來代表檔案階層。 定界字元可以是任何支援的字元。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 資料夾下 2023 及 2024 子目錄中的檔案。
這些動作集將需要 Samantha 至少具有 Writer 角色。 Writer 角色也包含未指定 Path 或 Prefix 或 Delimiter (例如 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 存取權,除了在 2023 和 2024中列出、讀取和抄寫檔案之外,還可以將使用者介面導覽至 2023 和 2024 資料夾中的檔案。
若要將使用者介面導覽至 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"