使用 IAM 存取條件來指派對儲存區內物件的存取權

IAM 存取政策允許在 Cloud Object Storage 儲存桶中,針對特定物件群組授予權限。 此方法容許對資料存取進行細部存取控制,因此在儲存區的不同部分需要由不同使用者或應用程式存取的情況下非常有用。

如果需要存取整個儲存區 (亦即,當不需要精細存取控制時),請遵循 指派對個別儲存區的存取權 的相關資訊。

儲存在 Cloud Object Storage 儲存區中的每一個物件都有唯一索引鍵,這些索引鍵通常遵循類似於檔案系統的階層式結構。

IAM 訪問策略的相關鏈接

範例

  • 具有索引鍵 "folder1/subfolder1/file.txt" 的個別物件可以模擬資料夾或目錄階層,其中目錄 “folder1” 包含名為 “sub-folder1” 包含檔案 *"file.txt"*的子目錄。 可以在任何資料夾層次指派存取權。
  • 可以為所有物件及-在名為 *“folder1”*的資料夾中建立存取原則,也可以僅為名為 *“subfolder1”*子目錄中的物件指派存取權。

原則管理者可以在建立 IAM 存取原則時配置條件,以指派對個別物件及資料夾的存取權。 下一節說明如何建構這些類型的原則。

建構精細存取控制原則

授與儲存區內個別物件存取權的首要步驟是建構 IAM 原則。 您可以在 Cloud Object Storage 指導教學 限制對單一 Object Storage 儲存區的存取權 中找到建構 Object Storage 的 IAM 存取原則的相關資訊。 如需建置 IAM 原則的一般資訊,請移至 IBM Cloud IAM 如何運作。 以下項目是為您的 Object Storage 資源建立IAM存取權限政策的核心要素。

主旨

存取原則的主體可以是個別使用者、存取群組、服務 ID 或「授信設定檔」。 如需您可以套用至原則之主體類型的相關資訊,請參閱 何謂 IAM 原則及誰可以指派它們?

服務

服務是包含您嘗試指派存取權之資源的 IBM Cloud 服務。 若要指派對個別物件的存取權,請使用 Cloud Object Storage 服務。

資源

IBM Cloud® Object Storage 支援下列資源目標:

  • 資源群組 ID
  • 服務實例
  • 值為 "bucket" 的資源類型
  • 資源 ID (儲存區名稱)

角色

IBM Cloud 存取角色是動作群組。 存取角色可讓主體在原則中所定義目標資源的環境定義內完成特定作業。 Cloud Object Storage 支援數個預先定義的服務角色,讓指派許可權更容易。 Cloud Object Storage 也容許建立自訂角色。 如需 Cloud Object Storage所支援角色的相關資訊,請參閱 Identity and Access Management 角色

如需 Cloud Object Storage 角色及其與條件互動的清單,請跳至這個 表格

條件

當識別資源時,可以使用條件來進一步設定主體對儲存區中個別物件的存取範圍,這稱為細部存取控制。

透過使用 ORAND 陳述式來結合條件,單一 IAM 原則可以具有多個條件。 條件陳述式 (包含一或多個條件) 應該評估為 TRUE,以允許使用者要求執行動作。 IAM 原則將拒絕任何未評估 TRUE 的動作。 原則陳述式應該包含角色所需的所有條件屬性。 如果原則陳述式未包含角色所需的所有條件屬性,則會拒絕受省略的條件屬性所限制的動作。

使用不含條件屬性的原則,以提供對目標資源的完整存取權 (由角色定義)。

使用 IAM 屬性策略範本(v2) 來建立基於屬性條件的 IAM 策略。

在 IAM 原則中使用條件

Cloud Object Storage 支援下列屬性,以指定在 Cloud Object Storage 資源上指派精細存取權的條件:

字首和定界字元

前綴分隔符共同用於將所有列出權限限定於儲存桶中的特定物件。

  • 字首 條件屬性定義此條件應容許列出物件或資料夾之物件索引鍵集的字首。 例如,在名為 "folder1/subfolder1/file.txt"的物件中,"folder1/"“folder1/subfolder1/” 都是可能的字首。

  • 定界字元 可協助使用者導覽儲存區,就像它是檔案階層一樣。 指派定界字元條件陳述式會限制使用者可在清單中產生的資料夾結構類型。 在名為 *"folder1/subfolder1/file.txt"*的物件中,可以使用定界字元 "/" 來模擬資料夾階層,其中每個資料夾都以 *"/"*區隔。 如果條件陳述式只容許定界字元 "/",則不允許具有任何其他定界字元值的清單要求。

通常前綴與分隔符會搭配運 AND 算子,共同用於條件陳述式中。 可以在條件陳述式中使用不含定界字元的字首。 如果原則只配置字首,而不使用定界字元條件陳述式,則使用者可以使用任何定界字元或不使用任何定界字元來列出物件。

使用 Prefix 及 Delimiter 條件陳述式的範例

請考量名為 *"folder1/subfolder1/file.txt"*的物件:

"folder1/" AND 沒有定界字元

  • 您可以透過對 folder1/ 執行清單要求,但不提供定界字元,來傳回以 folder1/ 開頭的每個物件的清單。
  • 如果您在清單要求中使用定界字元 "/",則會限制它們只能查看 *folder1/*中第一層物件及子資料夾。
  • 如果使用者嘗試列出子資料夾 (要求列出字首 = “folder1/subfolder1/”),則會拒絕存取。

"folder1/" AND 定界字元 "/" 的字首

  • 您只能列出 folder1第一層中的物件及子資料夾。
  • 您只能執行指定定界字元 *"/"*的清單要求。
  • 如果您嘗試列出 subfolder1的內容,則會拒絕存取 (使用者需要具有容許字首 = “folder1/subfolder1/" 的條件,才能容許列出 subfolder1的內容)。

下列 API 受限於「字首/定界字元」條件:

要查看完整的操作清單及支援的條件屬性,請參閱 Identity and Access Management actions

若要提供精細使用者在使用者介面中導覽至其資料夾的存取權,使用者需要存取權才能列出儲存區的根資料夾。 如需如何建構原則以啟用此功能的相關資訊,請參閱 實務範例 4

路徑

路徑用來限制特定物件的所有讀取、寫入或管理存取權。

對於名為 *"folder1/subfolder1/file.txt"*的物件,完整物件索引鍵是路徑。 若要限制此物件的讀取、寫入或管理動作,請定義路徑為 *"folder1/subfolder1/file.txt"*的條件。

直接對物件執行動作的所有 Cloud Object Storage API 都受限於「路徑」條件。 如需支援路徑的 Cloud Object Storage API 動作清單,請參閱 Identity and Access Management 動作

建議您在將讀取、寫入或列出動作授與相同原則中的使用者時,同時定義「字首/定界字元」條件和「路徑」條件。ManagerWriterReaderContent Reader 是建議同時定義「字首/定界字元」和「路徑」條件的角色範例。 如需如何建構原則以啟用此功能的相關資訊,請參閱 實務範例 4。 在「IAM 原則」陳述式中,指定「字首/定界字元」的條件及指定「路徑」的條件應該在邏輯上為 ORed,以允許兩種類型的作業 (物件或清單物件的讀取、寫入或管理)。

與條件屬性搭配使用的運算子

定義條件屬性時可以使用數個運算子。 可以在 資源屬性型條件 中找到可用於字首、定界字元及路徑條件屬性的運算子完整清單。

使用萬用字元

當運算子是 stringMatchstringMatchAnyOf 時,condition 屬性的值可以包括 萬用字元

在條件陳述式中使用萬用字元的範例:

請考量名為 *"folder1/subfolder1/file.txt"*的物件:

“folder1/*” 的路徑

  • 您將取得角色對所有以 *“folder1/”*開頭之物件的讀取、寫入或管理存取權。

"folder1/*" AND 無定界字元

  • 對於字首設為 “folder1/” 且沒有定界字元的物件清單要求,使用者要求會傳回以 *“folder1/”*開頭的所有物件。
  • 對於字首設為 “folder1/” 且定界字元為 *"/"*的物件清單要求,該要求會傳回僅位於 folder1第一層的物件及資料夾視圖。
  • 對於字首設為 “folder1/subfolder1/” 且定界字元為 *"/"*的物件清單要求,該要求會傳回僅在 folder1/subfolder1第一層中的物件及資料夾視圖。

"folder1/*" AND 定界字元 "/" 的字首

  • 對於字首設為 “folder1/” 且定界字元為 *"/"*的物件清單要求,該要求會傳回僅位於 folder1第一層的物件及資料夾視圖。
  • 對於字首設為 “folder1/subfolder1/” 及定界字元 *"/"*的物件清單要求,要求會傳回 folder1/subfolder1中的物件 (及任何子資料夾)。
  • 對於字首設為 “folder1/” 且沒有定界字元的物件清單要求,將不允許該要求,因為在清單要求中必須使用 "/" 定界字元,此原則才會評估為 true。

不使用字首/定界字元或路徑的動作

有些 Cloud Object Storage API 未指定路徑或字首及定界字元。 Cloud Object Storage 服務角色: ManagerWriterReaderContent Reader 是包含這些動作的角色範例。 這也適用於自訂角色。 若要在使用 Prefix/DelimiterPath 條件時容許這些動作,IAM 原則中需要下列條件陳述式:

((path stringExists = false) AND (prefix stringExists = false) AND (delimiter stringExists= false))

如需不支援 字首/定界字元路徑 條件且在使用精細存取時需要上述陳述式的 API 動作完整清單,請參閱 Identity and Access Management 動作 表格。

請參閱如何 為具有條件的使用者建立新原則 一節,以在 IAM 原則中使用此子句。

搭配使用條件與 Cloud Object Storage 服務角色

將條件與 COS 服務角色一起使用
存取角色 動作的說明 支援的條件屬性
管理員 公開物件、建立及刪除儲存桶與物件。 請參閱附註
撰寫者 建立與刪除儲存桶及物件。 請參閱附註
讀者 列出儲存區、列出物件及下載物件。 請參閱附註
內容讀者 列出並下載物件。 請參閱附註
物件讀取器 下載物件。 路徑
物件寫入器 上傳物件。 路徑

附註: 這些角色支援「字首/定界字元」和「路徑」條件屬性。 角色也包括未指定路徑或字首及定界字元的動作。 在條件陳述式中使用 stringExists 子句,以容許這些動作。

如需每一個 Cloud Object Storage 服務角色的完整動作清單,以及每一個動作所支援的條件屬性清單,請參閱 鏈結

為具有條件的使用者建立新原則

下列範例提供具有 “Writer” Cloud Object Storage 服務角色且能夠執行下列動作的使用者:

  1. 列出名稱為 *"folder1/subfolder1"*之資料夾內完整物件階層的存取權。
  2. 對名為 *"subfolder1"*的資料夾中所有物件的讀取、寫入或刪除存取權。
  3. 執行儲存區配置管理,例如 HEAD BucketGET/PUT Bucket Versioning

具有條件之 IAM 原則的 CLI

有關如何使用命令列介面的基本資訊,請參閱「使用 IBM Cloud® 命令列介面」章節。

範例

policy.json:

{
"type": "access",
  "subject": {
    "attributes": [
      {
        "value": "IBMid-664001QJNU",
        "operator": "stringEquals",
        "key": "iam_id"
      }
    ]
  },
  "resource": {
    "attributes": [
      {
        "value": "cloud-object-storage",
        "operator": "stringEquals",
        "key": "serviceName"
      },
      {
        "value": "e6156134-5ed7-4f73-80d3-d6d1ef56f1f9",
        "operator": "stringEquals",
        "key": "serviceInstance"
      },
      {
        "value": "bucket",
        "operator": "stringEquals",
        "key": "resourceType"
      },
      {
        "value": "fgac-tf-test",
        "operator": "stringEquals",
        "key": "resource"
      }
    ]
  },
  "control": {
    "grant": {
      "roles": [
        {
          "role_id": "crn:v1:bluemix:public:iam::::serviceRole:Writer"
        }      ]
    }
  },
  "rule": {
    "operator": "or",
    "conditions": [
      {
        "operator": "and",
        "conditions": [
          {
            "key": "{{resource.attributes.prefix}}",
            "operator": "stringMatch",
            "value": "folder1/subfolder1/*"
          },
          {
            "key": "{{resource.attributes.delimiter}}",
            "operator": "stringEqualsAnyOf",
            "value": [
              "/",
              ""
            ]
          }
        ]
      },
      {
        "key": "{{resource.attributes.path}}",
        "operator": "stringMatch",
        "value": "folder1/subfolder1/*"
      },
      {
        "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"
}
ibmcloud iam  user-policy-create hello@ibm.com --file policy.json --api-version v2

使用 --api-version v2 搭配基於資源的屬性條件。

具有條件之 IAM 原則的 API

範例

要求

curl -X POST 'https://iam.cloud.ibm.com/v2/policies' \
-H 'Authorization: Bearer $TOKEN' \
-H 'Content-Type: application/json' \
-d '{
  "type": "access",
  "description": "access control for RESOURCE_NAME",
  "resource": {
    "attributes": [
      {
        "key": "serviceName",
        "operator": "stringEquals",
        "value": "cloud-object-storage"
      },
      {
        "key": "serviceInstance",
        "operator": "stringEquals",
        "value": "$SERVICE_INSTANCE"
      },
      {
        "key": "accountId",
        "operator": "stringEquals",
        "value": "$ACCOUNT_ID"
      },
      {
        "key": "resourceType",
        "operator": "stringEquals",
        "value": "bucket"
      },
      {
        "key": "resource",
        "operator": "stringEquals",
        "value": "$RESOURCE_NAME"
      }
    ]
  },
  "subject": {
    "attributes": [
      {
        "key": "iam_id",
        "operator": "stringEquals",
        "value": "IBMid-123453user"
      }
    ]
  },
  "control": {
    "grant": {
      "roles": [
        {
          "role_id": "crn:v1:bluemix:public:iam::::serviceRole:Writer"
        }
      ]
    }
  },
  "rule": {
    "operator": "or",
    "conditions": [
      {
        "operator": "and",
        "conditions": [
          {
            "key": "{{resource.attributes.prefix}}",
            "operator": "stringMatch",
            "value": "folder1/subfolder1/*"
          },
          {
            "key": "{{resource.attributes.delimiter}}",
            "operator": "stringEqualsAnyOf",
            "value": [
              "/",
              ""
            ]
          }
        ]
      },
      {
        "key": "{{resource.attributes.path}}",
        "operator": "stringMatch",
        "value": "folder1/subfolder1/*"
      },
      {
        "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"
}'

回應

{
    "id": "d4078e99-d78a-4a50-95d6-b528e3c87dff",
    "description": "access control for RESOURCE_NAME",
    "type": "access",
    "subject": {
        "attributes": [
            {
                "key": "iam_id",
                "operator": "stringEquals",
                "value": "IBMid-123453user"
            }
        ]
    },
    "resource": {
        "attributes": [
            {
                "key": "serviceName",
                "operator": "stringEquals",
                "value": "cloud-object-storage"
            },
            {
                "key": "serviceInstance",
                "operator": "stringEquals",
                "value": "$SERVICE_INSTANCE"
            },
            {
                "key": "accountId",
                "operator": "stringEquals",
                "value": "$ACCOUNT_ID"
            },
            {
                "key": "resourceType",
                "operator": "stringEquals",
                "value": "bucket"
            },
            {
                "key": "resource",
                "operator": "stringEquals",
                "value": "$RESOURCE_NAME"
            }
        ]
    },
    "pattern": "attribute-based-condition:resource:literal-and-wildcard",
    "rule": {
        "operator": "or",
        "conditions": [
            {
                "operator": "and",
                "conditions": [
                    {
                        "key": "{{resource.attributes.prefix}}",
                        "operator": "stringMatch",
                        "value": "folder1/subfolder1/*"
                    },
                    {
                        "key": "{{resource.attributes.delimiter}}",
                        "operator": "stringEqualsAnyOf",
                        "value": [
                            "/",
                            ""
                        ]
                    }
                ]
            },
            {
                "key": "{{resource.attributes.path}}",
                "operator": "stringMatch",
                "value": "folder1/subfolder1/*"
            },
            {
                "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
                    }
                ]
            }
        ]
    },
    "control": {
        "grant": {
            "roles": [
                {
                    "role_id": "crn:v1:bluemix:public:iam::::serviceRole:Writer"
                }
            ]
        }
    },
    "href": "https://iam.cloud.ibm.com/v2/policies/d4078e99-d78a-4a50-95d6-b528e3c87dff",
    "created_at": "2023-10-09T16:24:52.391Z",
    "created_by_id": " IBMid-12345user",
    "last_modified_at": "2023-10-09T16:24:52.391Z",
    "last_modified_by_id": " IBMid-12345user",
    "counts": {
        "account": {
            "current": 785,
            "limit": 4020
        },
        "subject": {
            "current": 1,
            "limit": 1000
        }
    },
    "state": "active",
    "version": "v1.0"
}

具有條件之 IAM 原則的 Terraform

範例

data "ibm_resource_group" "cos_group" {
      name = "Default"
}

resource "ibm_iam_user_policy" "example" {
 ibm_id = “user_email_id”
 roles = ["Writer"]
 resources {
  service = "cloud-object-storage"
  resource_type = "bucket"
  resource_instance_id = "cos instance guid"
  resource = "bucket-name"
}


rule_conditions {
 operator = "and"
 conditions {
  key = "{{resource.attributes.prefix}}"
  operator = "stringMatch"
  value = ["folder1/subfolder1/*"]
 }
 conditions {
  key = "{{resource.attributes.delimiter}}"
  operator = "stringEqualsAnyOf"
  value = ["/",""]
 }
 }
rule_conditions {
  key = "{{resource.attributes.path}}"
  operator = "stringMatch"
  value = ["folder1/subfolder1/*"]
 }
rule_conditions {
 operator = "and"
  conditions {
   key = "{{resource.attributes.delimiter}}"
   operator = "stringExists"
   value = ["false"]
  }
  conditions {
   key = "{{resource.attributes.prefix}}"
   operator = "stringExists"
   value = ["false"]
  }
  conditions {
   key = "{{resource.attributes.path}}"
   operator = "stringExists"
   value = ["false"]
  }
 }
rule_operator = "or"
 pattern = "attribute-based-condition:resource:literal-and-wildcard"
}

其他資訊

如需如何使用 字首/定界字元路徑 條件屬性的範例,請參閱 指導教學,以瞭解如何控制對儲存區中個別物件的存取權。