버킷의 개별 오브젝트에 대한 액세스 제어
이 튜토리얼에서는 IBM Cloud® Object Storage 버킷과 함께 IAM 액세스 정책을 사용하여 사용자에게 버킷 내의 개별 오브젝트 에 대한 액세스 권한을 부여하는 방법에 대한 예를 제공합니다.
시작하기 전에
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: User1 폴더에 있는 모든 오브젝트에 대해서만 Adam에게 읽기 액세스 권한을 부여하십시오.
이는 User1/의 키 이름으로 시작하는 모든 오브젝트를 읽을 수 있는 기능을 Adam에게 제공합니다. 이는 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 목록을 부여하십시오.
이는 User1/의 키 이름으로 시작하는 모든 오브젝트를 읽고 나열하는 기능을 Adam에게 제공합니다. 또한 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: Product 폴더 아래의 2023 및 2024 서브디렉토리에서만 파일을 나열, 읽기 및 복제할 수 있는 액세스 권한을 Samantha에게 부여하십시오.
이러한 조치 세트에서는 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: 2023 및 2024의 파일 나열, 읽기 및 복제 외에 2023 및 2024 폴더의 파일에 대한 UI를 탐색할 수 있는 액세스 권한을 Samantha에게 부여하십시오.
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"