控制对存储区中各个对象的访问
本教程提供了有关如何将 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 条件语句的示例。
读或写操作通常以特定对象名为目标,该对象名也称为对象 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
文件夹下的 2023
和 2024
子目录中的文件。
这些操作集将要求 Samantha 至少具有 Writer
角色。 Writer
角色还包含一些未指定 Path
,Prefix
或 Delimiter
(例如 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 导航到 2023
和 2024
文件夹中的文件,以及列出,读取和复制 2023
和 2024
中的文件。
要将 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"