EC2 보안 그룹의 인바운드 목록을 보다가 TCP 443의 허용 범위가 넓어진 것을 발견했다고 가정해 보겠습니다. 지금 화면에서는 현재 허용 범위를 읽을 수 있습니다. 변경 시점과 실행에 사용한 자격 증명은 CloudTrail의 EC2 관리 이벤트에서 찾습니다. 같은 그룹에서 여러 규칙이 바뀌었다면, 이벤트 목록의 사용자 이름보다 내가 보고 있는 규칙과 이벤트의 요청 내용이 일치하는지 먼저 확인하는 편이 빠릅니다.
AWS CloudTrail — 관리 이벤트 레코드 필드
AWS CloudTrail — userIdentity 요소
Amazon VPC — 보안 그룹 규칙 구성

규칙 하나를 기준으로 이벤트 범위 좁히기
EC2 콘솔에서 보안 그룹이 속한 계정과 리전, 그룹 ID(sg-…), 규칙 ID(sgr-…), 방향, 프로토콜·포트, 출발지 또는 목적지를 메모합니다. 인바운드는 출발지, 아웃바운드는 목적지를 봅니다. 이미 사라진 규칙을 조사한다면 변경 요청서나 이전 설정 기록에 남은 값부터 확보합니다. Amazon VPC — 보안 그룹 규칙 구성
같은 계정과 리전의 CloudTrail 이벤트 기록(Event history)에서 변경 추정 시간대를 선택합니다. 이벤트 기록은 해당 리전의 최근 90일 관리 이벤트를 보여 주며 시간 범위 외에 속성 필터는 한 번에 하나를 적용할 수 있습니다. 기본 Read only = false를 해제하고 Event name을 선택해 아래 후보를 하나씩 조회합니다. AWS CloudTrail — 이벤트 기록의 범위와 제한 AWS CloudTrail — 콘솔에서 최근 관리 이벤트 조회
| 확인하려는 변경 | Event name 후보 | 대조할 값 |
|---|---|---|
| 인바운드 추가 또는 삭제 | AuthorizeSecurityGroupIngress 또는 RevokeSecurityGroupIngress |
그룹 ID와 규칙 ID 또는 프로토콜·포트·출발지 |
| 아웃바운드 추가 또는 삭제 | AuthorizeSecurityGroupEgress 또는 RevokeSecurityGroupEgress |
그룹 ID와 규칙 ID 또는 프로토콜·포트·목적지 |
| 기존 규칙 수정 | ModifySecurityGroupRules |
그룹 ID, 규칙 ID, 요청에 담긴 새 값 |
허용 범위가 달라진 시점에 수정 이벤트가 없다면 추가와 삭제 이벤트를 각각 찾아봅니다. 기존 규칙을 삭제하고 새로 추가했다면 두 호출이 별개로 남을 수 있으므로, 각 이벤트의 시각과 결과를 따로 기록합니다. Amazon VPC — 보안 그룹 규칙 구성

이벤트 원문에서 변경 대상과 호출 결과 확인하기
후보 이벤트의 상세 화면에서 이벤트 레코드를 열고 eventSource가 ec2.amazonaws.com인지 확인합니다. requestParameters에서 그룹 ID와 규칙 ID를 찾아 메모와 대조합니다. 규칙 ID가 요청에 보이지 않으면 방향, 프로토콜, 포트 범위, CIDR 또는 참조 보안 그룹을 함께 비교합니다. 추가 요청이라면 responseElements에 생성된 규칙 ID가 있는지도 살펴봅니다. AWS CloudTrail — 콘솔에서 최근 관리 이벤트 조회 AWS CloudTrail — 관리 이벤트 레코드 필드 Amazon VPC — 보안 그룹 규칙 구성
eventTime은 AWS가 요청 처리를 완료한 시각으로, 원문에는 UTC로 기록됩니다. 예를 들어 01:24Z는 한국 시각 10:24입니다. errorCode와 errorMessage, 응답에 담긴 결과를 함께 보고 실패한 호출을 분리합니다. 같은 규칙에 대한 재시도가 이어졌다면 eventID로 각 이벤트를 구분하고, 성공으로 판단한 근거를 기록합니다. AWS CloudTrail — 관리 이벤트 레코드 필드
기존 규칙의 출발지나 포트가 얼마나 달라졌는지 확인하려면 변경 직전 설정과 요청에 담긴 새 값을 대조합니다. 같은 시간대에 성공한 호출이 여러 건이라면 이벤트를 시각순으로 놓고, 그중 어떤 호출이 조사 중인 상태를 만들었는지 확인합니다.
역할 세션에서 실제 실행 경로 찾기
대상 이벤트를 찾았으면 userIdentity.type부터 읽습니다. IAMUser는 해당 IAM 사용자의 자격 증명으로 호출했다는 뜻입니다. AssumedRole은 역할에서 발급받은 임시 자격 증명으로 호출한 경우입니다. userIdentity.arn으로 어떤 세션이었는지, sessionContext.sessionIssuer.arn으로 어느 역할이 그 세션을 발급했는지 구분합니다. AWS 서비스 이름이 invokedBy에 기록돼 있다면 해당 서비스의 작업 이력을 확인합니다. AWS CloudTrail — userIdentity 요소
가령 성공한 ModifySecurityGroupRules 이벤트에서 NetworkDeploy 역할과 deploy-042 세션이 확인됐다고 해보겠습니다. 우선 실행 주체를 ‘NetworkDeploy 역할의 deploy-042 세션’으로 기록합니다. sessionContext.sourceIdentity가 있으면 원래 호출 주체를 좁히는 단서로 삼고, 배포 시스템에서 같은 세션과 시각에 대응하는 실행 기록을 찾습니다. 파이프라인이 호출했다면 API를 호출한 역할 세션, 배포를 시작한 사람 또는 자동 트리거, 승인자를 각각 구분합니다. AWS CloudTrail — userIdentity 요소

결론
보안 그룹 변경을 조사할 때는 먼저 규칙 ID나 요청 값으로 대상을 확정하고, 호출 결과를 본 뒤 역할과 세션을 읽습니다. 변경 티켓에는 ‘규칙 / 변경 API / 호출 시각 / 이벤트 ID / 실행에 사용한 사용자 또는 세션 / 추가 대조 근거’를 남기면 인계받은 사람도 판단을 재현할 수 있습니다. 90일이 지난 이벤트라면 당시 수집하도록 설정한 트레일의 S3 로그나 이벤트 데이터 스토어에 기록이 남아 있는지 확인합니다. AWS CloudTrail — 이벤트 기록의 범위와 제한