IAM 액세스 조건을 사용하여 버킷 내의 오브젝트에 대한 액세스 지정

IAM 액세스 정책을 사용하면 Cloud Object Storage 버킷에서 특정 객체 그룹에 권한을 부여할 수 있습니다. 이 접근 방식을 사용하면 데이터 액세스에 대한 세분화된 액세스 제어가 가능하므로 다른 사용자 또는 애플리케이션이 버킷의 다른 파트에 액세스해야 하는 시나리오에서 유용합니다.

전체 버킷에 대한 액세스가 필요한 경우 (즉, 세분화된 액세스 제어가 필요하지 않은 경우) 개별 버킷에 대한 액세스 지정 의 정보를 따르십시오.

Cloud Object Storage 버킷에 저장된 각 오브젝트에는 고유 키가 있으며 이러한 키는 종종 파일 시스템과 유사한 계층 구조를 따릅니다.

IAM 액세스 정책에 대한 관련 링크

예제

  • "folder1/subfolder1/file.txt" 키가 있는 개별 오브젝트는 폴더 또는 디렉토리 계층 구조를 시뮬레이션할 수 있습니다. 여기서 “folder1” 디렉토리에는 "file.txt파일을 포함하는 “sub-folder1” 이라는 서브디렉토리가 포함되어 있습니다. 모든 폴더 레벨에서 액세스를 지정할 수 있습니다.
  • *“folder1”*폴더에서 모든 오브젝트에 대해 액세스 정책을 작성하거나, *“subfolder1”*서브디렉토리에서 오브젝트에 대해서만 액세스 정책을 지정할 수 있습니다.

정책 관리자는 IAM 액세스 정책을 작성할 때 조건을 구성하여 개별 오브젝트 및 폴더에 대한 액세스를 지정할 수 있습니다. 다음 절에서는 이러한 유형의 정책을 구성하는 방법에 대해 설명합니다.

세분화된 액세스 제어 정책 구성

버킷 내의 개별 오브젝트에 대한 액세스 권한을 부여하는 첫 번째 단계는 IAM 정책을 구성하는 것입니다. Cloud Object Storage 튜토리얼 단일 Object Storage 버킷에 대한 액세스 제한 에서 Object Storage 에 대한 IAM 액세스 정책 구성에 대한 자세한 정보를 찾을 수 있습니다. IAM 정책 빌드에 대한 자세한 일반 정보를 보려면 IBM Cloud IAM 작동 방법 으로 이동하십시오. 다음 항목들은 Object Storage 리소스에 대한 IAM 액세스 정책을 구축하는 데 핵심 구성 요소입니다.

제목

액세스 정책의 주제는 개별 사용자, 액세스 그룹, 서비스 ID 또는 신뢰할 수 있는 프로파일일 수 있습니다. 정책에 적용할 수 있는 주제 유형에 대한 자세한 정보는 IAM 정책의 개념 및 정책을 지정할 수 있는 사용자 를 참조하십시오.

Service

서비스는 사용자가 액세스 권한을 지정하려는 자원을 포함하는 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 역할 및 조건과의 상호작용 목록을 보려면 이 테이블 로 이동하십시오.

조건

자원이 식별되면 조건을 사용하여 버킷의 개별 오브젝트에 대한 주제의 액세스 범위를 추가로 지정할 수 있습니다. 이를 세분화된 액세스 제어라고 합니다.

단일 IAM 정책은 OR 또는 AND 문을 사용하여 조건을 결합함으로써 둘 이상의 조건을 가질 수 있습니다. 사용자 요청이 조치를 수행하도록 허용되려면 조건문 (하나 이상의 조건 포함) 이 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 연산자와 함께 조건문에서 함께 사용됩니다. 조건문에서 구분 기호 없이 접두부를 사용할 수 있습니다. 정책이 구분 기호 조건문이 아닌 접두부만 사용하여 구성된 경우 사용자는 구분 기호를 사용하거나 사용하지 않고 오브젝트를 나열할 수 있습니다.

접두부 및 분리문자 조건문 사용 예

이름이 *"folder1/subfolder1/file.txt"*인 오브젝트를 고려하십시오.

구분 기호가 없는 "folder1/" AND 의 접두부

  • 구분 기호를 제공하지 않고 folder1/ 에서 목록 요청을 수행하여 folder1/ 으로 시작하는 모든 오브젝트의 목록을 리턴할 수 있습니다.
  • 목록 요청에서 구분 기호 "/ " 를 사용하는 경우 *folder1/*에서 오브젝트 및 하위 폴더의 첫 번째 레벨만 표시되도록 제한됩니다.
  • 사용자가 서브폴더를 나열하려고 시도하면 (접두부 = *“folder1/subfolder1/”*를 나열하기 위한 요청) 액세스가 거부됩니다.

"folder1/" AND 구분 기호 "/ " 의 접두부

  • folder1의 첫 번째 레벨에 있는 오브젝트 및 서브폴더만 나열할 수 있습니다.
  • *"/ "*의 구분 기호를 지정하는 요청만 나열할 수 있습니다.
  • subfolder1의 컨텐츠를 나열하려고 시도하면 액세스가 거부됩니다 ( subfolder1의 컨텐츠를 나열하려면 사용자에게 접두부 = “folder1/subfolder1/" 을 허용하는 조건이 있어야 함).

다음 API에는 접두어/구분 기호 조건이 적용됩니다.

전체 작업 목록과 지원되는 조건 속성을 보려면 Identity and Access Management actions를 참조하십시오.

UI에서 해당 폴더를 탐색할 수 있도록 세분화된 사용자 액세스 권한을 제공하려면 버킷의 루트 폴더를 나열할 수 있는 액세스 권한이 필요합니다. 이를 사용하도록 정책을 구성하는 방법에 대해서는 시나리오 4 를 참조하십시오.

경로

경로는 특정 오브젝트에 대한 모든 읽기, 쓰기 또는 관리 액세스의 범위를 지정하는 데 사용됩니다.

*"folder1/subfolder1/file.txt"*라는 오브젝트의 경우, 전체 오브젝트 키는 경로입니다. 이 오브젝트에 대한 읽기, 쓰기 또는 관리 조치를 제한하려면 경로가 *"folder1/subfolder1/file.txt"*인 조건을 정의하십시오.

오브젝트에서 직접 작동하는 모든 Cloud Object Storage API에는 경로 조건이 적용됩니다. 경로를 지원하는 Cloud Object Storage API 조치 목록은 Identity and Access Management 조치 를 참조하십시오.

동일한 정책에서 사용자에게 읽기, 쓰기 또는 나열 조치를 부여할 때 접두어/구분 기호 조건과 경로 조건을 둘 다 정의하는 것이 좋습니다. Manager, Writer, ReaderContent Reader 는 접두어/구분 기호 및 경로 조건을 둘 다 정의하는 것이 권장되는 역할의 예입니다. 이를 사용하도록 정책을 구성하는 방법에 대해서는 시나리오 4 를 참조하십시오. 접두어/구분 기호를 지정하는 조건과 경로를 지정하는 조건은 IAM 정책 명령문에서 논리적으로 ORed 이어야 두 가지 유형의 조작 (오브젝트 읽기, 쓰기 또는 오브젝트 나열) 을 모두 허용할 수 있습니다.

조건 속성과 함께 사용되는 연산자

조건 속성을 정의할 때 사용할 수 있는 여러 연산자가 있습니다. 접두부, 구분 기호 및 경로 조건 속성에 사용할 수 있는 연산자의 전체 목록은 자원 속성 기반 조건 에서 찾을 수 있습니다.

와일드카드 사용

연산자가 stringMatch 또는 stringMatchAnyOf 인 경우 조건 속성의 값은 와일드카드 를 포함할 수 있습니다.

조건문에서 와일드카드 사용 예:

이름이 *"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 서비스 역할: Manager, Writer, ReaderContent Reader 는 이러한 조치를 포함하는 역할의 예입니다. 이는 사용자 정의 역할에도 적용됩니다. 접두어/구분 기호 또는 경로 조건을 사용할 때 이러한 조치를 허용하려면 IAM 정책에 다음 조건문이 필요합니다.

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

접두어/구분 기호 또는 경로 조건을 지원하지 않고 세분화된 액세스를 사용할 때 위의 명령문이 필요한 API 조치의 전체 목록은 Identity and Access Management 조치 표를 참조하십시오.

IAM 정책에서 이 절을 사용하려면 조건이 있는 사용자에 대한 새 정책 작성 방법에 대한 절을 참조하십시오.

Cloud Object Storage 서비스 역할의 조건 사용

COS 서비스 역할과 함께 조건 사용
액세스 역할 조치에 대한 설명 지원되는 조건 속성
관리자 객체를 공개하고, 버킷 및 객체를 생성 및 삭제합니다. 노트 참고
작성자 버킷과 객체를 생성하고 삭제합니다. 노트 참고
독자 버킷을 나열하고, 오브젝트를 나열하고, 오브젝트를 다운로드합니다. 노트 참고
Content Reader 오브젝트를 나열하고 다운로드합니다. 노트 참고
오브젝트 독자 오브젝트를 다운로드하십시오. 경로
오브젝트 작성자 오브젝트를 업로드합니다. 경로

주: 이 역할은 접두어/분리문자 및 경로 조건 속성을 지원합니다. 또한 역할에는 경로 또는 접두부 및 구분 기호를 지정하지 않는 조치가 포함됩니다. 이러한 조치를 허용하려면 조건문에서 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-versionv2 를 사용하십시오.

조건이 있는 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"
}

추가 정보

접두어/구분 기호또는 경로 조건 속성을 사용하는 방법에 대한 예는 버킷의 개별 오브젝트에 대한 액세스 제어에 대한 학습서 를 참조하십시오.