태그를 사용하는 AWS Glue 자격 증명 기반(IAM) 액세스 제어 정책 예제 - AWS Glue

태그를 사용하는 AWS Glue 자격 증명 기반(IAM) 액세스 제어 정책 예제

이 섹션에서는 태그를 사용하여 다양한 AWS Glue 작업 및 리소스에 대한 권한을 제어하는 AWS Identity and Access Management(IAM) 정책 예제를 제공합니다. 이러한 예제를 복사해 IAM 콘솔에서 편집할 수 있습니다. 그런 다음 사용자, 역할 및 그룹 등 IAM 자격 증명에 연결할 수 있습니다.

태그를 연결하고 IAM 정책에서 resourceTag 조건을 지정하여 크롤러, 작업, 트리거 및 개발 엔드포인트에 대한 액세스를 제어할 수 있습니다.

태그를 사용하는 액세스 제어 예제

예를 들어 트리거 t2에 대한 액세스를 계정에 있는 Tom이라는 특정 사용자로 제한하려 한다고 가정합니다. Sam을 포함해 다른 모든 사용자들은 t1을 트리거하기 위한 액세스 권한을 갖습니다. 트리거 t1t2는 다음과 같은 속성을 갖추고 있습니다.

aws glue get-triggers { "Triggers": [ { "State": "CREATED", "Type": "SCHEDULED", "Name": "t1", "Actions": [ { "JobName": "j1" } ], "Schedule": "cron(0 0/1 * * ? *)" }, { "State": "CREATED", "Type": "SCHEDULED", "Name": "t2", "Actions": [ { "JobName": "j1" } ], "Schedule": "cron(0 0/1 * * ? *)" } ] }

t2를 트리거하기 위한 태그 값 Tom(aws:resourceTag/Name": "Tom")에 AWS Glue 관리자가 연결되어 있습니다. 또한 AWS Glue 관리자는 태그를 기준으로 조건 문과 함께 IAM 정책을 Tom에게 제공했습니다. 결과적으로 Tom은 태그 값 Tom으로 리소스에서 수행되는 AWS Glue 작업만 사용할 수 있습니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "glue:*", "Resource": "*", "Condition": { "StringEquals": { "aws:resourceTag/Name": "Tom" } } } ] }

Tom이 트리거 t1에 대한 액세스를 시도하면 액세스 거부 메시지가 수신됩니다. 한편, Tom은 트리거 t2를 성공적으로 검색할 수 있습니다.

aws glue get-trigger --name t1 An error occurred (AccessDeniedException) when calling the GetTrigger operation: User: Tom is not authorized to perform: glue:GetTrigger on resource: arn:aws:glue:us-east-1:123456789012:trigger/t1 aws glue get-trigger --name t2 { "Trigger": { "State": "CREATED", "Type": "SCHEDULED", "Name": "t2", "Actions": [ { "JobName": "j1" } ], "Schedule": "cron(0 0/1 * * ? *)" } }

이 API 작업은 태그에 대한 필터링을 지원하지 않기 때문에 Tom은 여러 개의 GetTriggers API를 사용하여 트리거를 나열할 수 없습니다.

Tom에게 GetTriggers에 대한 액세스 권한을 부여하기 위해 AWS Glue 관리자는 권한을 두 개의 섹션으로 분할하는 정책을 생성합니다. 첫 번째 섹션에서는 Tom에게 GetTriggers API 작업에서 모든 트리거에 액세스할 수 있도록 허용합니다. 두 번째 섹션에서는 Tom에게 Tom으로 태그 값이 지정된 API 작업에 액세스할 수 있도록 허용합니다. 이 정책에 따라 Tom에게는 트리거 t2에 대한 GetTriggersGetTrigger 액세스가 모두 허용됩니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "glue:GetTriggers", "Resource": "*" }, { "Effect": "Allow", "Action": "glue:*", "Resource": "*", "Condition": { "StringEquals": { "aws:resourceTag/Name": "Tom" } } } ] }

거부와 함께 태그를 사용하는 액세스 제어 예제

리소스 정책을 작성하는 또 다른 방법은 리소스에 대한 액세스를 명시적으로 거부하는 것입니다. 예를 들어, Arnav가 특수 팀의 일원이라고 가정해 보겠습니다. 모든 AWS Glue 작업 리소스에 Team 키 및 Special 값으로 태그가 지정됩니다. 관리자가 자격 증명에 다음 정책을 연결하면 해당 사용자들이 특수 팀으로 태그가 지정된 작업을 제외한 모든 작업에 액세스할 수 있습니다. 이 정책의 첫 번째 섹션에서는 모든 AWS Glue 작업이 허용됩니다. 그러나 두 번째 섹션에서는 특수 팀으로 태그가 지정된 작업에 대한 액세스가 거부됩니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "glue:*", "Resource": "arn:aws:glue:us-east-1:123456789012:job/*" }, { "Effect": "Deny", "Action": "glue:*", "Resource": "arn:aws:glue:us-east-1:123456789012:job/*", "Condition": { "StringEquals": { "aws:ResourceTag/Team": "Special" } } } ] }

Sam은 이전 예제와 똑같은 트리거를 사용하여 트리거 t1에 액세스할 수 있지만, 트리거 t2는 액세스할 수 없습니다. 다음 예제는 Sam이 t1t2에 액세스를 시도할 때의 결과를 보여줍니다.

aws glue get-trigger --name t1 { "Trigger": { "State": "CREATED", "Type": "SCHEDULED", "Name": "t1", "Actions": [ { "JobName": "j1" } ], "Schedule": "cron(0 0/1 * * ? *)" } } aws glue get-trigger --name t2 An error occurred (AccessDeniedException) when calling the GetTrigger operation: User: Sam is not authorized to perform: glue:GetTrigger on resource: arn:aws:glue:us-east-1:123456789012:trigger/t2 with an explicit deny
중요

명시적 거부 정책은 여러 개의 API에 적용되지 않습니다. 태그 값 Tom이 트리거 t2에 연결된 경우에도 Sam은 여전히 GetTriggers를 호출하여 트리거 t2를 볼 수 있습니다. 따라서 관리자는 GetTriggers API 작업에 대한 액세스를 허용하고 싶지 않을 수 있습니다. 다음 예제는 Sam이 GetTriggers API를 실행할 때의 결과를 보여줍니다.

aws glue get-triggers { "Triggers": [ { "State": "CREATED", "Type": "SCHEDULED", "Name": "t1", "Actions": [ { "JobName": "j1" } ], "Schedule": "cron(0 0/1 * * ? *)" }, { "State": "CREATED", "Type": "SCHEDULED", "Name": "t2", "Actions": [ { "JobName": "j1" } ], "Schedule": "cron(0 0/1 * * ? *)" } ] }

목록 및 배치 API 작업과 함께 태그를 사용하는 액세스 제어 예

리소스 정책을 작성하는 세 번째 접근 방식은 태그 값에 대해 리소스를 나열하도록 List API 작업을 사용해 리소스에 대한 액세스를 허용하는 것입니다. 그런 다음, 해당되는 Batch API 작업을 사용하여 특정 리소스의 세부 정보에 대한 액세스를 허용합니다. 이러한 접근 방식에서는 관리자가 여러 개의 GetCrawlers, GetDevEndpoints, GetJobs 또는 GetTriggers API 작업에 대한 액세스를 허용할 필요가 없습니다. 대신에 다음 API 작업을 통해 리소스를 나열할 수 있도록 허용할 수 있습니다.

  • ListCrawlers

  • ListDevEndpoints

  • ListJobs

  • ListTriggers

그리고 다음 API 작업을 통해 개별 리소스에 대한 세부 정보를 확인할 수 있도록 허용할 수 있습니다.

  • BatchGetCrawlers

  • BatchGetDevEndpoints

  • BatchGetJobs

  • BatchGetTriggers

관리자는 이러한 접근 방식을 사용하기 위해 다음을 수행할 수 있습니다.

  1. 크롤러, 개발 엔드포인트, 작업 및 트리거에 태그를 추가합니다.

  2. GetCrawlers, GetDevEndponts, GetJobs, GetTriggers 같은 Get API 작업에 대한 사용자 액세스를 거부합니다.

  3. 사용자가 액세스 권한을 가진 태그 지정 리소스를 확인할 수 있도록 ListCrawlers, ListDevEndponts, ListJobs, ListTriggers 같은 List API 작업에 대한 사용자 액세스를 허용합니다.

  4. TagResourceUntagResource 같은 AWS Glue 태그 지정 API에 대한 사용자 액세스를 거부합니다.

  5. BatchGetCrawlers, BatchGetDevEndponts, BatchGetJobs, BatchGetTriggers 같은 BatchGet API 작업을 통해 리소스 세부 정보에 대한 사용자 액세스를 허용합니다.

예를 들어, ListCrawlers 작업을 호출할 때 사용자 이름과 일치하도록 태그 값을 제공합니다. 그러면 결과는 제공된 태그 값과 일치하는 크롤러의 목록이 됩니다. 주어진 태그를 사용해 각 크롤러에 대한 세부 정보를 얻을 수 있도록 BatchGetCrawlers에 이름 목록을 제공합니다.

예를 들어 Tom이 Tom으로 태그가 지정된 트리거의 세부 정보만 검색할 수 있도록 하려면 관리자가 Tom에서 트리거에 태그를 추가하고, 모든 사용자에 대해 GetTriggers API 작업 액세스를 거부하고, 모든 사용자에 대해 ListTriggersBatchGetTriggers 액세스를 허용할 수 있습니다. 다음은 AWS Glue 관리자가 Tom에게 부여하는 리소스 정책입니다. 이 정책의 첫 번째 섹션에서는 GetTriggers에 대한 AWS Glue API 작업이 거부됩니다. 정책의 두 번째 섹션에서는 모든 리소스에 대해ListTriggers가 허용됩니다. 그러나 세 번째 섹션에서는 Tom이라고 태그가 지정된 리소스에게 BatchGetTriggers 액세스가 허용됩니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "glue:GetTriggers", "Resource": "*" }, { "Effect": "Allow", "Action": [ "glue:ListTriggers" ], "Resource": [ "*" ] }, { "Effect": "Allow", "Action": [ "glue:BatchGetTriggers" ], "Resource": [ "*" ], "Condition": { "StringEquals": { "aws:resourceTag/Name": "Tom" } } } ] }

Tom은 이전 예제와 똑같은 트리거를 사용하여 트리거 t2에 액세스할 수 있지만, 트리거 t1에는 액세스할 수 없습니다. 다음 예제는 Tom이 BatchGetTriggers를 통해 t1t2에 액세스를 시도할 때의 결과를 보여줍니다.

aws glue batch-get-triggers --trigger-names t2 { "Triggers": { "State": "CREATED", "Type": "SCHEDULED", "Name": "t2", "Actions": [ { "JobName": "j2" } ], "Schedule": "cron(0 0/1 * * ? *)" } } aws glue batch-get-triggers --trigger-names t1 An error occurred (AccessDeniedException) when calling the BatchGetTriggers operation: No access to any requested resource.

다음 예제는 Tom이 동일한 BatchGetTriggers 호출에서 트리거 t2와 트리거 t3(존재하지 않음) 모두에 액세스를 시도할 때의 결과를 보여줍니다. Tom은 트리거 t2에 대한 액세스 권한을 가지고 있고 이 트리거가 존재하기 때문에 t2만 반환됩니다. Tom에게 트리거 t3에 대한 액세스가 허용되지만 트리거 t3가 존재하지 않기 때문에 "TriggersNotFound": [] 목록에서 응답으로 t3가 반환됩니다.

aws glue batch-get-triggers --trigger-names t2 t3 { "Triggers": { "State": "CREATED", "Type": "SCHEDULED", "Name": "t2", "Actions": [ { "JobName": "j2" } ], "TriggersNotFound": ["t3"], "Schedule": "cron(0 0/1 * * ? *)" } }