IAM 정책 조건을 사용하여 세부적인 액세스 제어 구현 - Amazon EventBridge

IAM 정책 조건을 사용하여 세부적인 액세스 제어 구현

권한을 부여할 때 IAM 정책 언어를 사용하여 정책이 적용되는 조건을 지정할 수 있습니다. 정책 명령문에서 정책이 적용되는 시점을 제어하는 조건을 지정할 수 있습니다. 각 조건에는 하나 이상의 키-값 쌍이 포함됩니다. 조건 키에는 대/소문자가 구분되지 않습니다. 예를 들어, 특정 날짜 이후에만 정책을 적용할 수 있습니다.

여러 조건을 지정하거나 조건 하나에 여러 키를 지정하는 경우 논리적 AND 연산을 적용하여 조건을 평가합니다. 조건 하나에서 키 하나에 여러 값을 지정하면 논리적 OR 연산자를 적용하여 조건을 평가합니다. 모든 조건이 충족되어야 권한이 부여됩니다.

조건을 지정할 때 자리표시자를 사용할 수도 있습니다. 자세한 내용은 IAM 사용 설명서에서 정책 변수를 참조하십시오. IAM 정책 언어에서의 조건 지정에 관한 자세한 내용은 IAM 사용 설명서조건을 참조하십시오.

기본적으로 IAM 사용자와 역할은 계정의 이벤트에 전혀 액세스할 수 없습니다. 이벤트를 사용하려면 PutRule API 작업에 대해 허가를 받아야 합니다. 정책을 통해 IAM 사용자나 역할에 events:PutRule 작업을 허용하면 특정 이벤트와 일치하는 규칙을 생성할 수 있습니다. 규칙에 대상을 추가해야 합니다. 대상이 없는 규칙은 들어오는 이벤트와 일치할 때 CloudWatch 지표를 게시하는 것 외에 어떤 작업도 수행할 수 없습니다. IAM 사용자나 역할은 events:PutTargets 작업에 대한 권한이 있어야 합니다.

특정 리소스와 이벤트 유형에 대한 권한 부여의 범위를 설정하여 이벤트에 대한 액세스 권한을 제한할 수 있습니다(events:sourceevents:detail-type 조건 키 사용). IAM 사용자나 역할이 특정한 소스 세트 및 세부 유형에만 일치하는 규칙을 생성할 수 있도록 정책 명령문에 조건을 제공할 수 있습니다.

마찬가지로 정책 명령문에서의 조건 설정을 통해 IAM 사용자나 역할이 규칙에 추가할 수 있는(events:TargetArn 조건 키 사용) 계정의 특정 리소스를 확인할 수 있습니다. 예를 들어 계정에서 CloudTrail를 활성화하고 CloudTrail 스트림이 존재하면 EventBridge를 통해 계정의 사용자가 CloudTrail 이벤트를 사용할 수 있게 됩니다. 사용자가 EventBridge를 사용하고 모든 CloudTrail 이벤트를 액세스할 수 있게 하려면 사용자나 역할이 생성한 어떤 규칙도 CloudTrail 이벤트 유형과 일치할 수 없도록 하는 조건문을 통해 PutRule API 작업에 거부 명령문을 추가할 수 있습니다.

CloudTrail 이벤트의 경우, 원래 API 호출을 요청한 특정 보안 주체로 액세스를 제한할 수 있습니다(events:detail.userIdentity.principalId 조건 키 사용). 예를 들어 사용자가 감사나 과학 수사에서 사용하는 계정의 특정 IAM 역할에서 생성된 이벤트를 제외하고 모든 CloudTrail 이벤트를 볼 수 있도록 할 수 있습니다.

조건 키 키/값 페어 평가 유형

events:source

"events:source":"source "

여기에서 source"aws.ec2", "aws.s3" 같은 이벤트의 소스 필드를 위한 리터럴 문자열입니다. source에 사용 가능한 값을 더 보려면 EventBridge 지원되는 AWS 서비스의 이벤트 예제 단원에서 예제 이벤트를 참조하십시오.

소스, null

events:detail-type

"events:detail-type":"detail-type "

여기에서 detail-type"AWS API Call via CloudTrail""EC2 Instance State-change Notification" 같은 이벤트의 detail-type 필드를 위한 리터럴 문자열입니다. detail-type에 사용 가능한 값을 더 보려면 EventBridge 지원되는 AWS 서비스의 이벤트 예제 단원에서 예제 이벤트를 참조하십시오.

세부 유형, null

events: detail.userIdentity.principalId

"events:detail.userIdentity.principalId":"principal-id"

여기에서 principal-id는 detail-type이 "AWS API Call via CloudTrail"(예: "AROAIDPPEZS35WEXAMPLE:AssumedRoleSessionName.")인 이벤트의 detail.userIdentity.principalId 필드를 위한 리터럴 문자열입니다.

보안 주체 ID, null

events: detail.service

"events:detail.service":"service"

service는 이벤트의 detail.service 필드에 대한 리터럴 문자열(예: "ABUSE")입니다.

service, Null

events: detail.eventTypeCode

"events:detail.eventTypeCode":"eventTypeCode"

eventTypeCode는 이벤트의 detail.eventTypeCode 필드에 대한 리터럴 문자열(예: "AWS_ABUSE_DOS_REPORT")입니다.

eventTypeCode, Null

events:TargetArn

"events:TargetArn":"target-arn "

여기에서 target-arn"arn:aws:lambda:*:*:function:*" 같은 규칙에 입력할 수 있는 대상의 ARN입니다.

ARN, Null

EventBridge용 예제 정책 명령문은 EventBridge 리소스에 대한 액세스 권한 관리 개요 단원을 참조하십시오.

예제 1: 특정 리소스로 액세스 권한 제한

다음은 IAM 사용자에게 연결할 수 있는 정책의 예제입니다. 정책 A는 모든 이벤트에서 PutRule API 작업을 허용하는 반면, 정책 B는 생성 중인 규칙의 이벤트 패턴이 Amazon EC2 이벤트에 일치하는 경우에만 PutRule을 허용합니다.

정책 A:-모든 이벤트 허용

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutRuleForAllEvents", "Effect": "Allow", "Action": "events:PutRule", "Resource": "*" } ] }

정책 B:-Amazon EC2의 이벤트만 허용

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutRuleForAllEC2Events", "Effect": "Allow", "Action": "events:PutRule", "Resource": "*", "Condition": { "StringEquals": { "events:source": "aws.ec2" } } } ] }

EventPatternPutRule에 대한 필수 인수입니다. 따라서 정책 B의 사용자가 다음과 같은 이벤트 패턴을 통해 PutRule을 호출하는 경우에는

{ "source": [ "aws.ec2" ] }

정책이 이러한 특정 소스(예: "aws.ec2")를 허용하기 때문에 규칙을 생성할 수 있습니다. 그러나 정책 B를 사용하는 사용자가 다음과 같은 이벤트 패턴으로 PutRule을 호출하면 정책이 이 특정 소스(즉, "aws.s3")를 허용하지 않으므로 규칙 생성이 거부됩니다.

{ "source": [ "aws.s3" ] }

기본적으로 정책 B의 사용자만 Amazon EC2에서 호출된 이벤트와 일치하는 규칙을 생성할 수 있습니다. 따라서 이들만 Amazon EC2에서 이벤트 액세스가 허용됩니다.

정책 A와 정책 B를 비교하려면 다음 표를 참고하십시오.

이벤트 패턴 정책 A에서 허용 정책 B에서 허용
{ "source": [ "aws.ec2" ] }

{ "source": [ "aws.ec2", "aws.s3" ] }

아니요(소스 aws.s3이 허용되지 않음)

{ "source": [ "aws.ec2" ], "detail-type": [ "EC2 Instance State-change Notification" ] }

{ "detail-type": [ "EC2 Instance State-change Notification" ] }

아니요(소스를 지정해야 함)

예제 2: 이벤트 패턴에서 개별적으로 사용할 수 있는 소스를 여러 개 정의

다음 정책은 Amazon EC2 또는 Amazon ECS에서 나온 이벤트를 허용합니다. 즉, IAM 사용자나 역할이 EventPattern의 소스가 "aws.ec2" 또는 "aws.ecs"로 지정되도록 규칙을 생성할 수 있습니다. 소스를 정의하지 않으면 "거부"가 됩니다.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutRuleIfSourceIsEC2OrECS", "Effect": "Allow", "Action": "events:PutRule", "Resource": "*", "Condition": { "StringEquals": { "events:source": [ "aws.ec2", "aws.ecs" ] } } } ] }

다음 표에는 이 정책에서 허용 또는 거부되는 이벤트 패턴의 예제가 나와 있습니다.

이벤트 패턴 정책에서 허용
{ "source": [ "aws.ec2" ] }

{ "source": [ "aws.ecs" ] }

{ "source": [ "aws.s3" ] }

아니요

{ "source": [ "aws.ec2", "aws.ecs" ] }

아니요

{ "detail-type": [ "AWS API Call via CloudTrail" ] }

아니요

예제 3: 이벤트 패턴에서 사용할 수 있는 소스와 DetailType을 정의

다음 정책은 DetailType가 EC2 instance state change notificationaws.ec2 소스에서 나온 이벤트만 허용합니다.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutRuleIfSourceIsEC2AndDetailTypeIsInstanceStateChangeNotification", "Effect": "Allow", "Action": "events:PutRule", "Resource": "*", "Condition": { "StringEquals": { "events:source": "aws.ec2", "events:detail-type": "EC2 Instance State-change Notification" } } } ] }

다음 표에는 이 정책에서 허용 또는 거부되는 이벤트 패턴의 예제가 나와 있습니다.

이벤트 패턴 정책에서 허용
{ "source": [ "aws.ec2" ] }

아니요

{ "source": [ "aws.ecs" ] }

아니요

{ "source": [ "aws.ec2" ], "detail-type": [ "EC2 Instance State-change Notification" ] }

{ "source": [ "aws.ec2" ], "detail-type": [ "EC2 Instance Health Failed" ] }

아니요

{ "detail-type": [ "EC2 Instance State-change Notification" ] }

아니요

예제 4: 이벤트 패턴에서 소스가 정의되었는지 확인

다음 정책은 소스 필드가 반드시 포함되어 있는 EventPatterns으로 규칙을 생성하는 것을 허용합니다. 즉, IAM 사용자나 역할은 특정 소스를 제공하지 않는 EventPattern으로는 규칙을 생성할 수 없습니다.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutRuleIfSourceIsSpecified", "Effect": "Allow", "Action": "events:PutRule", "Resource": "*", "Condition": { "Null": { "events:source": "false" } } } ] }

다음 표에는 이 정책에서 허용 또는 거부되는 이벤트 패턴의 예제가 나와 있습니다.

이벤트 패턴 정책에서 허용
{ "source": [ "aws.ec2" ], "detail-type": [ "EC2 Instance State-change Notification" ] }

{ "source": [ "aws.ecs", "aws.ec2" ] }

{ "detail-type": [ "EC2 Instance State-change Notification" ] }

아니요

예제 5: 여러 개의 소스를 가진 이벤트 패턴에서 허용되는 소스의 목록을 정의

다음 정책은 여러 개의 소스를 가질 수 있는 EventPatterns으로 규칙을 생성하는 것을 허용합니다. 이벤트 패턴에 나열된 각 소스는 해당 조건에서 제공되는 목록의 구성원이어야 합니다. ForAllValues 조건을 사용할 때는 이 조건의 항목 중 적어도 하나가 반드시 정의되어 있어야 합니다.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutRuleIfSourceIsSpecifiedAndIsEitherS3OrEC2OrBoth", "Effect": "Allow", "Action": "events:PutRule", "Resource": "*", "Condition": { "ForAllValues:StringEquals": { "events:source": [ "aws.ec2", "aws.s3" ] }, "Null": { "events:source": "false" } } } ] }

다음 표에는 이 정책에서 허용 또는 거부되는 이벤트 패턴의 예제가 나와 있습니다.

이벤트 패턴 정책에서 허용
{ "source": [ "aws.ec2" ] }

{ "source": [ "aws.ec2", "aws.s3" ] }

{ "source": [ "aws.ec2", "aws.autoscaling" ] }

아니요

{ "detail-type": [ "EC2 Instance State-change Notification" ] }

아니요

예제 6: detail.service로 PutRule 액세스 제한

IAM 사용자 또는 역할에 대해 events:details.service 필드에 특정 값이 있는 이벤트에 대해서만 규칙을 생성하도록 제한할 수 있습니다. events:details.service의 값이 반드시 AWS 서비스의 이름일 필요는 없습니다.

이 정책 조건은 보안 또는 위반과 관련된 AWS 상태의 이벤트를 사용할 때 유용합니다. 이 정책 조건을 사용하면 이러한 기밀 경보에 대한 액세스를, 해당 경보를 볼 필요가 있는 사용자로만 제한할 수 있습니다.

예를 들어 다음 정책은 events:details.service 값이 ABUSE인 경우에만 이벤트에 대한 규칙 생성을 허용합니다.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutRuleEventsWithDetailServiceEC2", "Effect": "Allow", "Action": "events:PutRule", "Resource": "*", "Condition": { "StringEquals": { "events:detail.service": "ABUSE" } } } ] }

예제 7: detail.eventTypeCode로 PutRule 액세스 제한

IAM 사용자 또는 역할에 대해 events:details.eventTypeCode 필드에 특정 값이 있는 이벤트에 대해서만 규칙을 생성하도록 제한할 수 있습니다. 이 정책 조건은 보안 또는 위반과 관련된 AWS 상태의 이벤트를 사용할 때 유용합니다. 이 정책 조건을 사용하면 이러한 기밀 경보에 대한 액세스를, 해당 경보를 볼 필요가 있는 사용자로만 제한할 수 있습니다.

예를 들어 다음 정책은 events:details.eventTypeCode 값이 AWS_ABUSE_DOS_REPORT인 경우에만 이벤트에 대한 규칙 생성을 허용합니다.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutRuleEventsWithDetailServiceEC2", "Effect": "Allow", "Action": "events:PutRule", "Resource": "*", "Condition": { "StringEquals": { "events:detail.eventTypeCode": "AWS_ABUSE_DOS_REPORT" } } } ] }

예제 8: 특정 PrincipalId에서의 API 호출에 대한 AWS CloudTrail 이벤트가 사용되는지 확인

모든 AWS CloudTrail 이벤트는 이벤트의 detail.userIdentity.principalId 경로에서 API 호출(PrincipalId)을 한 사용자의 ID를 가지고 있습니다. events:detail.userIdentity.principalId 조건 키를 사용하여 IAM 사용자나 역할이 특정 계정에서 들어오는 호출에 대한 CloudTrail 이벤트만 액세스할 수 있도록 제한할 수 있습니다.

"Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutRuleOnlyForCloudTrailEventsWhereUserIsASpecificIAMUser", "Effect": "Allow", "Action": "events:PutRule", "Resource": "*", "Condition": { "StringEquals": { "events:detail-type": [ "AWS API Call via CloudTrail" ], "events:detail.userIdentity.principalId": [ "AIDAJ45Q7YFFAREXAMPLE" ] } } } ] }

다음 표에는 이 정책에서 허용 또는 거부되는 이벤트 패턴의 예제가 나와 있습니다.

이벤트 패턴 정책에서 허용
{ "detail-type": [ "AWS API Call via CloudTrail" ] }

아니요

{ "detail-type": [ "AWS API Call via CloudTrail" ], "detail.userIdentity.principalId": [ "AIDAJ45Q7YFFAREXAMPLE" ] }

{ "detail-type": [ "AWS API Call via CloudTrail" ], "detail.userIdentity.principalId": [ "AROAIDPPEZS35WEXAMPLE:AssumedRoleSessionName" ] }

아니요

예제 9: 대상에 대한 액세스 제한

IAM 사용자나 역할이 events:PutTargets 권한을 가지고 있는 경우에는 동일한 계정을 가진 모든 대상을 액세스를 허용하는 규칙에 추가할 수 있습니다. 예를 들어 다음 정책은 특정 규칙(123456789012 계정 하의 MyRule)에만 대상을 추가하도록 제한합니다.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutTargetsOnASpecificRule", "Effect": "Allow", "Action": "events:PutTargets", "Resource": "arn:aws:events:us-east-1:123456789012:rule/MyRule" } ] }

규칙에 추가할 수 있는 대상을 제한하려면 events:TargetArn 조건 키를 사용합니다. 예를 들어 다음 예제에서와 같이 Lambda 함수로만 대상을 제한할 수 있습니다.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutTargetsOnASpecificRuleAndOnlyLambdaFunctions", "Effect": "Allow", "Action": "events:PutTargets", "Resource": "arn:aws:events:us-east-1:123456789012:rule/MyRule", "Condition": { "ArnLike": { "events:TargetArn": "arn:aws:lambda:*:*:function:*" } } } ] }