

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# CloudTrail 로그 파일 작업
CloudTrail 로그 파일

CloudTrail 파일을 사용하여 더 많은 고급 작업을 수행할 수 있습니다.
+ CloudTrail 로그 파일을 클라우CloudWatch Logs로 전송하여 모니터링합니다.
+ 계정 간에 로그 파일을 공유합니다.
+  AWS CloudTrail Processing Library를 사용하여 Java로 로그 처리 애플리케이션을 작성합니다.
+ 로그 파일을 검증하여 CloudTrail이 파일을 전송한 후 변경되지 않았는지 확인합니다.

계정에서 이벤트가 발생하면 CloudTrail은 이벤트가 추적 설정과 일치하는지 평가합니다. 추적 설정과 일치하는 이벤트만 Amazon S3 버킷 및 Amazon CloudWatch Logs 로그 그룹에 전달됩니다.

추적이 지정한 이벤트만 처리하고 로깅하도록 여러 추적을 다르게 구성할 수 있습니다. 예를 들어, 한 추적은 읽기 전용 데이터 이벤트 및 관리 이벤트를 로깅할 수 있게 하여 모든 읽기 전용 이벤트를 한 S3 버킷으로 전송합니다. 다른 추적은 쓰기 전용 데이터 이벤트 및 관리 이벤트만 로깅할 수 있게 하여 모든 쓰기 전용 이벤트를 별도의 S3 버킷으로 전송합니다.

또한 한 추적은 모든 관리 이벤트를 로깅하고 한 S3 버킷으로 전송하도록 구성하고 다른 추적은 모든 데이터 이벤트를 로깅하고 다른 S3 버킷으로 전송하도록 구성할 수 있습니다.

다음 사항을 로깅하도록 추적을 구성할 수 있습니다.
+ **[데이터 이벤트](logging-data-events-with-cloudtrail.md)**: 이 이벤트를 통해 리소스 상에서, 또는 리소스 내에서 수행되는 리소스 작업을 파악할 수 있습니다. 이를 데이터 플레인 작업이라고도 합니다.
+ **[관리 이벤트](logging-management-events-with-cloudtrail.md)**: 관리 이벤트는 AWS 계정의 리소스에 대해 수행되는 관리 작업에 대한 가시성을 제공합니다. 이를 컨트롤 플레인 작업이라고도 합니다. 관리 이벤트에는 귀하의 계정에서 발생한 비 API 이벤트도 포함될 수 있습니다. 예를 들어 한 사용자가 귀하의 계정에 로그인하면 CloudTrail은 `ConsoleLogin` 이벤트를 로그합니다. 자세한 내용은 [CloudTrail에 의해 캡처된 비 API 이벤트](cloudtrail-non-api-events.md) 단원을 참조하십시오.
+ **[네트워크 활동 이벤트](logging-network-events-with-cloudtrail.md)**: CloudTrail 네트워크 활동 이벤트를 사용하면 VPC 엔드포인트 소유자가 프라이빗 VPC에서 로 VPC 엔드포인트를 사용하여 수행된 AWS API 호출을 기록할 수 있습니다 AWS 서비스. 네트워크 활동 이벤트를 통해 리소스 상에서 또는 리소스 내에서 수행되는 리소스 작업을 파악할 수 있습니다.
+ **[Insights 이벤트](logging-insights-events-with-cloudtrail.md)**: Insights 이벤트는 계정에서 감지된 비정상적인 활동을 캡처합니다. Insights 이벤트를 활성화하고 CloudTrail이 비정상적인 활동을 감지한 경우, Insights 이벤트는 다른 폴더가 아니라 추적의 대상 S3 버킷에 로그됩니다. 또한 CloudTrail 콘솔에서 Insights 이벤트를 살펴볼 때 Insights 이벤트의 유형 및 인시던트 기간을 확인할 수도 있습니다. CloudTrail 추적에서 캡처된 다른 이벤트 유형과 달리, Insights 이벤트는 계정의 API 사용량 변화가 계정의 일반적인 사용 패턴과 크게 다르다는 것을 CloudTrail이 탐지한 경우에만 로그됩니다.

  관리 API에 대해서만 Insights 이벤트가 생성됩니다. 자세한 내용은 [CloudTrail Insights를 사용한 작업](logging-insights-events-with-cloudtrail.md) 단원을 참조하십시오.

**참고**  
CloudTrail은 일반적으로 API 호출 후 평균 5분 이내에 로그를 전달합니다. 이 시간은 보장되지 않습니다. 자세한 내용은 [AWS CloudTrail 서비스 수준 계약](https://aws.amazon.com/cloudtrail/sla)에서 검토하세요.  
추적을 잘못 구성한 경우(예: S3 버킷에 연결할 수 없음) CloudTrail은 30일 동안 S3 버킷에 로그 파일을 다시 전송하려고 시도하며 이러한 전송 시도 이벤트에는 표준 CloudTrail 요금이 부과됩니다. 잘못 구성된 추적에 대한 요금이 부과되지 않도록 하려면 추적을 삭제해야 합니다.

**Topics**
+ [

# 여러 리전에서 CloudTrail 로그 파일 수신
](receive-cloudtrail-log-files-from-multiple-regions.md)
+ [

# CloudTrail에서 데이터 일관성 관리
](cloudtrail-data-consistency.md)
+ [

# Amazon CloudWatch Logs로 CloudTrail 로그 파일 모니터링
](monitor-cloudtrail-log-files-with-cloudwatch-logs.md)
+ [

# 여러 계정에서 CloudTrail 로그 파일 수신
](cloudtrail-receive-logs-from-multiple-accounts.md)
+ [

# AWS 계정 간에 CloudTrail 로그 파일 공유
](cloudtrail-sharing-logs.md)
+ [

# CloudTrail 로그 파일 무결성 검증
](cloudtrail-log-file-validation-intro.md)
+ [

# CloudTrail 로그 파일의 예
](cloudtrail-log-file-examples.md)
+ [

# CloudTrail Processing Library 사용
](use-the-cloudtrail-processing-library.md)

# 여러 리전에서 CloudTrail 로그 파일 수신
여러 리전에서 CloudTrail 로그 파일 수신



다중 리전 추적을 생성하면 CloudTrail은 계정에서 활성화된 모든 리전의 이벤트를 로깅합니다. CloudTrail은 동일한 S3 버킷 및 CloudWatch Logs 로그 그룹으로 로그 파일을 전송합니다. CloudTrail이 S3 버킷에 대한 쓰기 권한이 있는 한, 다중 리전 추적용 버킷은 추적의 홈 리전에 있을 필요가 없습니다.

대부분의 AWS 리전 가 기본적으로 활성화되어 있지만 특정 리전(*옵트인 리전*이라고도 함)을 수동으로 활성화 AWS 계정해야 합니다. 기본적으로 활성화되는 리전에 대한 자세한 내용은 *AWS Account Management 참조 가이드*의 [리전을 활성화 및 비활성화하기 전 고려 사항](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html#manage-acct-regions-considerations)을 참조하세요. CloudTrail에서 지원하는 리전 목록은 [CloudTrail 지원 리전](cloudtrail-supported-regions.md) 섹션을 참조하세요.

옵트인 리전을 활성화하면 CloudTrail은 활성화한 옵트인 리전에서 각 다중 리전 추적의 동일한 사본을 생성합니다. 자세한 내용은 [옵트인 리전을 활성화하면 어떻게 되나요?](cloudtrail-multi-region-trails.md#cloudtrail-multi-region-trails-optin) 단원을 참조하십시오.

나중에 옵트인 리전을 비활성화하면 해당 리전의 다중 리전 추적 사본이 유지됩니다. 계정에 리소스 제거를 위한 AWS 서비스 의 작업과 같이 비활성화된 리전에 활동이 있을 수 있으므로 CloudTrail은 리전이 비활성화되기 전에 삭제되지 않은 추적에 대해 활동을 계속 캡처하고 S3 버킷에 이벤트를 전송하려고 시도합니다.

기존 단일 리전 추적을 다중 리전 추적으로 변환하려면 AWS CLI를 사용해야 합니다.

활성화된 모든 리전에 적용되도록 기존 추적을 변경하려면 [**update-trail**](cloudtrail-create-and-update-a-trail-by-using-the-aws-cli-update-trail.md) 명령에 `--is-multi-region-trail` 옵션을 추가합니다.

```
aws cloudtrail update-trail --name my-trail --is-multi-region-trail
```

이제 추적이 다중 리전 추적인지 확인하려면 출력의 `IsMultiRegionTrail` 요소에 `true`가 표시되는지 검증하세요.

```
{
    "IncludeGlobalServiceEvents": true, 
    "Name": "my-trail", 
    "TrailARN": "arn:aws:cloudtrail:us-east-2:123456789012:trail/my-trail", 
    "LogFileValidationEnabled": false, 
    "IsMultiRegionTrail": true, 
    "IsOrganizationTrail": false,
    "S3BucketName": "amzn-s3-demo-bucket"
}
```

자세한 정보는 다음 자료를 참조하세요.
+ [다중 리전 추적 및 옵트인 리전 이해](cloudtrail-multi-region-trails.md)
+ [에 대한 추적 생성 AWS 계정](cloudtrail-create-and-update-a-trail.md)
+  [CloudTrail FAQ](https://aws.amazon.com/cloudtrail/faqs/) 

# CloudTrail에서 데이터 일관성 관리
데이터 일관성 관리

CloudTrail은 [최종 일관성](https://en.wikipedia.org/wiki/Eventual_consistency)이라는 분산 컴퓨팅 모델을 사용합니다. 속성 기반 액세스 제어(ABAC)에 사용되는 태그를 포함하여 CloudTrail 구성(또는 기타 AWS 서비스)을 변경하는 경우 가능한 모든 엔드포인트에서 표시되는 데 시간이 걸립니다. [https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html) 일부 지연은 서버에서 서버로, 전 세계의 리전에서 리전으로 데이터를 보내는 데 걸리는 시간으로 인해 발생합니다. 또한 CloudTrail은 성능 향상을 위해 캐싱을 사용하지만, 어떤 경우에는 이로 인해 시간이 더 걸릴 수 있습니다. 이러한 변화는 이전에 캐싱된 데이터가 끝날 때까지 가시화되지 않을 수 있습니다.

 이러한 잠재적 지연을 고려하도록 애플리케이션을 설계해야 합니다. 한 위치에서 변경한 내용이 다른 위치에서 즉시 보이지 않을 때조차도 예상대로 작동하는지 확인합니다. 이러한 변경에는 [옵트인 리전 활성화](cloudtrail-multi-region-trails.md#cloudtrail-multi-region-trails-optin), 트레일 또는 이벤트 데이터 스토어 생성이나 업데이트, 이벤트 선택기 업데이트, 로깅 시작 또는 중지가 포함됩니다. 트레일 또는 이벤트 데이터 스토어를 생성하거나 업데이트하면 CloudTrail은 변경 사항이 모든 위치로 전파될 때까지 마지막으로 알려진 구성을 기반으로 S3 버킷 또는 이벤트 데이터 스토어에 로그를 전송합니다.

 이것이 다른에 미치는 영향에 대한 자세한 내용은 다음 리소스를 AWS 서비스참조하세요.
+  **Amazon DynamoDB**: *DynamoDB FAQ*의 [DynamoDB의 일관성 모델은 무엇인가요?](https://aws.amazon.com/dynamodb/faqs/) 및 *Amazon DynamoDB 개발자 안내서*의 [읽기 일관성](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadConsistency.html).
+  **Amazon EC2**: *Amazon Elastic Compute Cloud API 참조*의 [최종 일관성](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/query-api-troubleshooting.html#eventual-consistency).
+  **Amazon EMR**: *AWS Big Data 블로그*의 [Ensuring Consistency When Using Amazon S3 and Amazon Elastic MapReduce for ETL Workflows](https://aws.amazon.com/blogs/big-data/ensuring-consistency-when-using-amazon-s3-and-amazon-elastic-mapreduce-for-etl-workflows/).
+  **AWS Identity and Access Management (IAM)**: [IAM 사용 설명서에서 변경 사항을 항상 즉시 볼 수 있는 것은 아닙니다](https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_general.html#troubleshoot_general_eventual-consistency). ** 
+  **Amazon Redshift**: *Amazon Redshift 데이터베이스 개발자 안내서*의 [데이터 일관성 관리](https://docs.aws.amazon.com/redshift/latest/dg/managing-data-consistency.html) 
+  **Amazon S3**: [Amazon Simple Storage Service 사용 설명서](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html#ConsistencyModel)의 *Amazon S3 데이터 일관성 모델* 

# Amazon CloudWatch Logs로 CloudTrail 로그 파일 모니터링
Amazon CloudWatch Logs로 CloudTrail 로그 파일 모니터링

[Amazon CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html)를 사용하여 CloudTrail에서 로그 파일을 모니터링, 저장 및 액세스할 수 있습니다.

CloudWatch Logs를 사용하면 확장성 AWS 서비스 이 뛰어난 단일 서비스에서 사용하는 모든 시스템, 애플리케이션 및의 로그를 중앙 집중화할 수 있습니다. 그런 다음 로그를 쉽게 보고, 특정 오류 코드 또는 패턴이 있는지 검색하고, 특정 필드를 기반으로 필터링하거나, 향후 분석을 위해 안전하게 보관할 수 있습니다. CloudWatch Logs를 사용하면 소스와 관계없이 모든 로그를 시간순으로 정렬된 일관된 단일 이벤트 흐름으로 볼 수 있습니다.

다음 단계를 완료하여 추적 로그를 모니터링하고 특정 활동이 발생할 경우 알림을 받을 수 있도록 CloudWatch Logs에서 CloudTrail을 구성합니다.

1. CloudWatch Logs에 로그 이벤트를 전송하도록 추적을 구성합니다.

1. CloudWatch Logs 지표 필터를 정의하여 용어, 구문 또는 값에서 일치하는 항목이 있는지 로그 이벤트를 평가합니다. 예를 들어 `ConsoleLogin` 이벤트를 모니터링할 수 있습니다.

1. CloudWatch 지표를 지표 필터에 할당합니다.

1. 지정한 기간 및 임계값에 따라 트리거되는 CloudWatch 경보를 생성합니다. 경보가 트리거될 때 알림을 전송하도록 경보를 구성하여 조치를 취할 수 있도록 합니다.

1. 경보에 대한 응답으로 작업을 자동으로 수행하도록 CloudWatch를 구성할 수도 있습니다.

Amazon CloudWatch 및 Amazon CloudWatch Logs에 대한 표준 요금이 적용됩니다. 자세한 내용은 [Amazon CloudWatch 요금](https://aws.amazon.com/cloudwatch/pricing/)을 참조하세요.

CloudWatch Logs에 로그를 전송하도록 추적을 구성할 수 있는 리전에 대한 자세한 내용은 *AWS 일반 참조*의 [Amazon CloudWatch Logs 리전 및 할당량](https://docs.aws.amazon.com/general/latest/gr/cwl_region.html) 단원을 참조하세요.

**Topics**
+ [

# CloudWatch Logs에 이벤트 전송
](send-cloudtrail-events-to-cloudwatch-logs.md)
+ [

# CloudTrail 이벤트에 대한 CloudWatch 경보 생성: 예
](cloudwatch-alarms-for-cloudtrail.md)
+ [

# CloudTrail에서 CloudWatch Logs로의 이벤트 전송 중지
](stop-cloudtrail-from-sending-events-to-cloudwatch-logs.md)
+ [

# CloudTrail에 대한 CloudWatch 로그 그룹 및 로그 스트림 이름 지정
](cloudwatch-log-group-log-stream-naming-for-cloudtrail.md)
+ [

# 모니터링을 위해 CloudWatch Logs를 사용하는 CloudTrail의 역할 정책 문서
](cloudtrail-required-policy-for-cloudwatch-logs.md)

# CloudWatch Logs에 이벤트 전송


CloudWatch Logs에 이벤트를 전송하도록 추적을 구성하면 CloudTrail은 추적 설정과 일치하는 이벤트만 전송합니다. 예를 들어 데이터 이벤트만 로그하도록 추적을 구성하는 경우 추적은 CloudWatch Logs 로그 그룹에만 데이터 이벤트를 전송합니다. CloudTrail은 CloudWatch Logs로의 데이터, 인사이트 및 관리 이벤트 전송을 지원합니다. 자세한 내용은 [CloudTrail 로그 파일 작업](cloudtrail-working-with-log-files.md) 단원을 참조하십시오.

**참고**  
오직 관리 계정만이 콘솔을 사용하여 조직 추적에 대한 CloudWatch Logs 로그 그룹을 구성할 수 있습니다. 위임된 관리자는 AWS CLI 또는 CloudTrail 또는 API 작업을 사용하여 CloudWatch Logs 로그 그룹을 구성할 수 있습니다. CloudTrail `CreateTrail` `UpdateTrail` 

CloudWatch Logs 로그 그룹에 이벤트를 전송하려면 다음을 수행합니다.
+ IAM 역할을 생성하거나 지정할 수 있는 충분한 권한이 있는지 확인합니다. 자세한 내용은 [CloudTrail 콘솔에서 Amazon CloudWatch Logs 정보를 확인하고 구성할 수 있는 권한 부여](security_iam_id-based-policy-examples.md#grant-cloudwatch-permissions-for-cloudtrail-users) 단원을 참조하십시오.
+ 를 사용하여 CloudWatch Logs 로그 그룹을 구성하는 경우 지정한 로그 그룹에 CloudWatch Logs 로그 스트림을 생성하고 해당 로그 스트림에 CloudTrail 이벤트를 전달할 수 있는 충분한 권한이 있는지 AWS CLI확인합니다. 자세한 내용은 [정책 문서 생성](#send-cloudtrail-events-to-cloudwatch-logs-cli-create-policy-document) 단원을 참조하십시오.
+ 새 추적을 생성하거나 기존 추적을 지정합니다. 자세한 내용은 [콘솔을 사용하여 추적 생성 및 업데이트](cloudtrail-create-and-update-a-trail-by-using-the-console.md) 단원을 참조하세요.
+ 로그 그룹을 생성하거나 기존 로그 그룹을 지정합니다.
+ IAM 역할을 지정합니다. 조직 추적에 대한 기존 IAM 역할을 수정하는 경우 조직 추적에 대한 로깅을 허용하도록 정책을 수동으로 업데이트해야 합니다. 자세한 내용은 [이 정책 예제](#policy-cwl-org) 및 [조직에 대한 추적 생성](creating-trail-organization.md)을 참조하십시오.
+ 역할 정책을 연결하거나 기본값을 사용합니다.

**Contents**
+ [

## 콘솔을 사용하여 CloudWatch Logs 모니터링 구성
](#send-cloudtrail-events-to-cloudwatch-logs-console)
  + [

### 로그 그룹 생성 또는 기존 로그 그룹 지정
](#send-cloudtrail-events-to-cloudwatch-logs-console-create-log-group)
  + [

### IAM 역할 지정
](#send-cloudtrail-events-to-cloudwatch-logs-console-create-role)
  + [

### CloudWatch 콘솔에서 이벤트 보기
](#viewing-events-in-cloudwatch)
+ [

## 를 사용하여 CloudWatch Logs 모니터링 구성 AWS CLI
](#send-cloudtrail-events-to-cloudwatch-logs-cli)
  + [

### 로그 그룹 생성
](#send-cloudtrail-events-to-cloudwatch-logs-cli-create-log-group)
  + [

### 역할 생성
](#send-cloudtrail-events-to-cloudwatch-logs-cli-create-role)
  + [

### 정책 문서 생성
](#send-cloudtrail-events-to-cloudwatch-logs-cli-create-policy-document)
  + [

### 추적 업데이트
](#send-cloudtrail-events-to-cloudwatch-logs-cli-update-trail)
+ [

## 제한 사항
](#send-cloudtrail-events-to-cloudwatch-logs-limitations)

## 콘솔을 사용하여 CloudWatch Logs 모니터링 구성


 AWS Management Console 를 사용하여 모니터링을 위해 CloudWatch Logs로 이벤트를 전송하도록 추적을 구성할 수 있습니다.

### 로그 그룹 생성 또는 기존 로그 그룹 지정


CloudTrail은 로그 이벤트에 대한 전달 엔드포인트로 CloudWatch Logs 로그 그룹을 사용합니다. 로그 그룹을 생성하거나 기존 로그 그룹을 지정할 수 있습니다.

**로그 그룹 생성 또는 기존 로그 그룹 지정**

1. CloudWatch Logs 통합을 구성할 수 있는 충분한 권한이 있는 관리 사용자 또는 역할로 로그인해야 합니다. 자세한 내용은 [CloudTrail 콘솔에서 Amazon CloudWatch Logs 정보를 확인하고 구성할 수 있는 권한 부여](security_iam_id-based-policy-examples.md#grant-cloudwatch-permissions-for-cloudtrail-users) 단원을 참조하십시오.
**참고**  
오직 관리 계정만이 콘솔을 사용하여 조직 추적에 대한 CloudWatch Logs 로그 그룹을 구성할 수 있습니다. 위임된 관리자는 AWS CLI 또는 CloudTrail 또는 API 작업을 사용하여 CloudWatch Logs 로그 그룹을 구성할 수 있습니다. CloudTrail `CreateTrail` `UpdateTrail` 

1. [https://console.aws.amazon.com/cloudtrail/](https://console.aws.amazon.com/cloudtrail/)에서 CloudTrail 콘솔을 엽니다.

1. 추적 이름을 선택합니다. 여러 리전에 적용되는 추적을 선택하는 경우 추적이 생성된 리전으로 리디렉션됩니다. 로그 그룹을 생성하거나 추적과 동일한 리전에서 기존의 로그 그룹을 선택할 수 있습니다.
**참고**  
다중 리전 추적은에서 활성화된 모든 리전의 로그 파일을 지정한 CloudWatch Logs 로그 그룹 AWS 계정 으로 전송합니다.

1. [**CloudWatch Logs**]에서 [**편집(Edit)**]을 선택합니다.

1. **CloudWatch Logs**는 [**활성화(Enabled)**]를 선택합니다.

1. [**로그 그룹 이름(Log group name)**] 경우 [**신규(New)**]를 선택하여 새 로그 그룹을 생성하거나, [**기존(Existing)**]을 선택하여 기존 그룹을 사용합니다. [**신규(New)**]를 선택하는 경우 CloudTrail이 새 로그 그룹의 이름을 지정하거나 사용자가 이름을 입력할 수 있습니다. 이름 지정에 대한 자세한 내용은 [CloudTrail에 대한 CloudWatch 로그 그룹 및 로그 스트림 이름 지정](cloudwatch-log-group-log-stream-naming-for-cloudtrail.md) 섹션을 참조하세요.

1. [**기존(Existing)**]을 선택하는 경우 드롭다운 목록에서 로그 그룹을 선택합니다.

1. [**역할 이름(Role name)**]은 CloudWatch Logs에 로그를 전송할 수 있는 권한에 대한 새 IAM 역할을 생성하려면, [**신규(New)**]를 선택합니다. 드롭다운 목록에서 기존 IAM 역할을 선택하려면 [**기존(Existing)**]을 선택합니다. [**정책 문서(Policy document)**]를 확장하면 새 역할 또는 기존 역할의 정책 문이 표시됩니다. 이에 대한 자세한 내용은 [모니터링을 위해 CloudWatch Logs를 사용하는 CloudTrail의 역할 정책 문서](cloudtrail-required-policy-for-cloudwatch-logs.md) 단원을 참조하세요.
**참고**  
추적을 구성할 때 다른 계정에 속한 S3 버킷 및 SNS 주제를 선택할 수 있습니다. 하지만 CloudTrail이 이벤트를 CloudWatch Logs 로그 그룹에 전달하도록 하려면 현재 계정에 있는 로그 그룹을 선택해야 합니다.

1. **변경 사항 저장**을 선택합니다.

### IAM 역할 지정


CloudTrail이 로그 스트림에 이벤트를 전달하기 위해 맡을 역할을 지정할 수 있습니다.

**역할을 지정하려면**

1. 기본적으로 `CloudTrail_CloudWatchLogs_Role`이 지정됩니다. 기본 역할 정책에는 지정된 로그 그룹에 CloudWatch Logs 로그 스트림을 생성하고 이 로그 스트림에 CloudTrail 이벤트를 전달하는 데 필요한 권한이 있습니다.
**참고**  
조직 추적에 대한 로그 그룹에 이 역할을 사용하려면, 역할을 만든 후 정책을 수동으로 수정해야 합니다. 자세한 내용은 [이 정책 예제](#policy-cwl-org) 및 [조직에 대한 추적 생성](creating-trail-organization.md)을 참조하십시오.

   1. 역할을 확인하려면 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) AWS Identity and Access Management 콘솔로 이동합니다.

   1. [**Roles**]를 선택한 다음 [**CloudTrail\$1CloudWatchLogs\$1Role**]을 선택합니다.

   1. [**권한(Permissions)**] 탭에서 정책을 확장하여 그 내용을 확인합니다.

1. 다른 역할을 지정할 수 있지만, 기존 역할을 사용하여 이벤트를 CloudWatch Logs에 전송하려는 경우 기존 역할에 필요한 역할 정책을 연결해야 합니다. 자세한 내용은 [모니터링을 위해 CloudWatch Logs를 사용하는 CloudTrail의 역할 정책 문서](cloudtrail-required-policy-for-cloudwatch-logs.md) 단원을 참조하세요.



### CloudWatch 콘솔에서 이벤트 보기


CloudWatch Logs 로그 그룹에 이벤트를 전송하도록 추적을 구성한 후 CloudWatch 콘솔에서 이벤트를 확인할 수 있습니다. CloudTrail은 일반적으로 API 호출 후 평균 5분 이내에 로그 그룹에 이벤트를 전달합니다. 이 시간은 보장되지 않습니다. 자세한 내용은 [AWS CloudTrail 서비스 수준 계약](https://aws.amazon.com/cloudtrail/sla)에서 검토하세요.

**CloudWatch 콘솔에서 이벤트를 보려면**

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **로그(Logs)**, **로그 그룹(Log groups)**을 선택합니다.

1. 추적에 대해 지정한 로그 그룹을 선택합니다.

1. 확인하고자 하는 객체를 선택합니다.

1. 추적이 로깅한 이벤트의 세부 정보를 보려면 이벤트를 선택합니다.

**참고**  
CloudWatch 콘솔의 [**시간(UTC)(Time (UTC))**] 열은 이벤트가 로그 그룹에 전달된 시간을 보여 줍니다. CloudTrail에서 이벤트를 로그한 실제 시간을 보려면 `eventTime` 필드를 확인합니다.

## 를 사용하여 CloudWatch Logs 모니터링 구성 AWS CLI


를 사용하여 모니터링을 AWS CLI 위해 CloudWatch Logs로 이벤트를 보내도록 CloudTrailCloudTrail을 구성할 수 있습니다.

### 로그 그룹 생성
AWS CLI 를 사용하여 로그 그룹 생성

1. 기존 로그 그룹이 없는 경우 CloudWatch Logs `create-log-group` 명령을 사용하여 CloudWatch Logs 로그 그룹을 로그 이벤트의 전달 엔드포인트로 생성합니다.

   ```
   aws logs create-log-group --log-group-name name
   ```

   다음 예제에서는 `CloudTrail/logs`라는 로그 그룹을 생성합니다.

   ```
   aws logs create-log-group --log-group-name CloudTrail/logs
   ```

1. 로그 그룹 Amazon 리소스 이름(ARN)을 검색합니다.

   ```
   aws logs describe-log-groups
   ```

### 역할 생성


CloudTrail이 CloudWatch Logs 로그 그룹에 이벤트를 전송할 수 있게 하는 역할을 생성합니다. IAM `create-role` 명령은 두 개의 파라미터, 즉 역할 이름 및 파일 경로(JSON 형식의 역할 수임 정책 문서를 가리킴)를 사용합니다. 사용하는 정책 문서는 CloudTrail에 `AssumeRole` 권한을 부여합니다. `create-role` 명령은 필요한 권한을 가진 역할을 생성합니다.

정책 문서가 포함된 JSON 파일을 생성하려면 텍스트 편집기를 열고 `assume_role_policy_document.json` 파일에 다음 정책 콘텐츠를 저장합니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudtrail.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

------

다음 명령을 실행하여 CloudTrail에 대해 `AssumeRole` 권한이 있는 역할을 생성합니다.

```
aws iam create-role --role-name role_name --assume-role-policy-document file://<path to assume_role_policy_document>.json
```

명령이 완료되면 출력에 역할 ARN이 표시됩니다.

### 정책 문서 생성


CloudTrail에 대한 다음 역할 정책 문서를 생성합니다. 이 문서는 지정된 로그 그룹에 CloudWatch Logs 로그 스트림을 생성하고 이 로그 스트림에 CloudTrail 이벤트를 전달하는 데 필요한 권한을 CloudTrail에 부여합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AWSCloudTrailCreateLogStream2014110",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream"
            ],
            "Resource": [
                "arn:aws:logs:us-east-1:111111111111:log-group:log_group_name:log-stream:111111111111_CloudTrail_us-east-1*"
            ]
        },
        {
            "Sid": "AWSCloudTrailPutLogEvents20141101",
            "Effect": "Allow",
            "Action": [
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:us-east-1:111111111111:log-group:log_group_name:log-stream:111111111111_CloudTrail_us-east-1*"
            ]
        }
    ]
}
```

------

정책 문서를 `role-policy-document.json` 파일에 저장합니다.<a name="policy-cwl-org"></a>

조직 추적에도 사용할 수 있는 정책을 만들려면 조금 다르게 구성해야 합니다. 예를 들어, 다음 정책은 지정한 로그 그룹에서 CloudWatch Logs 로그 스트림을 생성하고 AWS 계정 111111111111의 두 추적과 ID가 AWS Organizations *o-exampleorgid*인 조직에 적용된 111111111111 계정에서 생성된 조직 추적 모두에 대해 해당 로그 스트림에 CloudTrail 이벤트를 전송하는 데 필요한 권한을 CloudTrail에 부여합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AWSCloudTrailCreateLogStream20141101",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream"
            ],
            "Resource": [
                "arn:aws:logs:us-east-2:111111111111:log-group:CloudTrail/DefaultLogGroupTest:log-stream:111111111111_CloudTrail_us-east-2*",
                "arn:aws:logs:us-east-2:111111111111:log-group:CloudTrail/DefaultLogGroupTest:log-stream:o-aa111bb222_*"
            ]
        },
        {
            "Sid": "AWSCloudTrailPutLogEvents20141101",
            "Effect": "Allow",
            "Action": [
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:us-east-2:111111111111:log-group:CloudTrail/DefaultLogGroupTest:log-stream:111111111111_CloudTrail_us-east-2*",             
                "arn:aws:logs:us-east-2:111111111111:log-group:CloudTrail/DefaultLogGroupTest:log-stream:o-aa111bb222_*"
            ]
        }
    ]
}
```

------

조직 추적에 대한 자세한 내용은 [조직에 대한 추적 생성](creating-trail-organization.md)을 참조하십시오.

다음 명령을 실행하여 정책을 역할에 적용합니다.

```
aws iam put-role-policy --role-name role_name --policy-name cloudtrail-policy --policy-document file://<path to role-policy-document>.json
```

### 추적 업데이트


CloudTrail `update-trail` 명령을 사용하여 로그 그룹 및 역할 정보로 추적을 업데이트합니다.

```
aws cloudtrail update-trail --name trail_name --cloud-watch-logs-log-group-arn log_group_arn --cloud-watch-logs-role-arn role_arn
```

 AWS CLI 명령에 대한 자세한 내용은 [AWS CloudTrail 명령줄 참조](https://docs.aws.amazon.com/cli/latest/reference/cloudtrail/)를 참조하세요.

## 제한 사항


CloudWatch Logs 및 EventBridge는 각각 [최대 256KB의 이벤트 크기를 허용](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch_limits_cwl.html)합니다. 서비스 이벤트는 대부분 최대 크기가 256KB이지만, 일부 서비스에는 여전히 더 큰 이벤트가 있습니다. CloudTrail은 이러한 이벤트를 CloudWatch Logs 또는 EventBridge에 전송하지 않습니다.

CloudTrail 이벤트 버전 1.05부터 이벤트의 최대 크기는 256KB입니다. 이는 악의적인 행위자의 악용을 방지하고 CloudWatch Logs 및 EventBridge와 같은 다른 AWS 서비스에서 이벤트를 사용할 수 있도록 하기 위한 것입니다.

# CloudTrail 이벤트에 대한 CloudWatch 경보 생성: 예


이 주제에서는 CloudTrail 이벤트에 대한 경보를 구성하는 방법(예 포함)을 설명합니다.

**Topics**
+ [

## 사전 조건
](#cloudwatch-alarms-prerequisites)
+ [

## 지표 필터 및 경보 생성
](#cloudwatch-alarms-metric-filter-alarm)
+ [

## 보안 그룹 구성 변경 예
](#cloudwatch-alarms-for-cloudtrail-security-group)
+ [

## AWS Management Console 로그인 실패 예
](#cloudwatch-alarms-for-cloudtrail-signin)
+ [

## 예: IAM 정책 변경
](#cloudwatch-alarms-for-cloudtrail-iam-policy-changes)
+ [

## CloudWatch Logs 경보에 대한 알림 구성
](#cloudtrail-configure-notifications-for-cloudwatch-logs-alarms)

## 사전 조건


이 항목에 나오는 예를 사용하기 전에 다음을 수행해야 합니다.
+ 콘솔 또는 CLI를 사용하여 추적을 생성합니다.
+ 로그 그룹을 생성합니다. 이 작업은 추적 생성의 일부로 수행할 수 있습니다. 추적 생성에 대한 자세한 내용은 [CloudTrail 콘솔을 사용하여 추적 생성](cloudtrail-create-a-trail-using-the-console-first-time.md)을 참조하세요.
+ 지정된 로그 그룹에 CloudWatch Logs 로그 스트림을 생성하고 이 로그 스트림에 CloudTrail 이벤트를 전달할 수 있는 권한을 CloudTrail에 부여하는 IAM 역할을 지정하거나 생성합니다. 기본 `CloudTrail_CloudWatchLogs_Role`은 이 작업을 자동으로 수행합니다.

자세한 내용은 [CloudWatch Logs에 이벤트 전송](send-cloudtrail-events-to-cloudwatch-logs.md) 단원을 참조하세요. 이 단원의 예는 Amazon CloudWatch Logs 콘솔에서 수행됩니다. 지표 필터 및 경보를 생성하는 방법에 대한 자세한 내용은 *Amazon CloudWatch 사용 설명서*의 [필터를 사용하여 로그 이벤트에서 지표 생성](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/MonitoringLogData.html) 및 [Amazon CloudWatch 경보 사용](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html) 단원을 참조하세요.

## 지표 필터 및 경보 생성


경보를 생성하려면 먼저, 지표 필터를 생성한 후 필터에 따라 경보를 구성해야 합니다. 절차에는 모든 예가 표시됩니다. CloudTrail 로그 이벤트의 지표 필터 및 패턴 구문에 대한 자세한 내용은 *Amazon CloudWatch Logs 사용 설명서*의 [필터 및 패턴 구문](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html)에서 JSON 관련 단원을 참조하세요.

## 보안 그룹 구성 변경 예


다음 절차를 따라 보안 그룹에서 구성 변경이 발생할 때 트리거되는 Amazon CloudWatch 경보를 생성할 수 있습니다.

### 지표 필터 생성


1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 왼쪽 탐색 창의 [**로그(Logs)**]에서 [**로그 그룹(Log groups)**]을 선택합니다.

1. 로그 그룹 목록에서 추적에 대해 생성한 로그 그룹을 선택합니다.

1. **지표 필터(Metric filters)** 또는 **작업(Actions)** 메뉴에서 **지표 필터 생성(Create metric filter)**을 선택합니다.

1. [**패턴 정의(Define pattern)**] 페이지의 [**필터 패턴 생성(Create filter pattern)**]에서 [**필터 패턴(Filter pattern)**]에 대해 다음을 입력합니다.

   ```
   { ($.eventName = AuthorizeSecurityGroupIngress) || ($.eventName = AuthorizeSecurityGroupEgress) || ($.eventName = RevokeSecurityGroupIngress) || ($.eventName = RevokeSecurityGroupEgress) || ($.eventName = CreateSecurityGroup) || ($.eventName = DeleteSecurityGroup) }
   ```

1. [**패턴 테스트(Test pattern)**]에서 기본값을 그대로 둡니다. **다음**을 선택합니다.

1. [**지표 할당(Assign metric)**] 페이지에서 [**필터 이름(Filter name)**]에 **SecurityGroupEvents**를 입력합니다.

1. [**지표 세부 정보(Metric details)**]에서 [**새로 생성(Create new)**]을 활성화한 후 [**지표 네임스페이스(Metric namespace)**]에 **CloudTrailMetrics**를 입력합니다.

1. [**Metric name(지표 이름)**]에 **SecurityGroupEventCount**를 입력합니다.

1. [**Metric Value(지표 값)**]에 **1**을 입력합니다.

1. [**기본값(Default value)**]을 비워 둡니다.

1. **다음**을 선택합니다.

1. [**검토 및 생성(Review and create)**] 페이지에서 선택 사항을 검토합니다. 필터를 생성하려면 [**지표 필터 생성(Create metric filter)**]을 선택합니다. 또는 뒤로 돌아가서 값을 변경하려면 [**편집(Edit)**]을 선택합니다.

### 경보 만들기


지표 필터를 생성하면 CloudTrail 추적 로그 그룹에 대한 CloudWatch Logs 로그 그룹 세부 정보 페이지가 열립니다. 다음 절차를 따라 경보를 생성할 수 있습니다.

1. [**지표 필터(Metric filters)**] 탭에서, [지표 필터 생성](#cloudwatch-alarms-for-cloudtrail-security-group-metric-filter)에서 생성한 지표 필터를 찾습니다. 지표 필터 확인란을 선택합니다. [**지표 필터(Metric filters)**] 표시줄에서 [**경보 생성(Create alarm)**]을 선택합니다.

1. [**지표 및 조건 지정(Specify metric and conditions)**]에 다음을 입력합니다.

   1. [**그래프(Graph)**]의 경우 경보를 생성할 때 지정한 다른 설정을 기반으로 선이 **1**로 설정됩니다.

   1. [**지표 이름(Metric name)**]의 경우 현재 지표 이름인 **SecurityGroupEventCount**를 유지합니다.

   1. [**통계(Statistic)**]의 경우 기본값인 **Sum**을 유지합니다.

   1. [**기간(Period)**]의 경우 기본값인 **5 minutes**를 유지합니다.

   1. [**조건(Conditions)**]의 [**임계값 유형(Threshold type)**]에서 [**정적(Static)**]을 선택합니다.

   1. [**metric\$1name이 다음과 같을 때마다(Whenever *metric\$1name* is**)]의 경우 [**더 큼/같음(Greater/Equal)**]을 선택합니다.

   1. 임계값에는 **1**을 입력합니다.

   1. [**추가 구성(Additional configuration)**]의 경우 기본값을 그대로 둡니다. **다음**을 선택합니다.

1. [**작업 구성(Configure actions)**] 페이지에서 [**알림(Notification)**]을 선택하고, [**상태(In alarm)**]를 선택합니다. 이는 5분 동안 1개의 변경 이벤트 임계값을 초과하고, **SecurityGroupEventCount**가 경보 상태일 때 작업이 수행됨을 나타냅니다.

   1. [**다음 SNS 주제로 알림 전송(Send a notification to the following SNS topic)**]에서 [**새 주제 생성(Create new topic)**]를 선택합니다.

   1. 새 Amazon SNS 주제의 **SecurityGroupChanges\$1CloudWatch\$1Alarms\$1Topic**을 입력합니다.

   1. [**알림을 받을 이메일 엔드포인트(Email endpoints that will receive the notification)**]에 이 경보가 발생할 경우 알림을 받을 사용자의 이메일 주소를 입력합니다. 이메일 주소는 쉼표로 구분합니다.

      각 이메일 수신자는 Amazon SNS 주제를 구독할 것인지 확인하는 이메일을 받습니다.

   1. **주제 생성**을 선택합니다.

1. 이 예에서는 다른 작업 유형을 건너뜁니다. **다음**을 선택합니다.

1. [**이름 및 설명 추가(Add name and description)**] 페이지에서 경보의 표시 이름과 설명을 입력합니다. 이 예에서는 이름에 **Security group configuration changes**를 입력하고 설명에 **Raises alarms if security group configuration changes occur**를 입력합니다. **다음**을 선택합니다.

1. [**미리 보기 및 생성(Preview and create)**] 페이지에서 선택 사항을 검토합니다. 변경하려면 [**편집(Edit)**]을 선택합니다. 또는 경보를 생성하려면 [**경보 생성(Create alarm)**]을 선택합니다.

   경보를 생성하면 CloudWatch에서 [**경보(Alarms)**] 페이지를 엽니다. 경보의 [**작업(Actions)**] 열은 SNS 주제의 모든 이메일 수신자가 SNS 알림을 구독하기를 원한다고 확인할 때까지 [**확인 보류 중(Pending confirmation)**]으로 표시됩니다.

## AWS Management Console 로그인 실패 예


다음 절차에 따라 5분 동안 AWS Management Console 3개 이상의 로그인 실패가 있을 때 트리거되는 Amazon CloudWatch 경보를 생성합니다.

### 지표 필터 생성


1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 왼쪽 탐색 창의 [**로그(Logs)**]에서 [**로그 그룹(Log groups)**]을 선택합니다.

1. 로그 그룹 목록에서 추적에 대해 생성한 로그 그룹을 선택합니다.

1. **지표 필터(Metric filters)** 또는 **작업(Actions)** 메뉴에서 **지표 필터 생성(Create metric filter)**을 선택합니다.

1. [**패턴 정의(Define pattern)**] 페이지의 [**필터 패턴 생성(Create filter pattern)**]에서 [**필터 패턴(Filter pattern)**]에 대해 다음을 입력합니다.

   ```
   { ($.eventName = ConsoleLogin) && ($.errorMessage = "Failed authentication") }
   ```

1. [**패턴 테스트(Test pattern)**]에서 기본값을 그대로 둡니다. **다음**을 선택합니다.

1. [**지표 할당(Assign metric)**] 페이지에서 [**필터 이름(Filter name)**]에 **ConsoleSignInFailures**를 입력합니다.

1. [**지표 세부 정보(Metric details)**]에서 [**새로 생성(Create new)**]을 활성화한 후 [**지표 네임스페이스(Metric namespace)**]에 **CloudTrailMetrics**를 입력합니다.

1. [**Metric name(지표 이름)**]에 **ConsoleSigninFailureCount**를 입력합니다.

1. [**Metric Value(지표 값)**]에 **1**을 입력합니다.

1. [**기본값(Default value)**]을 비워 둡니다.

1. **다음**을 선택합니다.

1. [**검토 및 생성(Review and create)**] 페이지에서 선택 사항을 검토합니다. 필터를 생성하려면 [**지표 필터 생성(Create metric filter)**]을 선택합니다. 또는 뒤로 돌아가서 값을 변경하려면 [**편집(Edit)**]을 선택합니다.

### 경보 만들기


지표 필터를 생성하면 CloudTrail 추적 로그 그룹에 대한 CloudWatch Logs 로그 그룹 세부 정보 페이지가 열립니다. 다음 절차를 따라 경보를 생성할 수 있습니다.

1. [**지표 필터(Metric filters)**] 탭에서, [지표 필터 생성](#cloudwatch-alarms-for-cloudtrail-signin-metric-filter)에서 생성한 지표 필터를 찾습니다. 지표 필터 확인란을 선택합니다. [**지표 필터(Metric filters)**] 표시줄에서 [**경보 생성(Create alarm)**]을 선택합니다.

1. [**경보 생성(Create Alarm)**] 페이지의 [**지표 및 조건 지정(Specify metric and conditions)**]에서 다음을 입력합니다.

   1. [**그래프(Graph)**]의 경우 경보를 생성할 때 지정한 다른 설정을 기반으로 선이 **3**로 설정됩니다.

   1. [**지표 이름(Metric name)**]의 경우 현재 지표 이름인 **ConsoleSigninFailureCount**를 유지합니다.

   1. [**통계(Statistic)**]의 경우 기본값인 **Sum**을 유지합니다.

   1. [**기간(Period)**]의 경우 기본값인 **5 minutes**를 유지합니다.

   1. [**조건(Conditions)**]의 [**임계값 유형(Threshold type)**]에서 [**정적(Static)**]을 선택합니다.

   1. [**metric\$1name이 다음과 같을 때마다(Whenever *metric\$1name* is**)]의 경우 [**더 큼/같음(Greater/Equal)**]을 선택합니다.

   1. 임계값에는 **3**을 입력합니다.

   1. [**추가 구성(Additional configuration)**]의 경우 기본값을 그대로 둡니다. **다음**을 선택합니다.

1. [**작업 구성(Configure actions)**] 페이지에서 [**알림(Notification)**]을 선택하고, [**상태(In alarm)**]를 선택합니다. 이는 5분 동안 3개의 변경 이벤트 임계값을 초과하고, **ConsoleSigninFailureCount**가 경보 상태일 때 작업이 수행됨을 나타냅니다.

   1. [**다음 SNS 주제로 알림 전송(Send a notification to the following SNS topic)**]에서 [**새 주제 생성(Create new topic)**]를 선택합니다.

   1. 새 Amazon SNS 주제의 **ConsoleSignInFailures\$1CloudWatch\$1Alarms\$1Topic**을 입력합니다.

   1. [**알림을 받을 이메일 엔드포인트(Email endpoints that will receive the notification)**]에 이 경보가 발생할 경우 알림을 받을 사용자의 이메일 주소를 입력합니다. 이메일 주소는 쉼표로 구분합니다.

      각 이메일 수신자는 Amazon SNS 주제를 구독할 것인지 확인하는 이메일을 받습니다.

   1. **주제 생성**을 선택합니다.

1. 이 예에서는 다른 작업 유형을 건너뜁니다. **다음**을 선택합니다.

1. [**이름 및 설명 추가(Add name and description)**] 페이지에서 경보의 표시 이름과 설명을 입력합니다. 이 예에서는 이름에 **Console sign-in failures**를 입력하고 설명에 **Raises alarms if more than 3 console sign-in failures occur in 5 minutes**를 입력합니다. **다음**을 선택합니다.

1. [**미리 보기 및 생성(Preview and create)**] 페이지에서 선택 사항을 검토합니다. 변경하려면 [**편집(Edit)**]을 선택합니다. 또는 경보를 생성하려면 [**경보 생성(Create alarm)**]을 선택합니다.

   경보를 생성하면 CloudWatch에서 [**경보(Alarms)**] 페이지를 엽니다. 경보의 [**작업(Actions)**] 열은 SNS 주제의 모든 이메일 수신자가 SNS 알림을 구독하기를 원한다고 확인할 때까지 [**확인 보류 중(Pending confirmation)**]으로 표시됩니다.

## 예: IAM 정책 변경


다음 절차를 따라 API 호출을 수행하여 IAM 정책을 변경할 때 트리거되는 Amazon CloudWatch 경보를 생성할 수 있습니다.

### 지표 필터 생성


1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 탐색 창에서 **로그**를 선택합니다.

1. 로그 그룹 목록에서 추적에 대해 생성한 로그 그룹을 선택합니다.

1. [**작업(Actions)**]을 선택한 후 [**지표 필터 생성(Create metric filter)**]을 선택합니다.

1. [**패턴 정의(Define pattern)**] 페이지의 [**필터 패턴 생성(Create filter pattern)**]에서 [**필터 패턴(Filter pattern)**]에 대해 다음을 입력합니다.

   ```
   {($.eventName=DeleteGroupPolicy)||($.eventName=DeleteRolePolicy)||($.eventName=DeleteUserPolicy)||($.eventName=PutGroupPolicy)||($.eventName=PutRolePolicy)||($.eventName=PutUserPolicy)||($.eventName=CreatePolicy)||($.eventName=DeletePolicy)||($.eventName=CreatePolicyVersion)||($.eventName=DeletePolicyVersion)||($.eventName=AttachRolePolicy)||($.eventName=DetachRolePolicy)||($.eventName=AttachUserPolicy)||($.eventName=DetachUserPolicy)||($.eventName=AttachGroupPolicy)||($.eventName=DetachGroupPolicy)}
   ```

1. [**패턴 테스트(Test pattern)**]에서 기본값을 그대로 둡니다. **다음**을 선택합니다.

1. [**지표 할당(Assign metric)**] 페이지에서 [**필터 이름(Filter name)**]에 **IAMPolicyChanges**를 입력합니다.

1. [**지표 세부 정보(Metric details)**]에서 [**새로 생성(Create new)**]을 활성화한 후 [**지표 네임스페이스(Metric namespace)**]에 **CloudTrailMetrics**를 입력합니다.

1. [**Metric name(지표 이름)**]에 **IAMPolicyEventCount**를 입력합니다.

1. [**Metric Value(지표 값)**]에 **1**을 입력합니다.

1. [**기본값(Default value)**]을 비워 둡니다.

1. **다음**을 선택합니다.

1. [**검토 및 생성(Review and create)**] 페이지에서 선택 사항을 검토합니다. 필터를 생성하려면 [**지표 필터 생성(Create metric filter)**]을 선택합니다. 또는 뒤로 돌아가서 값을 변경하려면 [**편집(Edit)**]을 선택합니다.

### 경보 만들기


지표 필터를 생성하면 CloudTrail 추적 로그 그룹에 대한 CloudWatch Logs 로그 그룹 세부 정보 페이지가 열립니다. 다음 절차를 따라 경보를 생성할 수 있습니다.

1. [**지표 필터(Metric filters)**] 탭에서, [지표 필터 생성](#cloudwatch-alarms-for-cloudtrail-iam-policy-changes-metric-filter)에서 생성한 지표 필터를 찾습니다. 지표 필터 확인란을 선택합니다. [**지표 필터(Metric filters)**] 표시줄에서 [**경보 생성(Create alarm)**]을 선택합니다.

1. [**경보 생성(Create Alarm)**] 페이지의 [**지표 및 조건 지정(Specify metric and conditions)**]에서 다음을 입력합니다.

   1. [**그래프(Graph)**]의 경우 경보를 생성할 때 지정한 다른 설정을 기반으로 선이 **1**로 설정됩니다.

   1. [**지표 이름(Metric name)**]의 경우 현재 지표 이름인 **IAMPolicyEventCount**를 유지합니다.

   1. [**통계(Statistic)**]의 경우 기본값인 **Sum**을 유지합니다.

   1. [**기간(Period)**]의 경우 기본값인 **5 minutes**를 유지합니다.

   1. [**조건(Conditions)**]의 [**임계값 유형(Threshold type)**]에서 [**정적(Static)**]을 선택합니다.

   1. [**metric\$1name이 다음과 같을 때마다(Whenever *metric\$1name* is**)]의 경우 [**더 큼/같음(Greater/Equal)**]을 선택합니다.

   1. 임계값에는 **1**을 입력합니다.

   1. [**추가 구성(Additional configuration)**]의 경우 기본값을 그대로 둡니다. **다음**을 선택합니다.

1. [**작업 구성(Configure actions)**] 페이지에서 [**알림(Notification)**]을 선택하고, [**상태(In alarm)**]를 선택합니다. 이는 5분 동안 1개의 변경 이벤트 임계값을 초과하고, **IAMPolicyEventCount**가 경보 상태일 때 작업이 수행됨을 나타냅니다.

   1. [**다음 SNS 주제로 알림 전송(Send a notification to the following SNS topic)**]에서 [**새 주제 생성(Create new topic)**]를 선택합니다.

   1. 새 Amazon SNS 주제의 **IAM\$1Policy\$1Changes\$1CloudWatch\$1Alarms\$1Topic**을 입력합니다.

   1. [**알림을 받을 이메일 엔드포인트(Email endpoints that will receive the notification)**]에 이 경보가 발생할 경우 알림을 받을 사용자의 이메일 주소를 입력합니다. 이메일 주소는 쉼표로 구분합니다.

      각 이메일 수신자는 Amazon SNS 주제를 구독할 것인지 확인하는 이메일을 받습니다.

   1. **주제 생성**을 선택합니다.

1. 이 예에서는 다른 작업 유형을 건너뜁니다. **다음**을 선택합니다.

1. [**이름 및 설명 추가(Add name and description)**] 페이지에서 경보의 표시 이름과 설명을 입력합니다. 이 예에서는 이름에 **IAM Policy Changes**를 입력하고 설명에 **Raises alarms if IAM policy changes occur**를 입력합니다. **다음**을 선택합니다.

1. [**미리 보기 및 생성(Preview and create)**] 페이지에서 선택 사항을 검토합니다. 변경하려면 [**편집(Edit)**]을 선택합니다. 또는 경보를 생성하려면 [**경보 생성(Create alarm)**]을 선택합니다.

   경보를 생성하면 CloudWatch에서 [**경보(Alarms)**] 페이지를 엽니다. 경보의 [**작업(Actions)**] 열은 SNS 주제의 모든 이메일 수신자가 SNS 알림을 구독하기를 원한다고 확인할 때까지 [**확인 보류 중(Pending confirmation)**]으로 표시됩니다.

## CloudWatch Logs 경보에 대한 알림 구성


CloudTrail에 대한 경보가 트리거될 때마다 알림을 보내도록 CloudWatch Logs를 구성할 수 있습니다. 이렇게 하면 CloudTrail 이벤트에 캡처되고 CloudWatch Logs에서 감지한 중요한 운영 이벤트에 빠르게 대응할 수 있습니다. CloudWatch는 Amazon Simple Notification Service(SNS)를 사용하여 이메일을 보냅니다. 자세한 정보는 *Amazon CloudWatch 사용 설명서*의 [Amazon SNS 알림 설정](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Notify_Users_Alarm_Changes.html#US_SetupSNS)을 참조하세요.

# CloudTrail에서 CloudWatch Logs로의 이벤트 전송 중지


Amazon CloudWatch CloudWatch Logs로 AWS CloudTrail 이벤트 전송을 중지할 수 있습니다.

## CloudWatch Logs로의 이벤트 전송 중지(콘솔)




**CloudWatch Logs로의 CloudTrail 이벤트 전송을 중지하려면**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/cloudtrail/](https://console.aws.amazon.com/cloudtrail/) CloudTrail 콘솔을 엽니다.

1. 탐색 창에서 [**Trails**]를 선택합니다.

1. CloudWatch Logs 통합을 사용 중지하려는 추적의 이름을 선택합니다.

1. [**CloudWatch Logs**]에서 [**편집(Edit)**]을 선택합니다.

1. **사용(Enabled)** 확인란의 선택을 취소합니다.

1. **변경 사항 저장**을 선택합니다.

## CloudWatch Logs로의 이벤트 전송 중지(CLI)


[**update-trail**](cloudtrail-create-and-update-a-trail-by-using-the-aws-cli-update-trail.md) 명령을 실행하여 전달 엔드포인트로서 CloudWatch Logs 로그 그룹을 제거할 수 있습니다. 다음 명령은 로그 그룹 ARN 및 CloudWatch Logs 역할 ARN의 값을 빈 값으로 대체하여 추적 구성에서 로그 그룹 및 역할을 지웁니다.

```
aws cloudtrail update-trail --name trail_name --cloud-watch-logs-log-group-arn="" --cloud-watch-logs-role-arn=""
```

# CloudTrail에 대한 CloudWatch 로그 그룹 및 로그 스트림 이름 지정


Amazon CloudWatch는 리전에 있는 다른 로그 그룹과 함께 CloudTrail 이벤트에 대해 생성한 로그 그룹을 표시합니다. 다른 것과 로그 그룹을 쉽게 구분할 수 있도록 로그 그룹 이름을 사용하는 것이 좋습니다. 예를 들어 **CloudTrail/logs**입니다.

로그 그룹의 이름을 지정할 때 다음 지침을 따릅니다.
+ 로그 그룹 이름은 AWS 계정의 리전 내에서 고유해야 합니다.
+ 로그 그룹 이름에 포함되는 문자 길이는 1\$1512자입니다.
+ 로그 그룹 이름은 a-z, A-Z, 0-9, '\$1'(밑줄), '-'(하이픈), '/'(슬래시), '.'(마침표), '\$1'(번호 기호)로 구성됩니다.

CloudTrail은 로그 그룹에 대한 로그 스트림을 생성할 때*account\$1ID*\$1CloudTrail\$1*trail\$1region* 형식에 따라 로그 스트림의 이름을 지정합니다.

**참고**  
CloudTrail 로그 볼륨이 큰 경우 로그 데이터를 로그 그룹에 전달할 수 있도록 여러 개의 로그 스트림을 만들 수 있습니다. 로그 스트림이 여러 개 있는 경우 CloudTrail은 *account\$1ID*\$1CloudTrail\$1*trail\$1region*\$1*number* 형식에 따라 각 로그 스트림의 이름을 지정합니다.

CloudWatch 로그 그룹에 대한 자세한 내용은 *Amazon CloudWatch Logs 사용 설명서*의 [로그 그룹 및 로그 스트림 작업](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html)과 *Amazon CloudWatch Logs API 참조*의 [CreateLogGroup](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateLogGroup.html) 단원을 참조하세요.

# 모니터링을 위해 CloudWatch Logs를 사용하는 CloudTrail의 역할 정책 문서


이 섹션에서는 CloudTrail 역할이 로그 이벤트를 CloudWatch Logs에 전송하는 데 필요한 권한 정책을 설명합니다. [CloudWatch Logs에 이벤트 전송](send-cloudtrail-events-to-cloudwatch-logs.md)에 설명된 대로 이벤트를 전송하도록 CloudTrail을 구성할 때 역할에 정책 문서를 연결할 수 있습니다. 또한 IAM을 사용하여 역할을 생성할 수도 있습니다. 자세한 내용은 [AWS 서비스에 권한을 위임할 역할 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html) 또는 [IAM 역할 생성(AWS CLI)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html#roles-creatingrole-user-cli)을 참조하세요.

다음 정책 문서 예에는 지정된 로그 그룹에 CloudWatch 로그 스트림을 생성하고 미국 동부(오하이오) 리전의 해당 로그 스트림에 CloudTrail 이벤트를 전달하는 데 필요한 권한이 포함되어 있습니다. (이는 기본 IAM 역할 `CloudTrail_CloudWatchLogs_Role`에 대한 기본 정책입니다.)

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AWSCloudTrailCreateLogStream2014110",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream"
            ],
            "Resource": [
                "arn:aws:logs:us-east-2:111122223333:log-group:log_group_name:log-stream:CloudTrail_log_stream_name_prefix*"
            ]
        },
        {
            "Sid": "AWSCloudTrailPutLogEvents20141101",
            "Effect": "Allow",
            "Action": [
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:us-east-2:111122223333:log-group:log_group_name:log-stream:CloudTrail_log_stream_name_prefix*"
            ]
        }
    ]
}
```

------

조직 추적에도 사용할 수 있는 정책을 만들려는 경우, 역할에 대해 생성된 기본 정책에서 수정해야 합니다. 예를 들어 다음 정책은 CloudTrail*\$1group\$1name* 값으로 지정한 로그 그룹에서 CloudWatch Logs 로그 스트림을 생성하고, AWS 계정 111111111111의 두 추적과 ID가 *o-exampleorgid*인 AWS Organizations 조직에 적용된 111111111111 계정에서 생성된 조직 추적 모두에 대해 해당 로그 스트림에 CloudTrail 이벤트를 전송하는 데 필요한 권한을 CloudTrail에 부여합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AWSCloudTrailCreateLogStream20141101",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream"
            ],
            "Resource": [
                "arn:aws:logs:us-east-2:111111111111:log-group:log_group_name:log-stream:111111111111_CloudTrail_us-east-2*",
                "arn:aws:logs:us-east-2:111111111111:log-group:log_group_name:log-stream:o-exampleorgid_*"
            ]
        },
        {
            "Sid": "AWSCloudTrailPutLogEvents20141101",
            "Effect": "Allow",
            "Action": [
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:us-east-2:111111111111:log-group:log_group_name:log-stream:111111111111_CloudTrail_us-east-2*",
                "arn:aws:logs:us-east-2:111111111111:log-group:log_group_name:log-stream:o-exampleorgid_*"
            ]
        }
    ]
}
```

------

조직 추적에 대한 자세한 내용은 [조직에 대한 추적 생성](creating-trail-organization.md)을 참조하십시오.

# 여러 계정에서 CloudTrail 로그 파일 수신
여러 계정에서 CloudTrail 로그 파일 수신

CloudTrail이 여러의 로그 파일을 단일 Amazon S3 버킷 AWS 계정 으로 전송하도록 할 수 있습니다. 예를 들어 계정 IDs가 111111111111, , 333333333333 및 444444444444 AWS 계정 인 2222222222224개가 있고 이러한 4개 계정 모두의 로그 파일을 계정 111111111111에 속한 버킷으로 전송하도록 CloudTrail을 구성하려고 합니다. 이를 달성하려면 다음 단계를 순서대로 완료하십시오.

1. 대상 버킷이 속할 계정에서 추적을 생성합니다(이 예에서는 111111111111). 다른 계정에서는 아직 추적을 생성하지 않습니다.

   지침은 [콘솔로 추적 생성](cloudtrail-create-a-trail-using-the-console-first-time.md#creating-a-trail-in-the-console) 단원을 참조하세요.

1. CloudTrail에 상호 계정 권한을 허용하기 위해 대상 버킷에서 버킷 정책을 업데이트합니다.

   지침은 [여러 계정에 대한 버킷 정책 설정](cloudtrail-set-bucket-policy-for-multiple-accounts.md) 단원을 참조하세요.

1. 활동을 로깅하고자 하는 다른 계정(이 예에서는 222222222222, 333333333333, 444444444444)에서 추적을 생성합니다. 각 계정에서 추적을 생성할 때, 1단계에서 지정한 계정에 속하는 Amazon S3 버킷을 지정합니다(이 예에서는 111111111111). 지침은 [추가 계정에서 추적 생성](turn-on-cloudtrail-in-additional-accounts.md) 섹션을 참조하세요.
**참고**  
SSE-KMS 암호화를 활성화하려는 경우 KMS 키 정책은 CloudTrail에서 키를 사용하여 로그 파일 및 다이제스트 파일을 암호화하고 지정한 사용자가 암호화되지 않은 양식으로 로그 파일 또는 다이제스트 파일을 읽을 수 있도록 허용해야 합니다. 키 정책의 수동 편집에 대한 자세한 내용은 [CloudTrail에 대한 AWS KMS 키 정책 구성](create-kms-key-policy-for-cloudtrail.md)을 참조하세요.

## 다른 계정에서 호출한 데이터 이벤트에 대한 버킷 소유자 계정 ID 수정


과거에는 Amazon S3 데이터 이벤트 API 호출 AWS 계정 자의에서 CloudTrail 데이터 이벤트가 활성화된 경우 CloudTrail은 데이터 이벤트(예: )에서 S3 버킷 소유자의 계정 ID를 표시했습니다`PutObject`. 버킷 소유자 계정에 S3 데이터 이벤트가 활성화되어 있지 않은 경우에도 이 문제가 발생했습니다.

이제 다음 조건이 모두 충족되는 경우 CloudTrail에서 `resources` 블록의 S3 버킷 소유자 계정 ID를 제거합니다.
+ 데이터 이벤트 API 호출은 Amazon S3 버킷 소유자 AWS 계정 와 다른에서 발생합니다.
+ API 호출자는 호출자 계정에만 해당되는 `AccessDenied` 오류를 수신했습니다.

API 호출이 이루어진 리소스의 소유자는 여전히 전체 이벤트를 수신합니다.

다음 이벤트 레코드 코드 조각은 예상되는 동작의 예시입니다. `Historic` 코드 조각에서 S3 버킷 소유자의 계정 ID 123456789012는 다른 계정의 API 호출자에게 표시됩니다. 현재 동작의 예시에서 버킷 소유자의 계정 ID는 표시되지 않습니다.

```
# Historic

"resources": [
    {
        "type": "AWS::S3::Object",
        "ARNPrefix": "arn:aws:s3:::amzn-s3-demo-bucket2/"
    },
    {
        "accountId": "123456789012",
        "type": "AWS::S3::Bucket",
        "ARN": "arn:aws:s3:::amzn-s3-demo-bucket2"
    }
]
```

다음은 현재 동작입니다.

```
# Current

"resources": [
    {
        "type": "AWS::S3::Object",
        "ARNPrefix": "arn:aws:s3:::amzn-s3-demo-bucket2/"
    },
    {
        "accountId": "",
        "type": "AWS::S3::Bucket",
        "ARN": "arn:aws:s3:::amzn-s3-demo-bucket2"
    }
]
```

**Topics**
+ [

## 다른 계정에서 호출한 데이터 이벤트에 대한 버킷 소유자 계정 ID 수정
](#cloudtrail-receive-logs-s3-owner-id-redaction)
+ [

# 여러 계정에 대한 버킷 정책 설정
](cloudtrail-set-bucket-policy-for-multiple-accounts.md)
+ [

# 추가 계정에서 추적 생성
](turn-on-cloudtrail-in-additional-accounts.md)

# 여러 계정에 대한 버킷 정책 설정
여러 계정에 대한 버킷 정책 설정

여러 계정에서 로그 파일을 받는 버킷의 경우 버킷 정책이 지정된 모든 계정에서 로그 파일을 기록할 수 있도록 CloudTrail 권한을 허용해야 합니다. 즉, 대상 버킷에서 버킷 정책을 수정해야 지정된 각 계정에서 로그 파일을 기록할 CloudTrail 권한이 허용됩니다.

**참고**  
보안상의 이유로 권한이 없는 사용자는 `S3KeyPrefix` 파라미터로 `AWSLogs/`를 포함하는 추적을 만들 수 없습니다.

**여러 계정에서 파일을 받을 수 있도록 버킷 권한을 수정하려면**

1.  이 예제에서 버킷(111111111111)을 소유한 계정을 AWS Management Console 사용하여에 로그인하고 Amazon S3 콘솔을 엽니다.

1. CloudTrail이 로그 파일을 전송하는 버킷을 선택한 다음, **권한(Permissions)**을 선택합니다.

1. **버킷 정책(Bucket policy)**에서 **편집(Edit)**을 선택합니다.

1. 이 버킷으로 로그 파일을 전송할 각 추가 계정에 대해 줄을 추가하도록 기존 정책을 수정합니다. 다음의 정책에 대한 예를 참조하고 두 번째 계정 ID를 지정하는 밑줄 친 `Resource` 줄에 유의합니다. 보안 모범 사례로`aws:SourceArn`Amazon S3 버킷 정책의 조건 키입니다. 이렇게 하면 S3 버킷에 대한 무단 액세스를 방지할 수 있습니다. 기존 트레일이 있는 경우 하나 이상의 조건 키를 추가해야 합니다.
**참고**  
 AWS 계정 ID는 앞에 0을 포함하여 12자리 숫자입니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "AWSCloudTrailAclCheck20131101",
               "Effect": "Allow",
               "Principal": {
                   "Service": "cloudtrail.amazonaws.com"
               },
               "Action": "s3:GetBucketAcl",
               "Resource": "arn:aws:s3:::amzn-s3-demo-bucket",
               "Condition": {
                   "StringEquals": {
                       "aws:SourceArn": [
                           "arn:aws:cloudtrail:region:111111111111:trail/primaryTrailName",
                           "arn:aws:cloudtrail:region:222222222222:trail/secondaryTrailName"
                       ]
                   }
               }
           },
           {
               "Sid": "AWSCloudTrailWrite20131101",
               "Effect": "Allow",
               "Principal": {
                   "Service": "cloudtrail.amazonaws.com"
               },
               "Action": "s3:PutObject",
               "Resource": [
                   "arn:aws:s3:::amzn-s3-demo-bucket/optionalLogFilePrefix/AWSLogs/111111111111/*",
                   "arn:aws:s3:::amzn-s3-demo-bucket/optionalLogFilePrefix/AWSLogs/222222222222/*"
               ],
               "Condition": {
                   "StringEquals": {
                       "aws:SourceArn": [
                           "arn:aws:cloudtrail:region:111111111111:trail/primaryTrailName",
                           "arn:aws:cloudtrail:region:222222222222:trail/secondaryTrailName"
                       ],
                       "s3:x-amz-acl": "bucket-owner-full-control"
                   }
               }
           }
       ]
   }
   ```

------

# 추가 계정에서 추적 생성
추가 계정에서 추적 생성

콘솔 또는를 사용하여 추가에서 추적 AWS CLI 을 생성하고 해당 로그 파일을 하나의 Amazon S3 버킷에 AWS 계정 집계할 수 있습니다. 또는 조직 추적을 생성하여 조직의 일부 AWS 계정 인 모든를 기록할 수 있습니다 AWS Organizations. 자세한 내용은 [조직에 대한 추적 생성](creating-trail-organization.md) 단원을 참조하십시오.

## 콘솔을 사용하여 추가 AWS 계정에서 추적 생성
콘솔을 사용하여 추가 계정에서 추적 생성

CloudTrail 콘솔을 사용하여 추가 계정에서 추적을 생성할 수 있습니다.

1. 추적 AWS Management Console 을 생성하려는 계정으로에 로그인합니다. [콘솔로 추적 생성](cloudtrail-create-a-trail-using-the-console-first-time.md#creating-a-trail-in-the-console)에서 단계에 따라 콘솔을 사용하여 추적을 생성합니다.

1. **스토리지 위치**(Storage location)의 경우 **기존 S3 버킷 사용**(Use existing S3 bucket)을 선택합니다. 여러 계정에 걸쳐 로그 파일을 저장할 기존 버킷의 이름을 텍스트 상자에 입력합니다.
**참고**  
버킷 정책은 쓰기 권한을 CloudTrail에 부여해야 합니다. 버킷 정책의 수동 편집에 대한 자세한 내용은 [여러 계정에 대한 버킷 정책 설정](cloudtrail-set-bucket-policy-for-multiple-accounts.md) 단원을 참조하세요.  
![\[기존 S3 버킷 사용\]](http://docs.aws.amazon.com/ko_kr/awscloudtrail/latest/userguide/images/cloudtrail-use-existing-bucket.png)

1. **Prefix(접두사)**는 여러 계정에 걸쳐 로그 파일을 저장하는 데 사용할 접두사를 입력합니다. 버킷 정책에서 지정한 접두사와 다른 접두사를 사용할 경우, CloudTrail에서 이 새로운 접두사를 사용하여 버킷에 로그 파일을 작성할 수 있도록 대상 버킷에서 버킷 정책을 편집해야 합니다.

## CLI를 사용하여 추가 AWS 계정에서 추적 생성
CLI를 사용하여 추가 계정에서 CloudTrail 활성화

 AWS 명령줄 도구를 사용하여 추가 계정에 추적을 생성하고 해당 로그 파일을 하나의 Amazon S3 버킷에 집계할 수 있습니다. 이러한 도구에 대한 자세한 내용은 *AWS CLI 명령 참조*의 [cloudtrail](https://docs.aws.amazon.com/cli/latest/reference/cloudtrail/)을 참조하세요.

**create-trail** 명령을 사용하여 다음을 지정하고 추적을 생성합니다.
+ `--name`은 추적의 이름을 지정합니다.
+ `--s3-bucket-name`은 여러 계정에 걸쳐 로그를 저장할 Amazon S3 버킷을 지정합니다.
+ `--s3-prefix`는 로그 파일 전송 경로에 대한 접두사를 지정합니다(선택 사항).
+ `--is-multi-region-trail`는이 추적이 작업 중인 파티션의 모든 AWS 리전에서 이벤트를 로깅하도록 지정합니다.

계정이 AWS 리소스를 실행 중인 각 리전에 대해 하나의 추적을 생성할 수 있습니다.

다음의 예제 명령은 AWS CLI를 사용하여 추가 계정에 대해 추적을 생성하는 방법을 보여 줍니다. 이러한 계정에 대한 로그 파일이 첫 번째 계정(이 예에서는 111111111111)에 생성한 버킷으로 전송되도록 하려면 `--s3-bucket-name` 옵션에 해당 버킷의 이름을 지정합니다. Amazon S3 버킷 이름은 전역적으로 고유합니다.

```
aws cloudtrail create-trail --name my-trail --s3-bucket-name amzn-s3-demo-bucket --is-multi-region-trail
```

명령을 실행하면 다음과 비슷한 출력 화면이 나타납니다.

```
{
    "IncludeGlobalServiceEvents": true, 
    "Name": "AWSCloudTrailExample", 
    "TrailARN": "arn:aws:cloudtrail:us-east-2:222222222222:trail/my-trail", 
    "LogFileValidationEnabled": false, 
    "IsMultiRegionTrail": true, 
    "IsOrganizationTrail": false,
    "S3BucketName": "amzn-s3-demo-bucket"
}
```

 AWS 명령줄 도구에서 CloudTrail을 사용하는 방법에 대한 자세한 내용은 [CloudTrail 명령줄 참조](https://docs.aws.amazon.com/cli/latest/reference/cloudtrail/index.html)를 참조하세요.

# AWS 계정 간에 CloudTrail 로그 파일 공유


이 섹션에서는 여러 AWS 계정 간에 CloudTrail 로그 파일을 공유하는 방법을 설명합니다. 로그를 공유하는 데 사용하는 접근 방식은 S3 버킷의 구성에 AWS 계정 따라 다릅니다. 로그 파일 공유 옵션은 다음과 같습니다.
+ **[버킷 소유자 적용](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-ownership-existing-bucket.html)** – [S3 객체 소유권](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html)은 버킷에 업로드되는 객체의 소유권을 제어하고 액세스 제어 목록(ACL)을 비활성화 또는 활성화하는 데 사용할 수 있는 Amazon S3 버킷 수준 설정입니다. 기본적으로 객체 소유권은 **버킷 소유자 적용** 설정으로 설정되며 모든 ACL이 비활성화되어 있습니다. ACL이 비활성화되면 버킷 소유자는 버킷의 모든 객체를 소유하고 액세스 관리 정책을 사용하여 데이터에 대한 액세스를 독점적으로 관리합니다. **버킷 소유자 적용** 옵션이 설정되면 버킷 정책을 통해 액세스가 관리되므로 사용자가 역할을 수임할 필요가 없습니다.
+ **[로그 파일 공유를 위한 역할 수임](#cloudtrail-sharing-logs-assumerole)** – **버킷 소유자 적용** 설정을 선택하지 않은 경우 사용자는 S3 버킷의 로그 파일에 액세스하기 위한 역할을 수임해야 합니다.

## 역할을 수임하여 계정 간에 로그 파일 공유


**참고**  
이 섹션은 **버킷 소유자 적용** 설정을 사용하지 않는 Amazon S3 버킷에만 적용됩니다.

이 섹션에서는 역할을 수임 AWS 계정 하여 여러 간에 CloudTrail 로그 파일을 공유하는 방법과 로그 파일 공유 시나리오를 설명합니다.
+ **시나리오 1**: Amazon S3 버킷에 배치된 로그 파일을 생성한 계정에 읽기 전용 액세스 권한을 부여합니다.
+ **시나리오 2**: 로그 파일을 분석할 수 있는 타사 계정에 Amazon S3 버킷의 모든 로그 파일에 대한 액세스 권한을 부여합니다.

**Amazon S3 버킷의 로그 파일에 대한 읽기 전용 액세스 권한 부여**

1. 로그 파일을 공유할 각 계정에 대해 [IAM 역할을 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)합니다. 권한을 부여하려면 관리자여야 합니다.

   역할을 생성할 때 다음 작업을 수행합니다.
   + **다른 AWS 계정** 옵션을 선택합니다.
   + 액세스 권한을 부여할 계정의 12자리 계정 ID를 입력합니다.
   + 사용자가 멀티 팩터 인증을 제공해야 역할을 수임할 수 있도록 하려면 [**Require MFA**] 확인란을 선택합니다.
   + **AmazonS3ReadOnlyAccess** 정책을 선택합니다.
**참고**  
기본적으로 **AmazonS3ReadOnlyAccess** 정책은 계정 내의 모든 Amazon S3 버킷에 대한 검색 및 나열 권한을 부여합니다.

   IAM 역할의 권한 관리에 대한 자세한 내용은 IAM 사용 설명서의 [IAM 역할](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)을 참조하세요.

1. 로그 파일을 공유할 계정에 읽기 전용 액세스 권한을 부여하는 [액세스 정책을 생성](#cloudtrail-sharing-logs-your-accounts)합니다.

1. 각 계정에 로그 파일을 검색하는 [역할을 수임](#cloudtrail-sharing-logs-assume-role)하도록 지시합니다.

**타사 계정으로 로그 파일에 대한 읽기 전용 액세스 권한 부여**

1. 로그 파일을 공유할 타사 계정에 대해 [IAM 역할을 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)합니다. 권한을 부여하려면 관리자여야 합니다.

   역할을 생성할 때 다음 작업을 수행합니다.
   + **다른 AWS 계정** 옵션을 선택합니다.
   + 액세스 권한을 부여할 계정의 12자리 계정 ID를 입력합니다.
   + 누가 역할을 수임할 수 있는지에 대한 추가 제어를 제공하는 외부 ID를 입력합니다. 자세한 내용은 *IAM 사용 설명서*의 [AWS 리소스에 대한 액세스 권한을 타사에 부여할 때 외부 ID를 사용하는 방법을 참조하세요](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html).
   + **AmazonS3ReadOnlyAccess** 정책을 선택합니다.
**참고**  
기본적으로 **AmazonS3ReadOnlyAccess** 정책은 계정 내의 모든 Amazon S3 버킷에 대한 검색 및 나열 권한을 부여합니다.

1. 로그 파일을 공유할 타사 계정에 읽기 전용 액세스 권한을 부여하는 [액세스 정책을 생성](#cloudtrail-sharing-logs-third-party)합니다.

1. 타사 계정에 로그 파일을 검색하는 [역할을 수임](#cloudtrail-sharing-logs-assume-role)하도록 지시합니다.

다음 섹션에서는 이 단계에 대해 더욱 자세히 살펴보겠습니다.

**Topics**
+ [

### 소유한 계정에 액세스 권한을 부여하는 액세스 정책 생성
](#cloudtrail-sharing-logs-your-accounts)
+ [

### 서드 파티에 액세스 권한을 부여하는 액세스 정책 생성
](#cloudtrail-sharing-logs-third-party)
+ [

### 역할 수임
](#cloudtrail-sharing-logs-assume-role)
+ [

### AWS 계정 간 CloudTrail 로그 파일 공유 중지
](#cloudtrail-sharing-logs-stop-sharing)

### 소유한 계정에 액세스 권한을 부여하는 액세스 정책 생성


Amazon S3 버킷 소유자는 CloudTrail에서 다른 계정에 대한 로그 파일을 작성하는 Amazon S3 버킷을 완전히 제어할 수 있습니다. 각 사업부의 로그 파일을 해당 파일을 생성한 사업부와 다시 공유하려고 합니다. 그러나 한 부문에서 다른 부분의 로그 파일을 읽지 않으려고 합니다.

예를 들어 계정 B의 로그 파일을 계정 B와 공유하지만 계정 C와는 공유하지 않으려면 계정 B가 신뢰할 수 있는 계정임을 지정하는 새 IAM 역할을 생성해야 합니다. 이 역할 신뢰 정책은 계정 B가 계정 A에 의해 생성된 역할을 수임할 수 있도록 신뢰받고 있음을 지정하며, 다음 예와 같아야 합니다. 콘솔을 사용하여 역할을 생성하면 신뢰 정책이 자동으로 생성됩니다. SDK를 사용하여 역할을 생성하면 `CreateRole` API에 신뢰 정책을 파라미터로 제공해야 합니다. CLI를 사용하여 역할을 생성하면 `create-role` CLI 명령에 신뢰 정책을 지정해야 합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

------

또한 B가 해당 로그 파일을 작성한 위치에서만 계정 B를 읽을 수 있음을 지정하는 액세스 정책을 생성해야 합니다. 액세스 정책은 다음과 같습니다. **리소스** ARN에는 계정 B의 12자리 계정 ID와 집계 프로세스 중 계정 B에 대해 CloudTrail을 활성화할 때 지정한 접두사(있는 경우)가 포함된다는 점에 유의하세요. 접두사 지정에 대한 자세한 내용은 [추가 계정에서 추적 생성](turn-on-cloudtrail-in-additional-accounts.md) 단원을 참조하세요.

**중요**  
액세스 정책의 접두사는 계정 B에 대해 CloudTrail을 활성화할 때 지정한 접두사와 정확하게 동일해야 합니다. 동일하지 않은 경우 계정 B에 대한 실제 접두사를 포함하도록 계정 A의 IAM 역할 액세스 정책을 편집해야 합니다. 역할 액세스 정책의 접두사가 계정 B에서 CloudTrail을 활성화할 때 지정한 접두사와 정확하게 동일하지 않으면 계정 B는 해당 로그 파일에 액세스할 수 없습니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:Get*",
        "s3:List*"
      ],
      "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/prefix/AWSLogs/account-B-id/*"
    }, 
    {
      "Effect": "Allow",
      "Action": [
        "s3:Get*",
        "s3:List*"
      ],
      "Resource": "arn:aws:s3:::amzn-s3-demo-bucket"
    }
  ]
}
```

------

추가 계정에 대해 이전 프로세스를 사용합니다.

각 계정에 대한 역할을 생성하고 적절한 신뢰 및 액세스 정책을 지정한 후 해당 계정의 관리자가 각 계정의 IAM 사용자에게 액세스 권한을 부여하면, 계정 B 또는 C의 IAM 사용자는 프로그래밍 방식으로 역할을 맡을 수 있습니다.

자세한 내용은 [역할 수임](#cloudtrail-sharing-logs-assume-role) 단원을 참조하십시오.

### 서드 파티에 액세스 권한을 부여하는 액세스 정책 생성


타사 계정에 대해 별도의 IAM 역할을 생성해야 합니다. 역할을 생성하면 AWS 는 계정 Z가 역할 수임이 가능한 신뢰할 수 있는 타사 계정임을 지정하는 신뢰 관계를 자동으로 생성합니다. 역할에 대한 액세스 정책은 계정 Z가 수행할 수 있는 작업을 지정합니다. IAM 역할 생성에 대한 자세한 내용은 [IAM 역할 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)을 참조하세요.

예를 들어에서 생성된 신뢰 관계는 타사 계정(이 예제에서는 계정 Z)이 사용자가 생성한 역할을 수임하도록 신뢰하도록 AWS 지정합니다. 다음은 신뢰 정책 예시입니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

------

타사 계정에 대한 역할을 생성할 때 외부 ID를 지정하면 액세스 정책에는 계정 Z에 의해 할당된 고유 ID를 테스트하는 추가된 `Condition` 요소가 포함됩니다. 테스트는 역할이 수임될 때 수행됩니다. 다음 예의 액세스 정책에는 `Condition` 요소가 있습니다.

자세한 내용은 *IAM 사용 설명서*의 [AWS 리소스에 대한 액세스 권한을 타사에 부여할 때 외부 ID를 사용하는 방법을 참조하세요](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html).

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
        "Sid": "",
        "Effect": "Allow",
        "Principal": {"AWS": "arn:aws:iam::111111111111:root"},
        "Action": "sts:AssumeRole",
        "Condition": {"StringEquals": {"sts:ExternalId": "external-ID-issued-by-account-Z"}}
    }]
}
```

------

또한 계정의 액세스 정책도 생성하여 타사 계정이 Amazon S3 버킷의 모든 로그를 읽을 수 있도록 지정해야 합니다. 액세스 정책은 다음 예와 같아야 합니다. `Resource` 값의 끝에 있는 와일드카드(\$1)는 타사 계정이 액세스 권한이 부여된 S3 버킷의 모든 로그 파일에 액세스할 수 있음을 나타냅니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket"
        }
    ]
}
```

------

타사 계정에 대한 역할을 생성하고 적절한 신뢰 관계 및 액세스 정책을 지정하면, 타사 계정의 IAM 사용자는 버킷의 로그 파일을 읽을 수 있도록 프로그래밍 방식으로 역할을 맡아야 합니다. 자세한 내용은 [역할 수임](#cloudtrail-sharing-logs-assume-role) 단원을 참조하십시오.

### 역할 수임


각 계정에서 생성한 각 역할을 맡은 별도의 IAM 사용자를 지정해야 합니다. 그런 다음 각 IAM 사용자에게 적절한 권한이 있는지 확인해야 합니다.

#### IAM 사용자 및 역할


필요한 역할과 정책을 생성한 후에는 파일을 공유하려는 각 계정에서 IAM 사용자를 지정해야 합니다. 각 IAM 사용자는 로그 파일에 액세스하기 위해 프로그래밍 방식으로 적절한 역할을 수임합니다. 사용자가 역할을 맡으면 AWS 는 해당 사용자에게 임시 보안 인증을 반환합니다. 그러고 나서 역할과 관련된 액세스 정책에서 부여한 권한에 따라 로그 파일을 나열, 검색, 복사 또는 삭제하도록 요청할 수 있습니다.

다양한 IAM 자격 증명 작업에 대한 자세한 내용은 [IAM 자격 증명(사용자, 사용자 그룹 및 역할)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html) 섹션을 참조하세요.

주요 차이점은 각 시나리오에서 각 IAM 역할에 대해 생성하는 액세스 정책에 있습니다.
+ 시나리오 1에서 액세스 정책은 각 계정이 해당 계정의 로그 파일만 읽을 수 있도록 제한합니다. 자세한 내용은 [소유한 계정에 액세스 권한을 부여하는 액세스 정책 생성](#cloudtrail-sharing-logs-your-accounts) 단원을 참조하십시오.
+ 시나리오 2에서 액세스 정책은 타사 계정이 Amazon S3 버킷에 집계된 모든 로그 파일을 읽을 수 있도록 허용합니다. 자세한 내용은 [서드 파티에 액세스 권한을 부여하는 액세스 정책 생성](#cloudtrail-sharing-logs-third-party) 단원을 참조하십시오.

#### IAM 사용자에 대한 권한 정책 생성


역할에서 허용하는 작업을 수행하려면 IAM 사용자에게 API를 호출 AWS STS [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)할 권한이 있어야 합니다. 따라서 각 IAM 사용자의 정책을 편집하여 각 사용자에게 적절한 권한을 부여해야 합니다. 이를 위해, IAM 사용자에게 연결된 정책에서 **Resource**(리소스) 요소를 설정합니다. 다음 예에서는 다른 계정의 IAM 사용자에 대한 정책을 보여줍니다. 이 정책을 통해 사용자는 앞서 계정 A가 생성한 `Test`라는 역할을 수임할 수 있습니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRole"
            ],
            "Resource": "arn:aws:iam::111122223333:role/Test"
        }
    ]
}
```

------

**고객 관리형 정책을 편집하려면(콘솔)**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) IAM 콘솔을 엽니다.

1. 탐색 창에서 **Policies**를 선택합니다.

1. 정책 목록에서 편집할 정책 이름을 선택합니다. 검색 상자를 사용하여 정책 목록을 필터링할 수 있습니다.

1. **권한** 탭을 선택한 다음 **편집**을 선택합니다.

1. 다음 중 하나를 수행하세요.
   + **시각적** 편집기 옵션을 선택하면 JSON 구문을 이해하지 않아도 정책을 변경할 수 있습니다. 정책의 각 권한 블록에 대한 서비스, 작업, 리소스 또는 조건(선택 사항)을 변경할 수 있습니다. 정책을 가져와 추가 권한을 정책 하단에 추가할 수도 있습니다. 변경이 완료되면 **다음**을 선택하여 계속 진행합니다.
   + **JSON** 옵션을 선택하고 JSON 텍스트 상자에 입력하거나 붙여 넣어 정책을 수정합니다. 정책을 가져와 추가 권한을 정책 하단에 추가할 수도 있습니다. [정책 검증](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_policy-validator.html) 중에 생성되는 모든 보안 경고, 오류 또는 일반 경고를 해결하고 **다음**을 선택합니다.
**참고**  
언제든지 **시각적** 편집기 옵션과 **JSON** 편집기 옵션을 서로 전환할 수 있습니다. 그러나 변경을 적용하거나 **시각적** 편집기에서 **다음**을 선택한 경우 IAM은 시각적 편집기에 최적화되도록 정책을 재구성할 수 있습니다. 자세한 내용은 *IAM 사용자 안내서*의 [정책 재구성](https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_policies.html#troubleshoot_viseditor-restructure)을 참조하세요.

1. **검토 및 저장** 페이지에서 **이 정책에 정의된 권한**을 검토한 다음 **변경 사항 저장**을 선택하여 작업을 저장합니다.

1. 관리형 정책 버전이 이미 최댓값인 5개가 있을 경우 **변경 사항 저장**을 선택하면 대화 상자가 나타납니다. 새 버전을 저장하려면 기본이 아닌 가장 오래된 버전의 정책이 제거되고 새 버전으로 교체됩니다. 옵션으로 새로운 버전을 기본 정책 버전으로 설정할 수도 있습니다.

   **변경 사항 저장**을 선택하여 새 정책 버전을 저장합니다.

#### AssumeRole 호출


사용자는 AWS STS [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API를 호출하고 역할 세션 이름, 수임할 역할의 Amazon 리소스 번호(ARN) 및 선택적 외부 ID를 전달하는 애플리케이션을 생성하여 역할을 수임할 수 있습니다. 역할 세션 이름은 수임할 역할을 생성한 계정에 의해 정의됩니다. 외부 ID(있는 경우)는 타사 계정이 정의하며 역할 생성 중 포함할 수 있도록 소유 계정에 전달됩니다. 자세한 내용은 *IAM 사용 설명서*의 [AWS 리소스에 대한 액세스 권한을 타사에 부여할 때 외부 ID를 사용하는 방법을 참조하세요](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html). IAM 콘솔을 열어서 계정 A의 ARN을 검색할 수 있습니다.

**IAM 콘솔을 사용하여 계정 A의 ARN 값을 찾으려면**

1. [**Roles**]를 선택합니다.

1. 검사할 역할을 선택합니다.

1. [**요약(Summary)**] 단원에서 [**역할 ARN(Role ARN)**]을 찾습니다.

AssumeRole API는 소유 계정의 리소스에 액세스하는 데 사용할 임시 보안 인증을 반환합니다. 이 예제에서 액세스하려는 리소스는 Amazon S3 버킷과 버킷에 포함된 로그 파일입니다. 임시 자격 증명에는 역할 액세스 정책에 정의한 권한이 있습니다.

다음 Python 예([AWS SDK for Python (Boto)](https://aws.amazon.com/developer/tools/) 사용)에서는 `AssumeRole`을 호출하는 방법 및 반환된 임시 보안 자격 증명을 사용하여 계정 A가 제어하는 모든 Amazon S3 버킷을 나열하는 방법을 보여 줍니다.

```
def list_buckets_from_assumed_role(user_key, assume_role_arn, session_name):
    """
    Assumes a role that grants permission to list the Amazon S3 buckets in the account.
    Uses the temporary credentials from the role to list the buckets that are owned
    by the assumed role's account.

    :param user_key: The access key of a user that has permission to assume the role.
    :param assume_role_arn: The Amazon Resource Name (ARN) of the role that
                            grants access to list the other account's buckets.
    :param session_name: The name of the STS session.
    """
    sts_client = boto3.client(
        "sts", aws_access_key_id=user_key.id, aws_secret_access_key=user_key.secret
    )
    try:
        response = sts_client.assume_role(
            RoleArn=assume_role_arn, RoleSessionName=session_name
        )
        temp_credentials = response["Credentials"]
        print(f"Assumed role {assume_role_arn} and got temporary credentials.")
    except ClientError as error:
        print(
            f"Couldn't assume role {assume_role_arn}. Here's why: "
            f"{error.response['Error']['Message']}"
        )
        raise

    # Create an S3 resource that can access the account with the temporary credentials.
    s3_resource = boto3.resource(
        "s3",
        aws_access_key_id=temp_credentials["AccessKeyId"],
        aws_secret_access_key=temp_credentials["SecretAccessKey"],
        aws_session_token=temp_credentials["SessionToken"],
    )
    print(f"Listing buckets for the assumed role's account:")
    try:
        for bucket in s3_resource.buckets.all():
            print(bucket.name)
    except ClientError as error:
        print(
            f"Couldn't list buckets for the account. Here's why: "
            f"{error.response['Error']['Message']}"
        )
        raise
```

### AWS 계정 간 CloudTrail 로그 파일 공유 중지


다른에 대한 로그 파일 공유를 중지하려면 해당 계정에 대해 생성한 역할을 AWS 계정삭제합니다. 역할 삭제 방법에 대한 내용은 [역할 또는 인스턴스 프로파일 삭제](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_manage_delete.html)를 참조하세요.

# CloudTrail 로그 파일 무결성 검증


CloudTrail이 로그 파일을 전송한 후 해당 파일이 수정, 삭제 또는 변경되지 않았는지 확인하기 위해 CloudTrail 로그 파일 무결성 검증을 사용할 수 있습니다. 이 기능은 산업 표준 알고리즘(해시의 경우 SHA-256, 디지털 서명의 경우 RSA 포함 SHA-256)으로 구축되었습니다. 따라서 CloudTrail 로그 파일의 수정, 삭제 또는 위조가 감지되지 않는 것이 계산상 불가능합니다. AWS CLI 를 사용하여 CloudTrail에서 파일을 전송한 위치의 파일을 검증할 수 있습니다.

## 사용하는 이유


검증된 로그 파일은 보안 및 과학수사에서 중요한 역할을 합니다. 예를 들어, 검증된 로그 파일을 사용하면 로그 파일 자체가 변경되지 않았음을 또는 특정 사용자 자격 증명이 특정 API 활동을 수행했음을 확실하게 주장할 수 있습니다. 또한 CloudTrail 로그 파일 무결성 검증 프로세스를 사용하면 로그 파일이 삭제 또는 변경되었는지 여부를 알 수 있거나 특정 시간 동안 사용자 계정으로 로그 파일이 전송되지 않았음을 확실하게 주장할 수 있습니다.

## 작동 방식


로그 파일 무결성 검증을 활성화할 경우 CloudTrail은 전송하는 모든 로그 파일에 대해 해시를 생성합니다. 또한 CloudTrail은 지난 1시간 동안의 로그 파일을 참조하고 각 해시를 포함하는 파일을 매시간 생성해 전송합니다. 이 파일을 다이제스트 파일이라고 합니다. CloudTrail은 퍼블릭/프라이빗 키 페어의 프라이빗 키를 사용하여 각 다이제스트 파일에 서명합니다. 파일이 전송된 후 사용자는 퍼블릭 키를 사용하여 다이제스트 파일을 검증할 수 있습니다. CloudTrail은 각각에 대해 서로 다른 키 페어를 사용합니다 AWS 리전.

다이제스트 파일은 추적과 연결되었으며 CloudTrail 로그 파일과 동일한 Amazon S3 버킷으로 전송됩니다. 로그 파일이 모든 리전 또는 여러 계정에서 단일 Amazon S3 버킷으로 전송되면 CloudTrail은 해당 리전 및 계정의 다이제스트 파일을 동일한 버킷으로 전송합니다.

다이제스트 파일은 로그 파일과는 별도의 폴더에 저장됩니다. 다이제스트 파일과 로그 파일이 분리되므로 세분화된 보안 정책을 적용할 수 있으며 기존 로그 처리 솔루션을 수정하지 않고 계속 사용할 수 있습니다. 또한 각 다이제스트 파일에는 이전 다이제스트 파일(있는 경우)의 디지털 서명이 포함되어 있습니다. 현재 다이제스트 파일의 서명은 다이제스트 파일인 Amazon S3 객체의 메타데이터 속성에 있습니다. 다이제스트 파일 콘텐츠에 대한 자세한 내용은 [CloudTrail 다이제스트 파일 구조](cloudtrail-log-file-validation-digest-file-structure.md) 단원을 참조하세요.

### 로그 및 다이제스트 파일 저장


CloudTrail 로그 파일 및 다이제스트 파일을 Amazon S3 또는 Amazon Glacier에 안전하고 안정적으로 저렴하게 무기한 저장할 수 있습니다. Amazon S3에 저장된 다이제스트 파일의 보안을 개선하기 위해 [Amazon S3 MFA Delete](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingMFADelete.html)를 사용할 수 있습니다.

### 검증 활성화 및 파일 검증


로그 파일 무결성 검증을 활성화하려면 AWS Management Console, AWS CLI또는 CloudTrail API를 사용할 수 있습니다. 로그 파일 무결성 검증을 활성화하면 CloudTrail에서 다이제스트 로그 파일을 Amazon S3 버킷으로 전송할 수 있지만, 파일 무결성은 검증되지 않습니다. 자세한 내용은 [CloudTrail에 대한 로그 파일 무결성 검증 활성화](cloudtrail-log-file-validation-enabling.md) 단원을 참조하십시오.

CloudTrail 로그 파일의 무결성을 검증하려면를 사용하거나 자체 솔루션을 AWS CLI 생성할 수 있습니다. AWS CLI 는 CloudTrail이 파일을 전송한 위치의 파일을 검증합니다. 다른 위치로 이동한 로그를 검증하려면 Amazon S3 또는 기타 위치에서 고유한 검증 도구를 생성할 수 있습니다.

를 사용하여 로그를 검증하는 방법에 대한 자세한 내용은 단원을 AWS CLI참조하십시오[를 사용하여 CloudTrail 로그 파일 무결성 검증 AWS CLI](cloudtrail-log-file-validation-cli.md). CloudTrail 로그 파일 검증의 사용자 지정 구현을 개발하는 방법에 대한 자세한 내용은 [CloudTrail 로그 파일 무결성 검증에 대한 사용자 지정 구현](cloudtrail-log-file-custom-validation.md) 단원을 참조하세요.

# CloudTrail에 대한 로그 파일 무결성 검증 활성화


 AWS Management Console AWS 명령줄 인터페이스(AWS CLI) 또는 CloudTrail API를 사용하여 로그 파일 무결성 검증을 활성화할 수 있습니다. CloudTrail에서 약 한 시간 내로 다이제스트 파일 전달을 시작합니다.

## AWS Management Console


CloudTrail 콘솔에서 로그 파일 무결성 검증을 활성화하려면 추적을 생성하거나 업데이트할 때 [**로그 파일 검증 활성화(Enable log file validation)**] 옵션에 대해 [**예(Yes)**]를 선택합니다. 기본적으로 이 기능은 새 추적에 대해 활성화됩니다. 자세한 내용은 [콘솔을 사용하여 추적 생성 및 업데이트](cloudtrail-create-and-update-a-trail-by-using-the-console.md) 단원을 참조하십시오.

## AWS CLI


를 사용하여 로그 파일 무결성 검증을 활성화하려면 [create-trail](https://docs.aws.amazon.com/cli/latest/reference/cloudtrail/create-trail.html) 또는 [update-trail](https://docs.aws.amazon.com/cli/latest/reference/cloudtrail/update-trail.html) 명령과 함께 `--enable-log-file-validation` 옵션을 AWS CLI사용합니다. 로그 파일 무결성 검증을 비활성화하려면 `--no-enable-log-file-validation` 옵션을 사용합니다.

**예제**

다음 `update-trail` 명령을 사용해 로그 파일 검증을 활성화하고 지정된 추적에 대한 Amazon S3 버킷으로 다이제스트 파일 전송을 시작합니다.

```
aws cloudtrail update-trail --name your-trail-name --enable-log-file-validation
```

## CloudTrail API


CloudTrail API를 사용하여 로그 파일 무결성 검증을 활성화하려면 `CreateTrail` 또는 `UpdateTrail`을 호출할 때 `EnableLogFileValidation` 요청 파라미터를 `true`으로 설정합니다.

자세한 내용은 [AWS CloudTrail API 참조](https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/)의 [CreateTrail](https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_CreateTrail.html) 및 [UpdateTrail](https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_UpdateTrail.html)을 참조하세요.

# 를 사용하여 CloudTrail 로그 파일 무결성 검증 AWS CLI


를 사용하여 로그를 검증하려면 CloudTrail `validate-logs` 명령을 AWS Command Line Interface사용합니다. 이 명령에서는 검증을 수행하기 위해 Amazon S3 버킷에 전달된 다이제스트 파일을 사용합니다. 다이제스트 파일에 대한 내용은 [CloudTrail 다이제스트 파일 구조](cloudtrail-log-file-validation-digest-file-structure.md)를 참조하세요.

를 AWS CLI 사용하면 다음과 같은 유형의 변경 사항을 감지할 수 있습니다.
+ CloudTrail 로그 파일 수정 또는 삭제
+ CloudTrail 다이제스트 파일 수정 또는 삭제
+ 위 두 파일 수정 또는 삭제

**참고**  
는 다이제스트 파일에서 참조하는 로그 파일만 AWS CLI 검증합니다. 자세한 내용은 [특정 파일을 CloudTrail이 전달했는지 확인](#cloudtrail-log-file-validation-cli-validate-logs-check-file) 단원을 참조하십시오.

## 사전 조건


를 사용하여 로그 파일 무결성을 검증하려면 다음 AWS CLI조건을 충족해야 합니다.
+ 에 대한 온라인 연결이 있어야 합니다 AWS.
+ 다이제스트 및 로그 파일을 포함하는 Amazon S3 버킷에 대한 읽기 액세스 권한이 있어야 합니다.
+ 다이제스트 및 로그 파일은 CloudTrail이 해당 파일을 전송한 원래 Amazon S3 위치에서 이동되지 않아야 합니다.
+ 명령을 실행하는 역할에는 추적에서 참조하는 각 S3 버킷에 대해 `ListObjects`, `GetObject` 및 `GetBucketLocation`을 호출할 수 있는 권한이 있어야 합니다.

**참고**  
로컬 디스크로 다운로드한 로그 파일은 AWS CLI로 검증할 수 없습니다. 자체 검증 도구 생성에 대한 내용은 [CloudTrail 로그 파일 무결성 검증에 대한 사용자 지정 구현](cloudtrail-log-file-custom-validation.md) 단원을 참조하세요.

## validate-logs


### 구문


다음은 `validate-logs`에 대한 구문입니다. 선택 사항 파라미터는 대괄호로 표시됩니다.

`aws cloudtrail validate-logs --trail-arn <trailARN> --start-time <start-time> [--end-time <end-time>] [--s3-bucket <amzn-s3-demo-bucket>] [--s3-prefix <prefix>] [--account-id <account-id>] [--verbose]` 

**참고**  
`validate-logs` 명령은 리전별로 다릅니다. 특정에 대한 로그를 검증하려면 `--region` 글로벌 옵션을 지정해야 합니다 AWS 리전.

### 옵션


`validate-logs`에 대한 명령줄 옵션은 다음과 같습니다. `--trail-arn` 및 `--start-time` 옵션이 필요합니다. `--account-id` 옵션은 조직 추적에 추가로 필요합니다.

`--start-time`  
지정한 UTC 타임스탬프 값이 검증되거나 검증된 후에 전달된 로그 파일을 지정합니다. 예시: `2015-01-08T05:21:42Z`.

`--end-time`  
지정한 UTC 타임스탬프 값이 검증되거나 검증되기 전에 전달된 로그 파일을 선택적으로 지정합니다. 기본값은 현재 UTC 시간(`Date.now()`)입니다. 예시: `2015-01-08T12:31:41Z`.  
지정된 시간 범위의 경우 `validate-logs` 명령은 해당 다이제스트 파일에서 참조하는 로그 파일만 확인합니다. Amazon S3 버킷의 다른 로그 파일은 확인되지 않습니다. 자세한 내용은 [특정 파일을 CloudTrail이 전달했는지 확인](#cloudtrail-log-file-validation-cli-validate-logs-check-file) 단원을 참조하세요.

`--s3-bucket`  
다이제스트 파일이 저장되는 Amazon S3 버킷을 선택적으로 지정합니다. 버킷 이름을 지정하지 않으면 AWS CLI 는를 호출하여 버킷 이름을 검색합니다`DescribeTrails()`.

`--s3-prefix`  
다이제스트 파일이 저장되는 Amazon S3 접두사를 선택적으로 지정합니다. 지정하지 않으면 AWS CLI 에서를 호출하여 검색합니다`DescribeTrails()`.  
현재 접두사가 지정한 시간 범위 도중에 사용된 접두사와 다를 때에만 이 옵션을 사용해야 합니다.

`--account-id`  
로그 검증을 위한 계정을 선택적으로 지정합니다. 이 매개 변수는 조직 내 특정 계정의 로그를 검증하기 위한 조직 추적에 필요합니다.

`--trail-arn`  
검증할 추적의 Amazon 리소스 이름(ARN)을 지정합니다. ARN 추적 형식은 다음과 같습니다.  

```
arn:aws:cloudtrail:us-east-2:111111111111:trail/MyTrailName
```
추적에 대한 추적 ARN을 얻기 위해 `validate-logs`를 실행하기 전에 `describe-trails` 명령을 사용할 수 있습니다.  
지정한 시간 범위에서 로그 파일을 여러 개의 버킷에 전달한 경우 추적 ARN과 함께 버킷 이름과 접두사를 지정하고 버킷 중 하나에서만 로그 파일 검증을 제한할 수 있습니다.

`--verbose`  
지정된 시간 범위에서 모든 로그 또는 다이제스트 파일의 선택적인 출력 검증 정보입니다. 출력은 파일의 변경, 수정 또는 삭제 여부를 나타냅니다. 비 상세 표시 모드(기본값)에서 확인이 실패한 경우에만 정보가 반환됩니다.

### 예제


다음 예는 지정된 시작 시간에서 현재까지 현재 추적에 대해 구성된 Amazon S3 버킷을 사용하고 상세 표시 출력을 지정하여 로그 파일을 검증합니다.

```
aws cloudtrail validate-logs --start-time 2015-08-27T00:00:00Z --end-time 2015-08-28T00:00:00Z --trail-arn arn:aws:cloudtrail:us-east-2:111111111111:trail/my-trail-name --verbose
```

### `validate-logs` 작동 방식


`validate-logs` 명령은 지정된 시간 범위에서 가장 최근 다이제스트 파일을 검증함으로써 시작합니다. 먼저 다이제스트 파일이 속해 있는 위치에서 다운로드되었음을 검증합니다. 즉, CLI가 S3 위치 `p1`에서 다이제스트 파일 `df1`을 다운로드하면 validate-logs가 `p1 == df1.digestS3Bucket + '/' + df1.digestS3Object`를 검증합니다.

다이제스트 파일의 서명이 유효하다면, 각 로그의 해시 값이 다이제스트 파일에서 참조되고 있는지를 검증합니다. 그런 다음 명령은 시간을 거슬러 올라가 이전 다이제스트 파일과 참조되는 로그 파일을 연속으로 검증합니다. 이는 `start-time`에 지정된 값에 도달하거나 다이제스트 체인이 종료될 때까지 계속됩니다. 다이제스트 파일이 누락되었거나 올바르지 않은 경우 검증할 수 없는 시간 범위는 출력에 위치합니다. `validate-logs` 명령은 먼저 표준 다이제스트 체인에서 작동합니다. 표준 다이제스트 검증을 완료한 후 채우기 다이제스트 파일이 있는 경우 검증합니다. 채우기 다이제스트는 별도의 검증 체인을 형성하며 표준 다이제스트와 독립적으로 처리됩니다.

## 검증 결과


검증 결과는 다음과 같은 형식의 요약 머리글로 시작합니다.

```
Validating log files for trail trail_ARN  between time_stamp and time_stamp
```

기본 출력의 각 줄에는 다음 형식의 단일 다이제스트 또는 로그 파일에 대한 검증 결과가 포함됩니다. 접두사가 붙은 줄은 표준 다이제스트 파일과 별도의 검증 체인을 구성하는 다이제스트 파일 채우기를 `(backfill)` 나타냅니다.

```
<optional (backfill)> <Digest file | Log file> <S3 path> <Validation Message>
```

다음 표는 로그 및 다이제스트 파일에 가능한 검증 메시지를 설명합니다.


****  

| 파일 형식 | 검증 메시지 | 설명 | 
| --- | --- | --- | 
| Digest file | valid | 다이제스트 파일 서명이 유효합니다. 참조하는 로그 파일을 확인할 수 있습니다. 이 메시지는 상세 표시 모드에만 포함됩니다. | 
| Digest file | INVALID: has been moved from its original location | 다이제스트 파일을 검색한 S3 버킷 및 S3 객체가 다이제스트 파일 자체에 기록된 S3 버킷 또는 S3 객체 위치와 일치하지 않습니다. | 
| Digest file | INVALID: invalid format | 다이제스트 파일 형식이 잘못되었습니다. 다이제스트 파일이 나타내는 시간 범위에 해당하는 로그 파일을 검증할 수 없습니다. | 
| Digest file | INVALID: not found | 다이제스트 파일을 찾을 수 없습니다. 다이제스트 파일이 나타내는 시간 범위에 해당하는 로그 파일을 검증할 수 없습니다. | 
| Digest file | INVALID: public key not found for fingerprint 지문 | 다이제스트 파일에서 기록된 지문에 해당하는 퍼블릭 키를 찾을 수 없습니다. 다이제스트 파일을 검증할 수 없습니다. | 
| Digest file | INVALID: signature verification failed | 다이제스트 파일 서명이 유효하지 않습니다. 다이제스트 파일이 유효하지 않으므로 참조하는 로그 파일을 검증할 수 없으며, 내부에서 API 활동에 관한 어설션이 이루어지지 않습니다. | 
| Digest file | INVALID: Unable to load PKCS \$11 key with fingerprint 지문 | 지정된 지문이 있는 PKCS \$11 형식의 DER 인코딩 퍼블릭 키를 로드할 수 없으므로 다이제스트 파일을 검증할 수 없습니다. | 
| Log file | valid | 로그 파일이 검증되었으며 전달 이후 수정되지 않았습니다. 이 메시지는 상세 표시 모드에만 포함됩니다. | 
| Log file | INVALID: hash value doesn't match | 로그 파일에 대한 해시가 일치하지 않습니다. CloudTrail이 전송한 후 로그 파일이 수정되었습니다. | 
| Log file | INVALID: invalid format | 로그 파일 형식이 잘못되었습니다. 로그 파일을 검증할 수 없습니다. | 
| Log file | INVALID: not found | 로그 파일이 없어 검증할 수 없습니다. | 

출력에는 반환된 결과에 관한 요약 정보가 포함됩니다.

## 출력 예


### 상세 표시


다음 예제 `validate-logs` 명령은 `--verbose` 플래그를 사용해 다음을 따르는 샘플 출력을 생성합니다. `[...]`는 샘플 출력이 축약되었다는 것을 나타냅니다.

```
aws cloudtrail validate-logs --trail-arn arn:aws:cloudtrail:us-east-2:111111111111:trail/example-trail-name --start-time 2015-08-31T22:00:00Z --end-time 2015-09-01T19:17:29Z --verbose
```

```
Validating log files for trail arn:aws:cloudtrail:us-east-2:111111111111:trail/example-trail-name between 2015-08-31T22:00:00Z and 2015-09-01T19:17:29Z
                                       
Digest file    s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail-Digest/us-east-2/2015/09/01/111111111111_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150901T201728Z.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1925Z_WZZw1RymnjCRjxXc.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1915Z_POuvV87nu6pfAV2W.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1930Z_l2QgXhAKVm1QXiIA.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1920Z_eQJteBBrfpBCqOqw.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1950Z_9g5A6qlR2B5KaRdq.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1920Z_i4DNCC12BuXd6Ru7.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1915Z_Sg5caf2RH6Jdx0EJ.json.gz	valid
Digest file    s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail-Digest/us-east-2/2015/09/01/111111111111_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150901T191728Z.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1910Z_YYSFiuFQk4nrtnEW.json.gz	valid
[...]
Log file       s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail/us-east-2/2015/09/01/144218288521_CloudTrail_us-east-2_20150901T1055Z_0Sfy6m9f6iBzmoPF.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail/us-east-2/2015/09/01/144218288521_CloudTrail_us-east-2_20150901T1040Z_lLa3QzVLpOed7igR.json.gz	valid

Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2015/09/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150901T101728Z.json.gz	INVALID: signature verification failed

Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2015/09/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150901T091728Z.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail/us-east-2/2015/09/01/144218288521_CloudTrail_us-east-2_20150901T0830Z_eaFvO3dwHo4NCqqc.json.gz	valid
Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2015/09/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150901T081728Z.json.gz	valid
Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2015/09/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150901T071728Z.json.gz	valid
[...]
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/08/31/111111111111_CloudTrail_us-east-2_20150831T2245Z_mbJkEO5kNcDnVhGh.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/08/31/111111111111_CloudTrail_us-east-2_20150831T2225Z_IQ6kXy8sKU03RSPr.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/08/31/111111111111_CloudTrail_us-east-2_20150831T2230Z_eRPVRTxHQ5498ROA.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/08/31/111111111111_CloudTrail_us-east-2_20150831T2255Z_IlWawYZGvTWB5vYN.json.gz	valid
Digest file    s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail-Digest/us-east-2/2015/08/31/111111111111_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150831T221728Z.json.gz	valid

Results requested for 2015-08-31T22:00:00Z to 2015-09-01T19:17:29Z
Results found for 2015-08-31T22:17:28Z to 2015-09-01T20:17:28Z:

22/23 digest files valid, 1/23 digest files INVALID
63/63 log files valid
```

다음 예제 `validate-logs` 명령은 채우기 다이제스트 파일이 있는 기간에 `--verbose` 플래그를 사용하고 다음 샘플 출력을 생성합니다. 채우기 다이제스트는 `(backfill)` 접두사와 함께 나타나며 표준 다이제스트 체인과 별도로 검증됩니다.는 샘플 출력이 축약되었음을 `[...]` 나타냅니다.

```
aws cloudtrail validate-logs --trail-arn arn:aws:cloudtrail:us-east-2:111111111111:trail/example-trail-name --start-time 2024-07-31T22:00:00Z --end-time 2024-08-01T19:17:29Z --verbose
```

```
Validating log files for trail arn:aws:cloudtrail:us-east-2:111111111111:trail/example-trail-name between 2024-07-31T22:00:00Z and 2024-08-01T19:17:29Z

Digest file    s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail-Digest/us-east-2/2024/08/01/111111111111_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T201728Z.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/08/01/111111111111_CloudTrail_us-east-2_20240801T1925Z_Xm3pK9vN2wQ5rT8h.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/08/01/111111111111_CloudTrail_us-east-2_20240801T1915Z_Bj7cL4nM6pR9sU2v.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/08/01/111111111111_CloudTrail_us-east-2_20240801T1930Z_Fy1dG8kN3qT6wX0z.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/08/01/111111111111_CloudTrail_us-east-2_20240801T1920Z_Hn5jM2pQ7sV9yB4e.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/08/01/111111111111_CloudTrail_us-east-2_20240801T1950Z_Kp8rN1tW4xZ7aC3f.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/08/01/111111111111_CloudTrail_us-east-2_20240801T1920Z_Mq6sP9uX2yB5dE8g.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/08/01/111111111111_CloudTrail_us-east-2_20240801T1915Z_Rt4vQ7wZ0aC3fG6h.json.gz	valid
Digest file    s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail-Digest/us-east-2/2024/08/01/111111111111_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T191728Z.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/08/01/111111111111_CloudTrail_us-east-2_20240801T1910Z_Uw9xR2yB5dH8jK1m.json.gz	valid
[...]
Log file       s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail/us-east-2/2024/08/01/144218288521_CloudTrail_us-east-2_20240801T1055Z_Vz3aS6cE9fL2nP5q.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail/us-east-2/2024/08/01/144218288521_CloudTrail_us-east-2_20240801T1040Z_Xy7bT0dG3hM6pR9s.json.gz	valid

Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2024/08/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T101728Z.json.gz	INVALID: signature verification failed

Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2024/08/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T091728Z.json.gz	valid
Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2024/08/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T081728Z.json.gz	valid
Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2024/08/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T071728Z.json.gz	valid
[...]
Digest file    s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail-Digest/us-east-2/2024/07/31/111111111111_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240731T221728Z.json.gz	valid
(backfill) Digest file    s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail-Digest/us-east-2/2024/08/01/111111111111_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T201728Z_backfill.json.gz	valid
(backfill) Digest file    s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail-Digest/us-east-2/2024/08/01/111111111111_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T191728Z_backfill.json.gz	valid
[...]

(backfill) Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2024/08/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T101728Z_backfill.json.gz	INVALID: signature verification failed

(backfill) Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2024/08/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T091728Z_backfill.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail/us-east-2/2024/08/01/144218288521_CloudTrail_us-east-2_20240801T0830Z_Rn6uk0wY5aD9fJ3n.json.gz	valid
(backfill) Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2024/08/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T081728Z_backfill.json.gz	valid
(backfill) Digest file    s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2024/08/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T071728Z_backfill.json.gz	valid
[...]
(backfill) Digest file    s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail-Digest/us-east-2/2024/07/31/111111111111_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240731T221728Z_backfill.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/07/31/111111111111_CloudTrail_us-east-2_20240731T2145Z_Sp3vm7xZ2bE6gK0p.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/07/31/111111111111_CloudTrail_us-east-2_20240731T2125Z_Tq0wn4ya9cF3hL7q.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/07/31/111111111111_CloudTrail_us-east-2_20240731T2130Z_Ur7xp1zb6dG0jM4r.json.gz	valid
Log file       s3://amzn-s3-demo-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2024/07/31/111111111111_CloudTrail_us-east-2_20240731T2155Z_Vs4yq8ac3eH7kN1s.json.gz	valid

Results requested for 2024-07-31T22:00:00Z to 2024-08-01T19:17:29Z
Results found for 2024-07-31T22:17:28Z to 2024-08-01T20:17:28Z:

22/23 digest files valid, 1/23 digest files INVALID
22/23 backfill digest files valid, 1/23 backfill digest files INVALID
63/63 log files valid
```

### 비 상세 표시


다음 예제 `validate-logs` 명령은 `--verbose` 플래그를 사용하지 않습니다. 다음 샘플 출력에서 하나의 오류가 발견되었습니다. 헤더, 오류 및 요약 정보만이 반환됩니다.

```
aws cloudtrail validate-logs --trail-arn arn:aws:cloudtrail:us-east-2:111111111111:trail/example-trail-name --start-time 2015-08-31T22:00:00Z --end-time 2015-09-01T19:17:29Z
```

```
Validating log files for trail arn:aws:cloudtrail:us-east-2:111111111111:trail/example-trail-name between 2015-08-31T22:00:00Z and 2015-09-01T19:17:29Z

Digest file	s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2015/09/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150901T101728Z.json.gz	INVALID: signature verification failed

(backfill) Digest file	s3://amzn-s3-demo-bucket/AWSLogs/144218288521/CloudTrail-Digest/us-east-2/2024/08/01/144218288521_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20240801T101728Z_backfill.json.gz	INVALID: signature verification failed

Results requested for 2015-08-31T22:00:00Z to 2015-09-01T19:17:29Z
Results found for 2015-08-31T22:17:28Z to 2015-09-01T20:17:28Z:

22/23 digest files valid, 1/23 digest files INVALID
22/23 backfill digest files valid, 1/23 backfill digest files INVALID
63/63 log files valid
```

## 특정 파일을 CloudTrail이 전달했는지 확인


버킷의 특정 파일을 CloudTrail이 전달했는지 확인하려면 상세 표시 모드에서 이 파일을 포함하는 기간 동안 `validate-logs`를 실행합니다. `validate-logs`의 출력에 파일이 표시되면 CloudTrail이 해당 파일을 전송한 것입니다.

# CloudTrail 다이제스트 파일 구조


각 다이제스트 파일은 마지막 시간 중 Amazon S3 버킷에 전달된 로그 파일 이름, 이러한 로그 파일의 해시 값 및 이전 다이제스트 파일의 디지털 서명을 포함합니다. 현재 다이제스트 파일의 서명은 다이제스트 파일 객체의 메타데이터 속성에 저장됩니다. 디지털 서명 및 해시는 로그 파일과 다이제스트 파일 자체의 무결성을 검증하는 데 사용됩니다.

## 다이제스트 파일 위치


다이제스트 파일은 이 구문을 따른 Amazon S3 버킷 위치로 전송됩니다.

```
s3://amzn-s3-demo-bucket/optional-prefix/AWSLogs/aws-account-id/CloudTrail-Digest/
    region/digest-end-year/digest-end-month/digest-end-date/
    aws-account-id_CloudTrail-Digest_region_trail-name_region_digest_end_timestamp.json.gz
```

**참고**  
조직 추적의 경우 다음과 같이 버킷 위치에도 조직 단위 ID가 포함됩니다.  

```
s3://amzn-s3-demo-bucket/optional-prefix/AWSLogs/O-ID/aws-account-id/CloudTrail-Digest/
    region/digest-end-year/digest-end-month/digest-end-date/
    aws-account-id_CloudTrail-Digest_region_trail-name_region_digest_end_timestamp.json.gz
```

**참고**  
채우기 다이제스트 파일은 처리 지연으로 인해 원본 다이제스트에서 참조되지 않은 로그 파일을 CloudTrail에 포함해야 할 때 전달됩니다. 채우기 다이제스트 파일은 다음과 같이 파일 이름에 `_backfill` 접미사를 사용합니다.  

```
s3://amzn-s3-demo-bucket/optional-prefix/AWSLogs/aws-account-id/CloudTrail-Digest/
    region/digest-end-year/digest-end-month/digest-end-date/
    aws-account-id_CloudTrail-Digest_region_trail-name_region_digest_end_timestamp_backfill.json.gz
```

## 샘플 다이제스트 파일 내용


다음 예시 다이제스트 파일에는 CloudTrail 로그에 대한 정보가 포함됩니다.

```
{
  "awsAccountId": "111122223333",
  "digestStartTime": "2015-08-17T14:01:31Z",
  "digestEndTime": "2015-08-17T15:01:31Z",
  "digestS3Bucket": "amzn-s3-demo-bucket",
  "digestS3Object": "AWSLogs/111122223333/CloudTrail-Digest/us-east-2/2015/08/17/111122223333_CloudTrail-Digest_us-east-2_your-trail-name_us-east-2_20150817T150131Z.json.gz",
  "digestPublicKeyFingerprint": "31e8b5433410dfb61a9dc45cc65b22ff",
  "digestSignatureAlgorithm": "SHA256withRSA",
  "newestEventTime": "2015-08-17T14:52:27Z",
  "oldestEventTime": "2015-08-17T14:42:27Z",
  "previousDigestS3Bucket": "amzn-s3-demo-bucket",
  "previousDigestS3Object": "AWSLogs/111122223333/CloudTrail-Digest/us-east-2/2015/08/17/111122223333_CloudTrail-Digest_us-east-2_your-trail-name_us-east-2_20150817T140131Z.json.gz",
  "previousDigestHashValue": "97fb791cf91ffc440d274f8190dbdd9aa09c34432aba82739df18b6d3c13df2d",
  "previousDigestHashAlgorithm": "SHA-256",
  "previousDigestSignature": "50887ccffad4c002b97caa37cc9dc626e3c680207d41d27fa5835458e066e0d3652fc4dfc30937e4d5f4cc7f796e7a258fb50a43ac427f2237f6e505d4efaf373d156e15e3b68dea9f58111d395b62628d6bd367a9024d2183b5c5f6e19466d3a996b92df705bc997b8a0e13430f241d733cf95df4e41bb6c304c3f58363043572ea57a27085639ce187e679c0d81c7519b1184fa77fb7ab0b0e40a32dace6e1eefc3995c5ae182da49b62b26398cebb52a2201a6387b75b89c83e5570bcb9bba6c34a80f2f00a1c6ebe07d1ff149eccd812dc805bb3eeff6657db32a6cb48d2d096404eb76181877bc6ebb8cd0b23f823200155b2fd8848d428e46e8456328a",
  "logFiles": [
    {
      "s3Bucket": "amzn-s3-demo-bucket",
      "s3Object": "AWSLogs/111122223333/CloudTrail/us-east-2/2015/08/17/111122223333_CloudTrail_us-east-2_20150817T1445Z_9nYN7gp2eWAJHIfT.json.gz",
      "hashValue": "9bb6196fc6b84d6f075a56548feca262bd99ba3c2de41b618e5b6e22c1fc71f6",
      "hashAlgorithm": "SHA-256",
      "newestEventTime": "2015-08-17T14:52:27Z",
      "oldestEventTime": "2015-08-17T14:42:27Z"
    }
  ]
}
```

## 다이제스트 파일 필드 설명


다이제스트 파일의 각 필드에 대한 설명은 다음과 같습니다.

`awsAccountId`  
다이제스트 파일이 전송된 AWS 계정 ID입니다.

`digestStartTime`  
다이제스트 파일이 다루는 시작 UTC 시간 범위이며 CloudTrail이 로그 파일을 전송한 시간의 참조로 선택됩니다. 이는 시간 범위가 [Ta, Tb]인 경우 다이제스트가 Ta와 Tb 사이에 고객에게 전달된 모든 로그 파일을 포함한다는 것을 의미합니다.

`digestEndTime`  
다이제스트 파일이 다루는 종료 UTC 시간 범위이며 CloudTrail이 로그 파일을 전송한 시간의 참조로 선택됩니다. 이는 시간 범위가 [Ta, Tb]인 경우 다이제스트가 Ta와 Tb 사이에 고객에게 전달된 모든 로그 파일을 포함한다는 것을 의미합니다.

`digestS3Bucket`  
현재 다이제스트 파일이 전송된 Amazon S3 버킷 이름입니다.

`digestS3Object`  
현재 다이제스트 파일의 Amazon S3 객체 키(즉, Amazon S3 버킷 위치)입니다. 문자열의 처음 두 리전은 다이제스트 파일이 전달된 리전을 표시합니다. 마지막 리전(`your-trail-name` 다음)은 추적의 홈 리전입니다. 홈 리전은 추적이 생성된 리전입니다. 다중 리전 추적의 경우는 다이제스트 파일이 전달된 리전과 달라질 수 있습니다.

`newestEventTime`  
다이제스트의 로그 파일의 모든 이벤트 사이에서 가장 최근 이벤트의 UTC 시간입니다.

`oldestEventTime`  
다이제스트의 로그 파일의 모든 이벤트 사이에서 가장 이전 이벤트의 UTC 시간입니다.  
다이제스트 파일이 늦게 전달된 경우 `oldestEventTime` 값은 `digestStartTime` 값 이전이 됩니다.

`previousDigestS3Bucket`  
이전 다이제스트 파일이 전송된 Amazon S3 버킷입니다.

`previousDigestS3Object`  
이전 다이제스트 파일의 Amazon S3 객체 키(즉, Amazon S3 버킷 위치)입니다.

`previousDigestHashValue`  
압축되지 않은 이전 다이제스트 파일의 16진수 인코딩 해시 값입니다.

`previousDigestHashAlgorithm`  
이전 다이제스트 파일 해싱에 사용된 해시 알고리즘 이름입니다.

`publicKeyFingerprint`  
이 다이제스트 파일을 서명하는 데 사용된 프라이빗 키와 일치하는 퍼블릭 키의 16진수 인코딩 지문입니다. AWS CLI 또는 CloudTrail API를 사용하여 다이제스트 파일에 해당하는 시간 범위의 퍼블릭 키를 검색할 수 있습니다. 반환된 퍼블릭 키 중에서 이 값과 일치하는 지문을 다이제스트 파일 검증에 사용할 수 있습니다. 다이제스트 파일의 퍼블릭 키 검색에 대한 자세한 내용은 명령 또는 CloudTrail [https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_ListPublicKeys.html](https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_ListPublicKeys.html) API를 참조하세요 AWS CLI [https://docs.aws.amazon.com/cli/latest/reference/cloudtrail/list-public-keys.html](https://docs.aws.amazon.com/cli/latest/reference/cloudtrail/list-public-keys.html).  
CloudTrail은 리전마다 다른 프라이빗/퍼블릭 키 쌍을 사용합니다. 각 다이제스트 파일은 해당 리전에 고유한 프라이빗 키로 서명합니다. 그러므로 특정 리전에서 다이제스트 파일을 검증할 때 해당 퍼블릭 키의 동일한 리전에서 확인해야 합니다.

`digestSignatureAlgorithm`  
다이제스트 파일에 서명하는 데 사용하는 알고리즘입니다.

`logFiles.s3Bucket`  
로그 파일에 대한 Amazon S3 버킷 이름입니다.

`logFiles.s3Object`  
현재 로그 파일의 Amazon S3 객체 키입니다.

`logFiles.newestEventTime`  
로그 파일에서 가장 최근 이벤트의 UTC 시간입니다. 또한 이 시간은 로그 파일 자체의 타임스탬프에도 대응합니다.

`logFiles.oldestEventTime`  
로그 파일에서 가장 이전 이벤트의 UTC 시간입니다.

`logFiles.hashValue`  
압축되지 않은 로그 파일 콘텐츠의 16진수 인코딩 해시 값입니다.

`logFiles.hashAlgorithm`  
로그 파일 해싱에 사용하는 해시 알고리즘입니다.

## 시작 다이제스트 파일


로그 파일 무결성 검증이 시작되면 시작 다이제스트 파일이 생성됩니다. 또한 시작 다이제스트 파일은 로그 파일 무결성 검증이 다시 시작될 때도 생성됩니다(비활성화 후 로그 파일 무결성 검증을 다시 활성화하거나 로깅 중지 후 검증이 활성화된 로깅 다시 시작). 시작 다이제스트 파일에서 이전 다이제스트 파일과 관련된 다음 필드는 null이 됩니다.
+ `previousDigestS3Bucket`
+ `previousDigestS3Object`
+ `previousDigestHashValue`
+ `previousDigestHashAlgorithm`
+ `previousDigestSignature`

## '빈' 다이제스트 파일


CloudTrail은 다이제스트 파일이 나타나는 한 시간 동안 계정에서 API 활동이 없어도 다이제스트 파일을 전송합니다. 이는 다이제스트 파일이 보고한 한 시간 동안 로그 파일이 전달되지 않았다고 주장해야 할 때 유용할 수 있습니다.

다음 예제는 API 활동이 없는 한 시간을 기록한 다이제스트 파일 콘텐츠를 표시합니다. 참고로 다이제스트 파일 콘텐츠의 끝에서 `logFiles:[ ]` 필드는 비어 있습니다.

```
{
  "awsAccountId": "111122223333",
  "digestStartTime": "2015-08-20T17:01:31Z",
  "digestEndTime": "2015-08-20T18:01:31Z",
  "digestS3Bucket": "amzn-s3-demo-bucket",
  "digestS3Object": "AWSLogs/111122223333/CloudTrail-Digest/us-east-2/2015/08/20/111122223333_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150820T180131Z.json.gz",
  "digestPublicKeyFingerprint": "31e8b5433410dfb61a9dc45cc65b22ff",
  "digestSignatureAlgorithm": "SHA256withRSA",
  "newestEventTime": null,
  "oldestEventTime": null,
  "previousDigestS3Bucket": "amzn-s3-demo-bucket",
  "previousDigestS3Object": "AWSLogs/111122223333/CloudTrail-Digest/us-east-2/2015/08/20/111122223333_CloudTrail-Digest_us-east-2_example-trail-name_us-east-2_20150820T170131Z.json.gz",
  "previousDigestHashValue": "ed96c4bac9eaa8fe9716ca0e515da51938be651b1db31d781956416a9d05cdfa",
  "previousDigestHashAlgorithm": "SHA-256",
  "previousDigestSignature": "82705525fb0fe7f919f9434e5b7138cb41793c776c7414f3520c0242902daa8cc8286b29263d2627f2f259471c745b1654af76e2073264b2510fd45236b3aea4d80c0e8e6455223d7bd54ff80af0edf22a5f14fa856626daec919f0591479aa4f213787ba1e1076328dcf8ff624e03a977fa5612dcf58594c590fd8c1c5b48bddf43fc84ecc00b41bedd0ff7f293c3e2de8dcdc78f98b03e17577f5822ba842399d69eb79921c0429773509520e08c8b518702d987dfbb3a4e5d8c5f17673ce1f989dfff82d4becf24e452f20d3bcac94ad50131f93e57f10155536acb54c60efbe9d57228c2b930bc6082b2318e3ccd36834a8e835b8d112dbf32145f445c11",
  "logFiles": []
}
```

## 다이제스트 파일 서명


다이제스트 파일의 서명 정보는 Amazon S3 다이제스트 파일 객체의 두 객체 메타데이터 속성에 있습니다. 각 다이제스트 파일에는 다음 메타데이터 항목이 있습니다.
+ `x-amz-meta-signature`

  다이제스트 파일 서명의 16진수 인코딩 값입니다. 다음은 서명의 예입니다.

  ```
  3be472336fa2989ef34de1b3c1bf851f59eb030eaff3e2fb6600a082a23f4c6a82966565b994f9de4a5989d053d9d15d20fc5c43e66358652d93326550a4acc5c5f541bb52e9b455897ab723bd7cbabfe963a406a41d600f3658f7a3135e5ed9fcae7b79bb5857d1e5eb78fcce8595ce0ade2f3ad1d9f2d62be7bc4660d83166ce24586489b7da9ee9883eaf0b9efabb5dd3cbba565cc4aab5c9c46c9fa7e9cda310afcc5e8adcd9e48d0597ec5f8174a52c3bebb3e845eeb1d18904fbf4cc14cd117080098e10022ddf55e017a9431446acad8560de0ba1e477af9f8a3048bc6196350adad0cc0cb4ab99b5e7c9944437a3c674a038009220684ced7be07b4f
  28f1cc237f372264a51b611c01da429565def703539f4e71009051769469231bc22232fa260df02740047af532229885ea2b0e95ecd353326b7104941e0cbddb076a391f1fcf2923c19565f4841770a78723451aeb732ff1b6162dc40e601fc6720bc5325987942ebd817783b322f0ac77698523bf742fdea7aa44f4911b3101221b7e1233387f16a52077610498f4a1254211258e37da0fb4cb207aef593b4c1baa13674e85acc52046b3adb889e63331a66abac5de7e42ffdd6952987c31ae871650e130bd2e63bfe145b22bbd39ea192210f6df64d49b888a321e02d3fc4cf126accae30d2857ccd6b2286a7c9feba6c35c44161b24147d645e6ca26844ba
  05d3ffcb5d2dd5dc28f8bb5b7993938e8a5f912a82b448a367eccb2ec0f198ba71e23eb0b97278cf65f3c8d1e652c6de33a22ca8428821ffc95bf8b726ba9f37cfbc20c54dc5bd6159bdea1c4d951b68cb8e0528852c55bb0c5e499ea60560f7c2bb3af7f694407da863a2594f7a2f2838cb09254afbaf8003587746e719a0437f85eeffae534f283f3837eb939a9bccc3c71573500661245891051231b580ac92d9e0e68c6f47ad38975f493e2c40e7f303353c4adc7d563ef1e875977afac2e085f0c824045d998c9543d8a3293ad3c063b7a109d0bfd84b0b1e3f72c4f057e744e6a2cf9cc97727b08584f44bfa47799c5072b60f0b619aea88a17de585e9
  ```
+ `x-amz-meta-signature-algorithm`

  다음은 다이제스트 서명을 생성하는 데 사용되는 알고리즘의 예제 값입니다.

  `SHA256withRSA`
+ `x-amz-meta-backfill-generation-timestamp`

  채우기 다이제스트가 생성된 시점의 UTC 타임스탬프입니다. 이 메타데이터 속성은 채우기 다이제스트 파일에만 존재하며 서명 검증을 위한 올바른 퍼블릭 키를 식별하는 데 사용됩니다. 다음은 타임스탬프의 예입니다.

  `2025-05-20T00:00:00.000Z`

## 다이제스트 파일 체인화


각 다이제스트 파일에는 이전 다이제스트 파일에 대한 참조가 포함되어 있으므로와 같은 검증 도구가 다이제스트 파일이 삭제되었는지 감지 AWS CLI 할 수 있는 "체인"이 가능합니다. 또한 가장 최근 것부터 먼저 시작해 연속적으로 조사할 수 있도록 지정한 시간 범위에서 다이제스트 파일을 허용합니다.

**참고**  
로그 파일 무결성 검증을 비활성화하면 한 시간 후 다이제스트 파일 체인이 끊어집니다. CloudTrail은 로그 파일 무결성 검증이 비활성화된 기간 동안 전달된 로그 파일에 대한 다이제스트 파일을 생성하지 않습니다. 예를 들어, 1월 1일 정오에 로그 파일 무결성 검증을 활성화하고, 1월 2일 정오에 비활성화하며, 1월 10일 정오에 다시 활성화하는 경우 1월 2일 정오부터 1월 10일 정오까지 전달된 로그 파일에 대한 다이제스트 파일이 생성되지 않습니다. CloudTrail 로깅을 중지하거나 추적을 삭제할 때마다 동일하게 적용됩니다.

추적의 [S3 버킷 정책](create-s3-bucket-policy-for-cloudtrail.md)이 잘못 구성되거나 CloudTrail에 예기치 않은 서비스 중단이 발생하는 경우 다이제스트 파일이 전부 또는 일부 수신되지 않을 수 있습니다. 추적에 다이제스트 전달 오류가 있는지 확인하려면 [https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_GetTrailStatus.html](https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_GetTrailStatus.html) 명령을 실행하고 `LatestDigestDeliveryError` 파라미터에 오류가 있는지 확인합니다. 전달 문제가 해결되면(예: 버킷 정책 수정) CloudTrail은 누락된 다이제스트 파일을 다시 전송하려고 시도합니다. 재전달 기간에 다이제스트 파일이 순서대로 전달되지 않아 체인이 일시적으로 중단되는 것처럼 보일 수 있습니다.

로깅이 중지되거나 추적이 삭제되면 CloudTrail이 최종 다이제스트 파일을 전송합니다. 이 다이제스트 파일은 최대 및 `StopLogging` 이벤트를 비롯한 이벤트를 다루는 남은 로그 파일에 대한 정보를 포함합니다.

# CloudTrail 로그 파일 무결성 검증에 대한 사용자 지정 구현


CloudTrail은 업계 표준의 공개적으로 제공되는 암호화 알고리즘 및 해시 함수를 사용하므로 고유한 도구를 생성하여 CloudTrail 로그 파일의 무결성을 검증할 수 있습니다. 로그 파일 무결성 검증이 활성화되면 CloudTrail이 Amazon S3 버킷으로 다이제스트 파일을 전송합니다. 이 파일을 사용하여 고유한 검증 솔루션을 구현할 수 있습니다. 다이제스트 파일에 대한 자세한 내용은 [CloudTrail 다이제스트 파일 구조](cloudtrail-log-file-validation-digest-file-structure.md)를 참조하십시오.

이 주제에서는 다이제스트 파일이 서명되는 방법을 설명한 후 다이제스트 파일 및 다이제스트 파일이 참조하는 로그 파일을 검증하는 솔루션을 구현하기 위해 수행해야 할 단계를 자세히 안내합니다.

## CloudTrail 다이제스트 파일이 서명되는 방법 이해


CloudTrail 다이제스트 파일은 RSA 디지털 서명으로 서명됩니다. CloudTrail은 각 다이제스트 파일에 대해 다음을 수행합니다.

1. 지정된 다이제스트 파일 필드(다음 단원에 설명되어 있음)를 기반으로 데이터 서명을 위한 문자열을 생성합니다.

1. 리전에 고유한 프라이빗 키를 가져옵니다.

1. 문자열의 SHA-256 해시 및 프라이빗 키를 RSA 서명 알고리즘에 전달하여 디지털 서명을 생성합니다.

1. 서명의 바이트 코드를 16진수 형식으로 인코딩합니다.

1. 디지털 서명을 Amazon S3 다이제스트 파일 객체의 `x-amz-meta-signature` 메타데이터 속성에 넣습니다.

### 데이터 서명 문자열의 내용


다음은 데이터 서명을 위한 문자열에 포함되어 있는 CloudTrail 객체입니다.
+ UTC 확장 형식의 다이제스트 파일의 종료 타임스탬프(예: `2015-05-08T07:19:37Z`)
+ 현재 다이제스트 파일 S3 경로
+ 현재 다이제스트 파일의 16진수 인코딩 SHA-256 해시
+ 이전 다이제스트 파일의 16진수 인코딩 서명

이 문자열을 계산하기 위한 형식 및 예제 문자열은 이 문서의 뒷부분에서 제공됩니다.

## 사용자 지정 검증 구현 단계


사용자 지정 검증 솔루션을 구현할 때 먼저 다이제스트 파일을 검증한 다음 다이제스트 파일이 참조하는 로그 파일을 검증해야 합니다.

### 다이제스트 파일 검증


다이제스트 파일을 검증하려면 다이제스트 파일의 서명, 다이제스트 파일에 서명하는 데 사용된 프라이빗 키에 대한 퍼블릭 키, 사용자가 계산한 데이터 서명 문자열이 필요합니다.

1. 다이제스트 파일을 가져옵니다.

1. 다이제스트 파일이 원래 위치에서 검색되었는지 확인합니다.

1. 다이제스트 파일의 16진수 인코딩 서명을 가져옵니다.

1. 다이제스트 파일에 서명하는 데 사용된 프라이빗 키에 대한 퍼블릭 키의 16진수 인코딩 지문을 가져옵니다.

1. 다이제스트 파일에 해당하는 시간 범위의 퍼블릭 키를 검색합니다.

1. 검색된 퍼블릭 키 중에서 다이제스트 파일의 지문과 일치하는 지문을 가진 퍼블릭 키를 선택합니다.

1. 다이제스트 파일 해시 및 기타 다이제스트 파일 필드를 사용하여 다이제스트 파일 서명을 검증하는 데 사용되는 데이터 서명 문자열을 다시 생성합니다.

1. 문자열의 SHA-256 해시, 퍼블릭 키 및 서명을 RSA 서명 검증 알고리즘에 파라미터로 전달하여 서명을 검증합니다. 결과가 true이면 다이제스트 파일이 유효한 것입니다.

### 로그 파일 검증


다이제스트 파일이 유효하면 다이제스트 파일이 참조하는 각 로그 파일을 검증합니다.

1. 로그 파일의 무결성을 검증하려면 로그 파일의 압축되지 않은 내용을 기반으로 SHA-256 해시를 계산하고 그 결과를 다이제스트에 16진수로 기록된 로그 파일의 해시와 비교합니다. 해시가 서로 일치하면 로그 파일이 유효한 것입니다.

1. 현재 다이제스트 파일에 포함된 이전 다이제스트 파일에 대한 정보를 사용하여 이전 다이제스트 파일 및 해당 로그 파일을 잇따라 검증합니다.

다음 단원에서는 이러한 단계에 대해 자세히 설명합니다.

### A. 다이제스트 파일 가져오기


첫 번째 단계는 가장 최근 다이제스트 파일을 가져오고 다이제스트 파일이 원래 위치에서 검색되었는지 확인하고 해당 디지털 서명을 확인한 후 퍼블릭 키의 지문을 가져오는 것입니다.

1. S3 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html) 또는 AmazonS3Client 클래스(예)를 사용하여 Amazon S3 버킷에서 검증할 시간 범위에 해당하는 가장 최근 다이제스트 파일을 가져옵니다.

1. 파일을 검색하는 데 사용된 S3 버킷 및 S3 객체가 다이제스트 파일 자체에 기록된 S3 버킷 S3 객체 위치와 일치하는지 확인합니다.

1. 그런 다음, Amazon S3에 있는 다이제스트 파일 객체의 `x-amz-meta-signature` 메타데이터 속성에서 다이제스트 파일의 디지털 서명을 가져옵니다.

1. 다이제스트 파일의 `digestPublicKeyFingerprint` 필드에서 다이제스트 파일에 서명하는 데 사용된 프라이빗 키에 대한 퍼블릭 키의 지문을 가져옵니다.

### B. 다이제스트 파일 검증을 위한 퍼블릭 키 검색


퍼블릭 키를 가져와 다이제스트 파일을 검증하려면 AWS CLI 또는 CloudTrail API를 사용할 수 있습니다. 어느 방법을 사용하든 다이제스트 파일에 대해 검증할 시간 범위(시작 시간 및 종료 시간)를 지정합니다. 지정한 시간 범위에 대해 하나 이상의 퍼블릭 키가 반환될 수 있습니다. 반환된 키의 유효 시간 범위가 겹칠 수 있습니다.

**참고**  
CloudTrail은 리전별로 서로 다른 프라이빗/퍼블릭 키 페어를 사용하므로 각 다이제스트 파일은 해당 리전에 고유한 프라이빗 키로 서명됩니다. 따라서 특정 리전의 다이제스트 파일을 검증할 때는 동일한 리전의 퍼블릭 키를 검색해야 합니다.

#### AWS CLI 를 사용하여 퍼블릭 키 검색


를 사용하여 다이제스트 파일의 퍼블릭 키를 검색하려면 `cloudtrail list-public-keys` 명령을 AWS CLI사용합니다. 명령의 형식은 다음과 같습니다.

 `aws cloudtrail list-public-keys [--start-time <start-time>] [--end-time <end-time>]` 

시작 시간 및 종료 시간 파라미터는 UTC 타임스탬프이며 선택 사항입니다. 지정하지 않을 경우 현재 시간이 사용되며 현재 활성 상태인 퍼블릭 키가 반환됩니다.

 **예제 응답** 

응답은 반환된 키를 나타내는 JSON 객체 목록입니다.

```
{
    "publicKeyList": [
        {
            "ValidityStartTime": "1436317441.0",
            "ValidityEndTime": "1438909441.0",
            "Value": "MIIBCgKCAQEAn11L2YZ9h7onug2ILi1MWyHiMRsTQjfWE+pHVRLk1QjfWhirG+lpOa8NrwQ/r7Ah5bNL6HepznOU9XTDSfmmnP97mqyc7z/upfZdS/AHhYcGaz7n6Wc/RRBU6VmiPCrAUojuSk6/GjvA8iOPFsYDuBtviXarvuLPlrT9kAd4Lb+rFfR5peEgBEkhlzc5HuWO7S0y+KunqxX6jQBnXGMtxmPBPP0FylgWGNdFtks/4YSKcgqwH0YDcawP9GGGDAeCIqPWIXDLG1jOjRRzWfCmD0iJUkz8vTsn4hq/5ZxRFE7UBAUiVcGbdnDdvVfhF9C3dQiDq3k7adQIziLT0cShgQIDAQAB",
            "Fingerprint": "8eba5db5bea9b640d1c96a77256fe7f2"
        },
        {
            "ValidityStartTime": "1434589460.0",
            "ValidityEndTime": "1437181460.0",
            "Value": "MIIBCgKCAQEApfYL2FiZhpN74LNWVUzhR+VheYhwhYm8w0n5Gf6i95ylW5kBAWKVEmnAQG7BvS5g9SMqFDQx52fW7NWV44IvfJ2xGXT+wT+DgR6ZQ+6yxskQNqV5YcXj4Aa5Zz4jJfsYjDuO2MDTZNIzNvBNzaBJ+r2WIWAJ/Xq54kyF63B6WE38vKuDE7nSd1FqQuEoNBFLPInvgggYe2Ym1Refe2z71wNcJ2kY+q0h1BSHrSM8RWuJIw7MXwF9iQncg9jYzUlNJomozQzAG5wSRfbplcCYNY40xvGd/aAmO0m+Y+XFMrKwtLCwseHPvj843qVno6x4BJN9bpWnoPo9sdsbGoiK3QIDAQAB",
            "Fingerprint": "8933b39ddc64d26d8e14ffbf6566fee4"
        },
        {
            "ValidityStartTime": "1434589370.0",
            "ValidityEndTime": "1437181370.0",
            "Value": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqlzPJbvZJ42UdcmLfPUqXYNfOs6I8lCfao/tOs8CmzPOEdtLWugB9xoIUz78qVHdKIqxbaG4jWHfJBiOSSFBM0lt8cdVo4TnRa7oG9io5pysS6DJhBBAeXsicufsiFJR+wrUNh8RSLxL4k6G1+BhLX20tJkZ/erT97tDGBujAelqseGg3vPZbTx9SMfOLN65PdLFudLP7Gat0Z9p5jw/rjpclKfo9Bfc3heeBxWGKwBBOKnFAaN9V57pOaosCvPKmHd9bg7jsQkI9Xp22IzGLsTFJZYVA3KiTAElDMu80iFXPHEq9hKNbt9e4URFam+1utKVEiLkR2disdCmPTK0VQIDAQAB",
            "Fingerprint": "31e8b5433410dfb61a9dc45cc65b22ff"
        }
    ]
}
```

#### CloudTrail API를 사용하여 퍼블릭 키 검색


CloudTrail API를 사용하여 다이제스트 파일의 퍼블릭 키를 검색하려면 `ListPublicKeys` API에 시작 시간 및 종료 시간 값을 전달합니다. `ListPublicKeys` API는 지정된 시간 범위 내에서 다이제스트 파일에 서명하는 데 사용된 프라이빗 키에 대한 퍼블릭 키를 반환합니다. 이 API는 각 퍼블릭 키에 대해 해당 지문도 반환합니다.

##### `ListPublicKeys`


이 단원에서는 `ListPublicKeys` API에 대한 요청 파라미터 및 응답 요소에 대해 설명합니다.

**참고**  
`ListPublicKeys`의 이진 필드에 대한 인코딩은 변경될 수 있습니다.

 **요청 파라미터** 


****  

| 이름 | 설명 | 
| --- | --- | 
|  StartTime  |  선택적으로 CloudTrail 다이제스트 파일에 대한 퍼블릭 키를 검색할 시간 범위의 시작 시간(UTC)을 지정합니다. StartTime을 지정하지 않을 경우 현재 시간이 사용되며 현재 퍼블릭 키가 반환됩니다. 유형: DateTime   | 
|  EndTime  |  선택적으로 CloudTrail 다이제스트 파일에 대한 퍼블릭 키를 검색할 시간 범위의 끝 시간(UTC)을 지정합니다. EndTime을 지정하지 않을 경우 현재 시간이 사용됩니다. 유형: DateTime   | 

 **응답 요소** 

`PublicKeyList`, 다음을 포함하는 `PublicKey` 객체 배열: 


****  

|  |  | 
| --- |--- |
|  이름  |  설명  | 
|  Value  |  PKCS \$11 형식의 DER 인코딩 퍼블릭 키 값입니다. 유형: BLOB   | 
|  ValidityStartTime  |  퍼블릭 키 유효 기간의 시작 시간입니다. 유형: DateTime   | 
|  ValidityEndTime  |  퍼블릭 키 유효 기간의 종료 시간입니다. 유형: DateTime   | 
|  Fingerprint  |  퍼블릭 키의 지문. 지문은 다이제스트 파일을 검증하기 위해 사용해야 할 퍼블릭 키를 식별하는 데 사용될 수 있습니다. 유형: 문자열   | 

### C. 검증에 사용할 퍼블릭 키 선택


`list-public-keys` 또는 `ListPublicKeys`가 검색한 퍼블릭 키 중에서 다이제스트 파일의 `digestPublicKeyFingerprint` 필드에 기록된 지문과 일치하는 지문을 가진 반환된 퍼블릭 키를 선택합니다. 이 퍼블릭 키가 다이제스트 파일을 검증하는 데 사용할 퍼블릭 키입니다.

### D. 데이터 서명 문자열 다시 생성


다이제스트 파일의 서명 및 관련 퍼블릭 키를 구했으므로 이제 데이터 서명 문자열을 계산해야 합니다. 데이터 서명 문자열을 계산하면 서명을 검증하는 데 필요한 입력이 구해집니다.

데이터 서명 문자열의 형식은 다음과 같습니다.

```
Data_To_Sign_String = 
  Digest_End_Timestamp_in_UTC_Extended_format + '\n' +
  Current_Digest_File_S3_Path + '\n' +
  Hex(Sha256(current-digest-file-content)) + '\n' +
  Previous_digest_signature_in_hex
```

예제 `Data_To_Sign_String`은 다음과 같습니다.

```
2015-08-12T04:01:31Z
amzn-s3-demo-bucket/AWSLogs/111122223333/CloudTrail-Digest/us-east-2/2015/08/12/111122223333_us-east-2_CloudTrail-Digest_us-east-2_20150812T040131Z.json.gz
4ff08d7c6ecd6eb313257e839645d20363ee3784a2328a7d76b99b53cc9bcacd
6e8540b83c3ac86a0312d971a225361d28ed0af20d70c211a2d405e32abf529a8145c2966e3bb47362383a52441545ed091fb81
d4c7c09dd152b84e79099ce7a9ec35d2b264eb92eb6e090f1e5ec5d40ec8a0729c02ff57f9e30d5343a8591638f8b794972ce15bb3063a01972
98b0aee2c1c8af74ec620261529265e83a9834ebef6054979d3e9a6767dfa6fdb4ae153436c567d6ae208f988047ccfc8e5e41f7d0121e54ed66b1b904f80fb2ce304458a2a6b91685b699434b946c52589e9438f8ebe5a0d80522b2f043b3710b87d2cda43e5c1e0db921d8d540b9ad5f6d4$31b1f4a8ef2d758424329583897339493a082bb36e782143ee5464b4e3eb4ef6
```

이 문자열을 다시 생성한 후에 다이제스트 파일을 검증할 수 있습니다.

### E. 다이제스트 파일 검증


다시 생성한 데이터 서명 문자열의 SHA-256 해시, 디지털 서명 및 퍼블릭 키를 RSA 서명 검증 알고리즘에 전달합니다. 출력이 true이면 다이제스트 파일의 서명이 검증되었으며 다이제스트 파일이 유효한 것입니다.

### F. 로그 파일 검증


다이제스트 파일을 검증한 후에 다이제스트 파일이 참조하는 로그 파일을 검증할 수 있습니다. 다이제스트 파일에는 로그 파일의 SHA-256 해시가 포함되어 있습니다. CloudTrail이 로그 파일을 전송한 후 그중 하나가 수정된 경우 SHA-256 해시가 변경되어 다이제스트 파일의 서명이 일치하지 않게 됩니다.

아래에서는 로그 파일을 검증하는 방법을 보여 줍니다.

1. 다이제스트 파일의 `logFiles.s3Bucket` 및 `logFiles.s3Object` 필드의 S3 위치 정보를 사용하여 로그 파일의 `S3 Get`을 수행합니다.

1. `S3 Get` 작업이 성공하면 다이제스트 파일의 logFiles 어레이에 나열된 로그 파일 전체에 대해 이 작업을 반복합니다.

   1. 다이제스트 파일에 있는 해당 로그의 `logFiles.hashValue` 필드에서 파일의 원래 해시를 검색합니다.

   1. `logFiles.hashAlgorithm`에 지정된 해시 알고리즘을 사용하여 압축되지 않은 상태의 로그 파일 내용을 해시합니다.

   1. 생성한 해시 값을 다이제스트 파일에 있는 로그에 대한 해시 값과 비교합니다. 해시가 서로 일치하면 로그 파일이 유효한 것입니다.

### G. 추가 다이제스트 및 로그 파일 검증


각 다이제스트 파일에서 다음 필드는 이전 다이제스트 파일의 위치 및 서명을 제공합니다.
+  `previousDigestS3Bucket` 
+  `previousDigestS3Object` 
+  `previousDigestSignature` 

이 정보를 사용하여 이전 다이제스트 파일을 순차적으로 검토합니다. 이전 단원의 단계를 사용하여 각 다이제스트 파일의 서명 및 다이제스트 파일이 참조하는 로그 파일을 검증합니다. 이전 다이제스트 파일의 경우 다이제스트 파일 객체의 Amazon S3 메타데이터 속성에서 디지털 서명을 검색할 필요가 없다는 점만 다릅니다. 이전 다이제스트 파일의 서명은 `previousDigestSignature` 필드에 기본 제공되어 있습니다.

시작 다이제스트 파일에 도달할 때까지 또는 다이제스트 파일 체인이 끊어질 때까지 되돌아갈 수 있습니다.

## 오프라인으로 다이제스트 및 로그 파일 검증


다이제스트 및 로그 파일을 오프라인으로 검증할 때 일반적으로 이전 단원에 설명된 절차를 따르면 되지만, 다음과 같은 사항을 고려해야 합니다.

### 가장 최근 다이제스트 파일 처리


가장 최근("현재") 다이제스트 파일의 디지털 서명은 다이제스트 파일 객체의 Amazon S3 메타데이터 속성에 있습니다. 오프라인 시나리오에서는 현재 다이제스트 파일의 디지털 서명을 사용할 수 없습니다.

이 문제를 처리하기 위한 두 가지 가능한 방법은 다음과 같습니다.
+ 이전 다이제스트 파일에 대한 디지털 서명이 현재 다이제스트 파일에 있으므로 끝에서 두 번째 다이제스트 파일부터 검증을 시작합니다. 이 방법을 사용할 경우 가장 최근 다이제스트 파일을 검증할 수 없습니다.
+ 예비 단계로, 다이제스트 파일 객체의 메타데이터 속성에서 현재 다이제스트 파일의 서명을 가져온 후, 오프라인에 안전하게 저장합니다. 이렇게 하면 체인의 이전 파일과 함께 현재 다이제스트 파일을 검증할 수 있습니다.

### 경로 확인


다운로드된 다이제스트 파일에 있는 필드(예: `s3Object` 및 `previousDigestS3Object`)는 여전히 로그 파일 및 다이제스트 파일에 대한 Amazon S3 온라인 위치를 가리킵니다. 오프라인 솔루션은 이 위치를 다운로드된 로그 및 다이제스트 파일의 현재 경로로 다시 라우팅하는 방법을 찾아야 합니다.

### 퍼블릭 키


오프라인 검증을 위해서는 먼저 지정된 시간 범위에 있는 로그 파일을 검증하는 데 필요한 모든 퍼블릭 키를 온라인으로 구한(`ListPublicKeys` 호출) 다음 오프라인에 안전하게 저장해야 합니다. 처음 지정했던 시간 범위를 벗어나는 추가 파일을 검증할 때마다 이 단계를 반복해야 합니다.

## 검증을 위한 샘플 코드 조각


다음 샘플 코드 조각은 CloudTrail 다이제스트 및 로그 파일 검증을 위한 스켈레톤 코드를 제공합니다. 스켈레톤 코드는 온라인/오프라인에 무관하므로 AWS에 온라인으로 연결된 상태에서 코드를 구현할지 여부는 필요에 따라 선택하면 됩니다. 제안된 구현에서는 [Java Cryptography Extension(JCE)](https://en.wikipedia.org/wiki/Java_Cryptography_Extension) 및 [Bouncy Castle](https://www.bouncycastle.org/)을 보안 공급자로 사용합니다.

샘플 코드 조각은 다음을 보여 줍니다.
+ 다이제스트 파일 서명을 검증하는 데 사용되는 데이터 서명 문자열을 생성하는 방법 
+ 다이제스트 파일 서명을 검증하는 방법
+ 로그 파일 해시를 확인하는 방법
+ 다이제스트 파일 체인을 검증하기 위한 코드 구조

```
import java.util.Arrays;
import java.security.MessageDigest;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.Security;
import java.security.Signature;
import java.security.spec.X509EncodedKeySpec;
import org.json.JSONObject;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.apache.commons.codec.binary.Hex;

public class DigestFileValidator {

    public void validateDigestFile(String digestS3Bucket, String digestS3Object, String digestSignature) {
 
        // Using the Bouncy Castle provider as a JCE security provider - http://www.bouncycastle.org/
        Security.addProvider(new BouncyCastleProvider());
 
        // Load the digest file from S3 (using Amazon S3 Client) or from your local copy
        JSONObject digestFile = loadDigestFileInMemory(digestS3Bucket, digestS3Object);
 
        // Check that the digest file has been retrieved from its original location
        if (!digestFile.getString("digestS3Bucket").equals(digestS3Bucket) ||
                !digestFile.getString("digestS3Object").equals(digestS3Object)) {
            System.err.println("Digest file has been moved from its original location.");
        } else {
            // Compute digest file hash
            MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
            messageDigest.update(convertToByteArray(digestFile));
            byte[] digestFileHash = messageDigest.digest();
            messageDigest.reset();
 
            // Compute the data to sign
            String dataToSign = String.format("%s%n%s/%s%n%s%n%s",
                                digestFile.getString("digestEndTime"),
                                digestFile.getString("digestS3Bucket"), digestFile.getString("digestS3Object"), // Constructing the S3 path of the digest file as part of the data to sign
                                Hex.encodeHexString(digestFileHash),
                                digestFile.getString("previousDigestSignature"));
 
            byte[] signatureContent = Hex.decodeHex(digestSignature);
 
            /*
                NOTE: 
                To find the right public key to verify the signature, call CloudTrail ListPublicKey API to get a list 
                of public keys, then match by the publicKeyFingerprint in the digest file. Also, the public key bytes 
                returned from ListPublicKey API are DER encoded in PKCS#1 format:
 
                PublicKeyInfo ::= SEQUENCE {
                    algorithm       AlgorithmIdentifier,
                    PublicKey       BIT STRING
                }
 
                AlgorithmIdentifier ::= SEQUENCE {
                    algorithm       OBJECT IDENTIFIER,
                    parameters      ANY DEFINED BY algorithm OPTIONAL
                }                
            */
            pkcs1PublicKeyBytes = getPublicKey(digestFile.getString("digestPublicKeyFingerprint")));
 
            // Transform the PKCS#1 formatted public key to x.509 format.
            RSAPublicKey rsaPublicKey = RSAPublicKey.getInstance(pkcs1PublicKeyBytes);
            AlgorithmIdentifier rsaEncryption = new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, null);
            SubjectPublicKeyInfo publicKeyInfo = new SubjectPublicKeyInfo(rsaEncryption, rsaPublicKey);
 
            // Create the PublicKey object needed for the signature validation
            PublicKey publicKey = KeyFactory.getInstance("RSA", "BC").generatePublic(new X509EncodedKeySpec(publicKeyInfo.getEncoded()));
 
            // Verify signature
            Signature signature = Signature.getInstance("SHA256withRSA", "BC");
            signature.initVerify(publicKey);
            signature.update(dataToSign.getBytes("UTF-8"));
 
            if (signature.verify(signatureContent)) {
                System.out.println("Digest file signature is valid, validating log files…");
                for (int i = 0; i < digestFile.getJSONArray("logFiles").length(); i++) {
 
                    JSONObject logFileMetadata = digestFile.getJSONArray("logFiles").getJSONObject(i);
 
                    // Compute log file hash
                    byte[] logFileContent = loadUncompressedLogFileInMemory(
                                                logFileMetadata.getString("s3Bucket"),
                                                logFileMetadata.getString("s3Object")
                                            );
                    messageDigest.update(logFileContent);
                     byte[] logFileHash = messageDigest.digest();
                    messageDigest.reset();
 
                    // Retrieve expected hash for the log file being processed
                    byte[] expectedHash = Hex.decodeHex(logFileMetadata.getString("hashValue"));
 
                    boolean signaturesMatch = Arrays.equals(expectedHash, logFileHash);
                    if (!signaturesMatch) {
                        System.err.println(String.format("Log file: %s/%s hash doesn't match.\tExpected: %s Actual: %s",
                               logFileMetadata.getString("s3Bucket"), logFileMetadata.getString("s3Object"),
                               Hex.encodeHexString(expectedHash), Hex.encodeHexString(logFileHash)));
                    } else {
                        System.out.println(String.format("Log file: %s/%s hash match",
                               logFileMetadata.getString("s3Bucket"), logFileMetadata.getString("s3Object")));
                    }
                }
 
            } else {
                System.err.println("Digest signature failed validation.");
            }
 
            System.out.println("Digest file validation completed.");
 
            if (chainValidationIsEnabled()) {
                // This enables the digests' chain validation
                validateDigestFile(
                        digestFile.getString("previousDigestS3Bucket"),
                        digestFile.getString("previousDigestS3Object"),
                        digestFile.getString("previousDigestSignature"));
            }
        }
    }
}
```

# CloudTrail 로그 파일의 예


CloudTrail은 계정에 대한 이벤트를 모니터링합니다. 사용자가 추적을 생성하면 CloudTrail에서 이러한 이벤트를 로그 파일 형태로 Amazon S3 버킷에 전달합니다. CloudTrail Lake에서 이벤트 데이터 스토어를 생성하는 경우 이벤트 데이터 스토어에 이벤트가 로깅됩니다. 이벤트 데이터 스토어는 S3 버킷을 사용하지 않습니다.

**Topics**
+ [

## CloudTrail 로그 파일 이름 형식
](#cloudtrail-log-filename-format)
+ [

## 로그 파일의 예
](#cloudtrail-log-file-examples-section)

## CloudTrail 로그 파일 이름 형식


CloudTrail은 Amazon S3 버킷으로 전달하는 로그 파일 객체에 대해 다음 파일 이름 형식을 사용합니다.

```
AccountID_CloudTrail_RegionName_YYYYMMDDTHHmmZ_UniqueString.FileNameFormat 
```
+ `YYYY`, `MM`, `DD`, `HH` 및 `mm`은 로그 파일이 전송된 연도, 월, 일, 시, 분에 대한 숫자입니다. 시간은 24시간 형식입니다. `Z`는 시간이 UTC 기준임을 나타냅니다.
**참고**  
로그 파일에는 해당 파일이 전송된 시간 이전에 기록된 레코드가 포함될 수 있습니다.
+ 로그 파일 이름의 16자 `UniqueString` 구성 요소는 파일의 덮어쓰기를 방지할 목적으로 사용됩니다. 특별한 의미가 없으므로 로그 처리 소프트웨어가 무시해도 됩니다.
+ `FileNameFormat`은 파일의 인코딩입니다. 현재 인코딩은 `json.gz`이며, 압축 gzip 형식의 JSON 텍스트 파일입니다.

 **CloudTrail 로그 파일 이름의 예**

```
111122223333_CloudTrail_us-east-2_20150801T0210Z_Mu0KsOhtH1ar15ZZ.json.gz 
```

## 로그 파일의 예


로그 파일에는 하나 이상의 레코드가 포함되어 있습니다. 다음 예는 로그 파일의 생성을 시작한 작업에 대한 레코드를 보여 주는 로그의 조각입니다.

CloudTrail 이벤트 레코드 필드에 대한 자세한 내용은 [관리, 데이터 및 네트워크 활동 이벤트에 대한 CloudTrail 레코드 콘텐츠](cloudtrail-event-reference-record-contents.md) 섹션을 참조하세요.

**Contents**
+ [

### Amazon EC2 로그 예
](#cloudtrail-log-file-examples-ec2)
+ [

### IAM 로그의 예
](#cloudtrail-log-file-examples-iam)
+ [

### 오류 코드 및 메시지 로그의 예
](#error-code-and-error-message)
+ [

### CloudTrail 인사이트 이벤트 로그의 예
](#insights-event-example)

### Amazon EC2 로그 예


Amazon Elastic Compute Cloud(Amazon EC2)는 AWS 클라우드에서 확장 가능한 컴퓨팅 용량을 제공합니다. 가상 서버를 시작하고 보안 및 네트워크를 구성하며 스토리지를 관리할 수 있습니다. 또한 Amazon EC2는 요구 사항의 변경이나 사용량 스파이크를 처리하기 위해 빠르게 확장 또는 축소할 수 있으므로 서버 트래픽을 예측할 필요가 줄어듭니다. 자세한 내용은 [Amazon EC2 사용 설명서](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/)를 참조하세요.

다음 예는 `Mateo`라는 IAM 사용자가 **aws ec2 start-instances** 명령을 실행하여 인스턴스 `i-EXAMPLE56126103cb`, `i-EXAMPLEaff4840c22`에 대한 Amazon EC2 [https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_StartInstances.html](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_StartInstances.html) 작업을 호출했음을 보여 줍니다.

```
{"Records": [{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "EXAMPLE6E4XEGITWATV6R",
        "arn": "arn:aws:iam::123456789012:user/Mateo",
        "accountId": "123456789012",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "userName": "Mateo",
        "sessionContext": {
            "sessionIssuer": {},
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2023-07-19T21:11:57Z",
                "mfaAuthenticated": "false"
            }
        }
    },
    "eventTime": "2023-07-19T21:17:28Z",
    "eventSource": "ec2.amazonaws.com",
    "eventName": "StartInstances",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "192.0.2.0",
    "userAgent": "aws-cli/2.13.5 Python/3.11.4 Linux/4.14.255-314-253.539.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off command/ec2.start-instances",
    "requestParameters": {
        "instancesSet": {
            "items": [
                {
                    "instanceId": "i-EXAMPLE56126103cb"
                },
                {
                    "instanceId": "i-EXAMPLEaff4840c22"
                }
            ]
        }
    },
    "responseElements": {
        "requestId": "e4336db0-149f-4a6b-844d-EXAMPLEb9d16",
        "instancesSet": {
            "items": [
                {
                    "instanceId": "i-EXAMPLEaff4840c22",
                    "currentState": {
                        "code": 0,
                        "name": "pending"
                    },
                    "previousState": {
                        "code": 80,
                        "name": "stopped"
                    }
                },
                {
                    "instanceId": "i-EXAMPLE56126103cb",
                    "currentState": {
                        "code": 0,
                        "name": "pending"
                    },
                    "previousState": {
                        "code": 80,
                        "name": "stopped"
                    }
                }
            ]
        }
    },
    "requestID": "e4336db0-149f-4a6b-844d-EXAMPLEb9d16",
    "eventID": "e755e09c-42f9-4c5c-9064-EXAMPLE228c7",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "123456789012",
    "eventCategory": "Management",
     "tlsDetails": {
        "tlsVersion": "TLSv1.2",
        "cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256",
        "clientProvidedHostHeader": "ec2.us-east-1.amazonaws.com"
    },
    "sessionCredentialFromConsole": "true"
}]}
```

다음 예에서는 `Nikki`라는 IAM 사용자가 에서 **aws ec2 stop-instances** 명령을 사용하여 두 개의 인스턴스를 중단하는 Amazon EC2 [https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_StopInstances.html](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_StopInstances.html) 작업을 호출했음을 보여 줍니다.

```
{"Records": [{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "EXAMPLE6E4XEGITWATV6R",
        "arn": "arn:aws:iam::777788889999:user/Nikki",
        "accountId": "777788889999",
        "accessKeyId": "AKIAI44QH8DHBEXAMPLE",
        "userName": "Nikki",
        "sessionContext": {
            "sessionIssuer": {},
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2023-07-19T21:11:57Z",
                "mfaAuthenticated": "false"
            }
        }
    },
    "eventTime": "2023-07-19T21:14:20Z",
    "eventSource": "ec2.amazonaws.com",
    "eventName": "StopInstances",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "192.0.2.0",
    "userAgent": "aws-cli/2.13.5 Python/3.11.4 Linux/4.14.255-314-253.539.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off command/ec2.stop-instances",
    "requestParameters": {
        "instancesSet": {
            "items": [
                {
                    "instanceId": "i-EXAMPLE56126103cb"
                },
                {
                    "instanceId": "i-EXAMPLEaff4840c22"
                }
            ]
        },
        "force": false
    },
    "responseElements": {
        "requestId": "c308a950-e43e-444e-afc1-EXAMPLE73e49",
        "instancesSet": {
            "items": [
                {
                    "instanceId": "i-EXAMPLE56126103cb",
                    "currentState": {
                        "code": 64,
                        "name": "stopping"
                    },
                    "previousState": {
                        "code": 16,
                        "name": "running"
                    }
                },
                {
                    "instanceId": "i-EXAMPLEaff4840c22",
                    "currentState": {
                        "code": 64,
                        "name": "stopping"
                    },
                    "previousState": {
                        "code": 16,
                        "name": "running"
                    }
                }
            ]
        }
    },
    "requestID": "c308a950-e43e-444e-afc1-EXAMPLE73e49",
    "eventID": "9357a8cc-a0eb-46a1-b67e-EXAMPLE19b14",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "777788889999",
    "eventCategory": "Management",
     "tlsDetails": {
        "tlsVersion": "TLSv1.2",
        "cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256",
        "clientProvidedHostHeader": "ec2.us-east-1.amazonaws.com"
    },
    "sessionCredentialFromConsole": "true"
}]}
```

다음 예제는 `Arnav`라는 IAM 사용자가 **aws ec2 create-key-pair** 명령을 실행하여 [https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateKeyPair.html](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateKeyPair.html) 작업을 호출했음을 보여 줍니다. 에는 키 페어의 해시가 `responseElements` 포함되어 있으며 키 구성 요소를 AWS 제거했습니다.

```
{"Records": [{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "AIDA6ON6E4XEGIEXAMPLE",
        "arn": "arn:aws:iam::444455556666:user/Arnav",
        "accountId": "444455556666",
        "accessKeyId": "AKIAI44QH8DHBEXAMPLE",
        "userName": "Arnav",
        "sessionContext": {
            "sessionIssuer": {},
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2023-07-19T21:11:57Z",
                "mfaAuthenticated": "false"
            }
        }
    },
    "eventTime": "2023-07-19T21:19:22Z",
    "eventSource": "ec2.amazonaws.com",
    "eventName": "CreateKeyPair",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "192.0.2.0",
    "userAgent": "aws-cli/2.13.5 Python/3.11.4 Linux/4.14.255-314-253.539.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off command/ec2.create-key-pair",
    "requestParameters": {
        "keyName": "my-key",
        "keyType": "rsa",
        "keyFormat": "pem"
    },
    "responseElements": {
        "requestId": "9aa4938f-720f-4f4b-9637-EXAMPLE9a196",
        "keyName": "my-key",
        "keyFingerprint": "1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f",
        "keyPairId": "key-abcd12345eEXAMPLE",
        "keyMaterial": "<sensitiveDataRemoved>"
    },
    "requestID": "9aa4938f-720f-4f4b-9637-EXAMPLE9a196",
    "eventID": "2ae450ff-e72b-4de1-87b0-EXAMPLE5227cb",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "444455556666",
    "eventCategory": "Management",
    "tlsDetails": {
        "tlsVersion": "TLSv1.2",
        "cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256",
        "clientProvidedHostHeader": "ec2.us-east-1.amazonaws.com"
    },
    "sessionCredentialFromConsole": "true"
}]}
```

### IAM 로그의 예


AWS Identity and Access Management (IAM)는 리소스에 대한 액세스를 안전하게 제어하는 데 AWS 도움이 되는 웹 서비스입니다. IAM을 사용하면 사용자가 액세스할 수 있는 AWS 리소스를 제어하는 권한을 중앙에서 관리할 수 있습니다. IAM을 사용하여 리소스를 사용하도록 인증(로그인) 및 권한 부여(권한 있음)된 대상을 제어합니다. 자세한 내용은 [IAM 사용 설명서](https://docs.aws.amazon.com/IAM/latest/UserGuide/)를 참조하십시오.

다음 예에서는 `Mary`라는 IAM 사용자가 **aws iam create-user** 명령을 호출하여 `Richard`이라는 새 사용자를 생성하는 [https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateUser.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateUser.html) 작업을 호출했음을 보여 줍니다.

```
{"Records": [{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "AIDA6ON6E4XEGITEXAMPLE",
        "arn": "arn:aws:iam::888888888888:user/Mary",
        "accountId": "888888888888",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "userName": "Mary",
        "sessionContext": {
            "sessionIssuer": {},
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2023-07-19T21:11:57Z",
                "mfaAuthenticated": "false"
            }
        }
    },
    "eventTime": "2023-07-19T21:25:09Z",
    "eventSource": "iam.amazonaws.com",
    "eventName": "CreateUser",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "192.0.2.0",
    "userAgent": "aws-cli/2.13.5 Python/3.11.4 Linux/4.14.255-314-253.539.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off command/iam.create-user",
    "requestParameters": {
        "userName": "Richard"
    },
    "responseElements": {
        "user": {
            "path": "/",
            "arn": "arn:aws:iam::888888888888:user/Richard",
            "userId": "AIDA6ON6E4XEP7EXAMPLE",
            "createDate": "Jul 19, 2023 9:25:09 PM",
            "userName": "Richard"
        }
    },
    "requestID": "2d528c76-329e-410b-9516-EXAMPLE565dc",
    "eventID": "ba0801a1-87ec-4d26-be87-EXAMPLE75bbb",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "888888888888",
    "eventCategory": "Management",
    "tlsDetails": {
        "tlsVersion": "TLSv1.2",
        "cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256",
        "clientProvidedHostHeader": "iam.amazonaws.com"
    },
    "sessionCredentialFromConsole": "true"
}]}
```

다음 예에서는 `Paulo`라는 IAM 사용자가 **aws iam add-user-to-group** 명령을 실행하여 `Jane`이라는 사용자를 `Admin` 그룹에 추가하는 [https://docs.aws.amazon.com/IAM/latest/APIReference/API_AddUserToGroup.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AddUserToGroup.html) 작업을 호출했음을 보여 줍니다.

```
{"Records": [{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "AIDA6ON6E4XEGIEXAMPLE",
        "arn": "arn:aws:iam::555555555555:user/Paulo",
        "accountId": "555555555555",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "userName": "Paulo",
        "sessionContext": {
            "sessionIssuer": {},
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2023-07-19T21:11:57Z",
                "mfaAuthenticated": "false"
            }
        }
    },
    "eventTime": "2023-07-19T21:25:09Z",
    "eventSource": "iam.amazonaws.com",
    "eventName": "AddUserToGroup",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "192.0.2.0",
    "userAgent": "aws-cli/2.13.5 Python/3.11.4 Linux/4.14.255-314-253.539.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off command/iam.add-user-to-group",
    "requestParameters": {
        "groupName": "Admin",
        "userName": "Jane"
    },
    "responseElements": null,
    "requestID": "ecd94349-b36f-44bf-b6f5-EXAMPLE9c463",
    "eventID": "2939ba50-1d26-4a5a-83bd-EXAMPLE85850",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "555555555555",
    "eventCategory": "Management",
    "tlsDetails": {
        "tlsVersion": "TLSv1.2",
        "cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256",
        "clientProvidedHostHeader": "iam.amazonaws.com"
    },
    "sessionCredentialFromConsole": "true"
}]}
```

다음 예에서는 `Saanvi`라는 IAM 사용자가 **aws iam create-role** 명령을 실행하여 새 역할을 생성하는 [https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html) 작업을 호출했음을 보여 줍니다.

```
{"Records": [{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "AIDA6ON6E4XEGITEXAMPLE",
        "arn": "arn:aws:iam::777777777777:user/Saanvi",
        "accountId": "777777777777",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "userName": "Saanvi",
        "sessionContext": {
            "sessionIssuer": {},
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2023-07-19T21:11:57Z",
                "mfaAuthenticated": "false"
            }
        }
    },
    "eventTime": "2023-07-19T21:29:12Z",
    "eventSource": "iam.amazonaws.com",
    "eventName": "CreateRole",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "192.0.2.0",
    "userAgent": "aws-cli/2.13.5 Python/3.11.4 Linux/4.14.255-314-253.539.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off command/iam.create-role",
    "requestParameters": {
        "roleName": "TestRole",
        "description": "Allows EC2 instances to call AWS services on your behalf.",
        "assumeRolePolicyDocument": "{\"Version\":\"2012-10-17\",		 	 	 \"Statement\":[{\"Effect\":\"Allow\",\"Action\":[\"sts:AssumeRole\"],\"Principal\":{\"Service\":[\"ec2.amazonaws.com\"]}}]}"
    },
    "responseElements": {
        "role": {
            "assumeRolePolicyDocument": "policy-statement",
            "arn": "arn:aws:iam::777777777777:role/TestRole",
            "roleId": "AROA6ON6E4XEFFEXAMPLE",
            "createDate": "Jul 19, 2023 9:29:12 PM",
            "roleName": "TestRole",
            "path": "/"
        }
    },
    "requestID": "ff38f36e-ebd3-425b-9939-EXAMPLE1bbe",
    "eventID": "9da77cd0-493f-4c89-8852-EXAMPLEa887c",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "777777777777",
    "eventCategory": "Management",
    "tlsDetails": {
        "tlsVersion": "TLSv1.2",
        "cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256",
        "clientProvidedHostHeader": "iam.amazonaws.com"
    },
    "sessionCredentialFromConsole": "true"
}]}
```

### 오류 코드 및 메시지 로그의 예


다음 예에서는 `Terry`라는 IAM 사용자가 **aws cloudtrail update-trail** 명령을 실행하여 `myTrail2`라는 트레일을 업데이트하는 [https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_UpdateTrail.html](https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_UpdateTrail.html) 작업을 호출했지만, 추적 이름을 찾을 수 없음을 보여 줍니다. 이 로그는 `errorCode` 및 `errorMessage` 요소에 이 오류를 표시합니다.

```
{"Records": [{
    "eventVersion": "1.09",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "AIDA6ON6E4XEGIEXAMPLE",
        "arn": "arn:aws:iam::111122223333:user/Terry",
        "accountId": "111122223333",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "userName": "Terry",
        "sessionContext": {
            "attributes": {
                "creationDate": "2023-07-19T21:11:57Z",
                "mfaAuthenticated": "false"
            }
        }
    },
    "eventTime": "2023-07-19T21:35:03Z",
    "eventSource": "cloudtrail.amazonaws.com",
    "eventName": "UpdateTrail",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "192.0.2.0",
    "userAgent": "aws-cli/2.13.0 Python/3.11.4 Linux/4.14.255-314-253.539.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off command/cloudtrail.update-trail",
    "errorCode": "TrailNotFoundException",
    "errorMessage": "Unknown trail: arn:aws:cloudtrail:us-east-1:111122223333:trail/myTrail2 for the user: 111122223333",
    "requestParameters": {
        "name": "myTrail2",
        "isMultiRegionTrail": true
    },
    "responseElements": null,
    "requestID": "28d2faaf-3319-4649-998d-EXAMPLE72818",
    "eventID": "694d604a-d190-4470-8dd1-EXAMPLEe20c1",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "111122223333",
    "eventCategory": "Management",
    "tlsDetails": {
        "tlsVersion": "TLSv1.2",
        "cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256",
        "clientProvidedHostHeader": "cloudtrail.us-east-1.amazonaws.com"
    },
    "sessionCredentialFromConsole": "true"
}]}
```

### CloudTrail 인사이트 이벤트 로그의 예


다음 예에서는 CloudTrail 인사이트 이벤트 로그를 보여 줍니다. Insights 이벤트는 실제로 비정상적인 쓰기 관리 API 활동 또는 오류 응답 활동 기간의 시작과 끝을 표시하는 한 쌍의 이벤트입니다. `state` 필드에는 비정상적인 활동 기간의 시작 또는 종료 시 이벤트가 로깅되었는지 여부가 표시됩니다. 이벤트 이름인 `UpdateInstanceInformation`은 비정상적인 활동이 발생했음을 확인하기 위해 CloudTrail에서 관리 이벤트를 분석한 AWS Systems Manager API와 동일한 이름입니다. 시작 및 종료 이벤트에는 고유한 `eventID` 값이 있지만 쌍에서 사용하는 `sharedEventID` 값도 있습니다. 인사이트 이벤트는 정상적인 활동 패턴인 `baseline`과 시작 인사이트 이벤트를 트리거한 평균적인 비정상적 활동인 `insight`, 그리고 종료 이벤트에서 인사이트 이벤트가 지속되는 동안 평균적인 비정상적 활동의 `insight` 값을 표시합니다. CloudTrail Insights에 대한 자세한 내용은 [CloudTrail Insights를 사용한 작업](logging-insights-events-with-cloudtrail.md) 단원을 참조하세요.

```
{
    "Records": [{
        "eventVersion": "1.08",
        "eventTime": "2023-01-02T02:51:00Z",
        "awsRegion": "us-east-1",
        "eventID": "654a30ff-b0f3-4527-81b6-EXAMPLEf2393",
        "eventType": "AwsCloudTrailInsight",
        "recipientAccountId": "123456789012",
        "sharedEventID": "bcbfc274-8559-4a56-beb0-EXAMPLEa6c34",
        "insightDetails": {
            "state": "Start",
            "eventSource": "ssm.amazonaws.com",
            "eventName": "UpdateInstanceInformation",
            "insightType": "ApiCallRateInsight",
            "insightContext": {
                "statistics": {
                    "baseline": {
                        "average": 84.410596421
                    },
                    "insight": {
                        "average": 669
                    }
                }
            }
        },
        "eventCategory": "Insight"
    },
    {
        "eventVersion": "1.08",
        "eventTime": "2023-01-02T00:22:00Z",
        "awsRegion": "us-east-1",
        "eventID": "258de2fb-e2a9-4fb5-aeb2-EXAMPLE449a4",
        "eventType": "AwsCloudTrailInsight",
        "recipientAccountId": "123456789012",
        "sharedEventID": "8b74a7bc-d5d3-4d19-9d60-EXAMPLE08b51",
        "insightDetails": {
            "state": "End",
            "eventSource": "ssm.amazonaws.com",
            "eventName": "UpdateInstanceInformation",
            "insightType": "ApiCallRateInsight",
            "insightContext": {
                "statistics": {
                    "baseline": {
                        "average": 74.156423842
                    },
                    "insight": {
                        "average": 657
                    },
                    "insightDuration": 1
                }
            }
        },
        "eventCategory": "Insight"
    }]
}
```

# CloudTrail Processing Library 사용


CloudTrail Processing Library는 AWS CloudTrail 로그를 쉽게 처리할 수 있는 Java 라이브러리입니다. 개발자는 CloudTrail SQS 대기열에 관한 구성 세부 정보를 제공하고 이벤트를 처리하기 위한 코드를 작성하기만 하면 됩니다. CloudTrail Processing Library가 나머지 작업을 처리합니다. 즉, Amazon SQS 대기열을 폴링하며 대기열 메시지를 읽고 구문 분석하고 CloudTrail 로그 파일을 다운로드하며 로그 파일의 이벤트를 구문 분석하고 이벤트를 Java 객체로 코드에 전달합니다.

CloudTrail Processing Library는 확장성과 내결함성이 뛰어납니다. 로그 파일을 병렬 처리하여 로그를 필요한 만큼 처리할 수 있습니다. 또한 네트워크 시간 초과 및 액세스할 수 없는 리소스와 관련된 네트워크 장애를 처리합니다.

다음 주제에서는 CloudTrail Processing Library를 사용하여 Java 프로젝트에서 CloudTrail 로그를 처리하는 방법을 보여 줍니다.

라이브러리는 GitHub([https://github.com/aws/aws-cloudtrail-processing-library](https://github.com/aws/aws-cloudtrail-processing-library))에서 사용할 수 있는 Apache 라이선스 오픈 소스 프로젝트로 제공됩니다. 라이브러리 소스에는 자체 프로젝트를 생성할 때 토대로 사용할 수 있는 샘플 코드가 포함되어 있습니다.

**Topics**
+ [

## 최소 요구 사항
](#use-the-cloudtrail-processing-library-prerequisites)
+ [

## CloudTrail 로그 처리
](#use-the-cloudtrail-processing-library-how-to)
+ [

## 고급 주제
](#use-the-cloudtrail-processing-library-advanced)
+ [

## 추가 리소스
](#UsingProcessingLib-ar)

## 최소 요구 사항


CloudTrail Processing Library를 사용하려면 다음 항목이 있어야 합니다.
+ [AWS SDK for Java 1.11.830](https://github.com/aws/aws-sdk-java)
+ [Java 1.8(Java SE 8)](https://www.oracle.com/java/technologies/java-se-glance.html)

## CloudTrail 로그 처리


Java 애플리케이션에서 CloudTrail 로그를 처리하려면

1. [프로젝트에 CloudTrail Processing Library 추가](#use-the-cloudtrail-processing-library-add-to-project)

1. [CloudTrail Processing Library 구성](#use-the-cloudtrail-processing-library-configure)

1. [이벤트 프로세서 구현](#use-the-cloudtrail-processing-library-implement-events-processor)

1. [Processing Executor 인스턴스화 및 실행](#use-the-cloudtrail-processing-library-instantiate-and-run-executor)

### 프로젝트에 CloudTrail Processing Library 추가


CloudTrail Processing Library를 사용하려면 Java 프로젝트의 classpath에 추가합니다.

**Contents**
+ [

#### Apache Ant 프로젝트에 라이브러리 추가
](#use-the-cloudtrail-processing-library-add-to-project-apache-ant)
+ [

#### Apache Maven 프로젝트에 라이브러리 추가
](#use-the-cloudtrail-processing-library-add-to-project-apache-maven)
+ [

#### Eclipse 프로젝트에 라이브러리 추가
](#use-the-cloudtrail-processing-library-add-to-project-eclipse)
+ [

#### IntelliJ 프로젝트에 라이브러리 추가
](#use-the-cloudtrail-processing-library-add-to-intellij-project)

#### Apache Ant 프로젝트에 라이브러리 추가


**Apache Ant 프로젝트에 CloudTrail Processing Library를 추가하려면**

1. 다음 GitHub에서 CloudTrail Processing Library 소스 코드를 다운로드하거나 복제합니다.
   + [https://github.com/aws/aws-cloudtrail-processing-library](https://github.com/aws/aws-cloudtrail-processing-library)

1. [README](https://github.com/aws/aws-cloudtrail-processing-library/blob/master/README.rst)에 설명된 대로 다음과 같이 소스에서 .jar 파일을 구축합니다.

   ```
   mvn clean install -Dgpg.skip=true
   ```

1. 결과 .jar 파일을 프로젝트에 복사하고 프로젝트의 `build.xml` 파일에 추가합니다. 예제: 

   ```
   <classpath>
     <pathelement path="${classpath}"/>
     <pathelement location="lib/aws-cloudtrail-processing-library-1.6.1.jar"/>
   </classpath>
   ```

#### Apache Maven 프로젝트에 라이브러리 추가


CloudTrail Processing Library는 [Apache Maven](https://maven.apache.org/)에서 사용할 수 있습니다. 프로젝트의 `pom.xml` 파일에 단일 종속성을 작성하여 프로젝트에 라이브러리를 추가할 수 있습니다.

**Maven 프로젝트에 CloudTrail Processing Library를 추가하려면**
+ Maven 프로젝트의 `pom.xml` 파일을 열고 다음 종속성을 추가합니다.

  ```
  <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-cloudtrail-processing-library</artifactId>
      <version>1.6.1</version>
  </dependency>
  ```

#### Eclipse 프로젝트에 라이브러리 추가


**Eclipse 프로젝트에 CloudTrail Processing Library를 추가하려면**

1. 다음 GitHub에서 CloudTrail Processing Library 소스 코드를 다운로드하거나 복제합니다.
   + [https://github.com/aws/aws-cloudtrail-processing-library](https://github.com/aws/aws-cloudtrail-processing-library)

1. [README](https://github.com/aws/aws-cloudtrail-processing-library/blob/master/README.rst)에 설명된 대로 다음과 같이 소스에서 .jar 파일을 구축합니다.

   ```
   mvn clean install -Dgpg.skip=true
   ```

1. 구축한 aws-cloudtrail-processing-library-1.6.1.jar를 프로젝트의 디렉터리(일반적으로 `lib`)에 복사합니다.

1. Eclipse [**Project Explorer**]에서 프로젝트의 이름을 마우스 오른쪽 버튼으로 클릭하고 [**Build Path**]를 선택한 다음 [**Configure**]를 선택합니다.

1. [**Java Build Path**] 창에서 [**Libraries**] 탭을 선택합니다.

1. **JAR 추가(Add JARs...)**를 선택하고 aws-cloudtrail-processing-library-1.6.1.jar를 복사한 경로로 이동합니다.

1. [**OK**]를 선택하여 프로젝트에 `.jar` 추가를 완료합니다.

#### IntelliJ 프로젝트에 라이브러리 추가


**IntelliJ 프로젝트에 CloudTrail Processing Library를 추가하려면**

1. 다음 GitHub에서 CloudTrail Processing Library 소스 코드를 다운로드하거나 복제합니다.
   + [https://github.com/aws/aws-cloudtrail-processing-library](https://github.com/aws/aws-cloudtrail-processing-library)

1. [README](https://github.com/aws/aws-cloudtrail-processing-library/blob/master/README.rst)에 설명된 대로 다음과 같이 소스에서 .jar 파일을 구축합니다.

   ```
   mvn clean install -Dgpg.skip=true
   ```

1. [**File**]에서 [**Project Structure**]를 선택합니다.

1. [**Modules**]를 선택한 다음 [**Dependencies**]를 선택합니다.

1. [**\$1 JARS or Directories**]를 선택한 다음 `aws-cloudtrail-processing-library-1.6.1.jar`를 빌드한 경로로 이동합니다.

1. [**Apply**]를 선택한 다음 [**OK**]를 선택하여 프로젝트에 `.jar` 추가를 완료합니다.

### CloudTrail Processing Library 구성


런타임 시 로드되는 classpath 속성 파일을 생성하거나 `ClientConfiguration` 객체를 생성하고 수동으로 옵션을 설정하여 CloudTrail Processing Library를 구성할 수 있습니다.

#### 속성 파일 제공


애플리케이션에 구성 옵션을 제공하는 classpath 속성 파일을 작성할 수 있습니다. 다음 예제 파일에서는 설정할 수 있는 옵션을 보여 줍니다.

```
# AWS access key. (Required)
accessKey = your_access_key

# AWS secret key. (Required)
secretKey = your_secret_key

# The SQS URL used to pull CloudTrail notification from. (Required)
sqsUrl = your_sqs_queue_url

# The SQS end point specific to a region.
sqsRegion = us-east-1

# A period of time during which Amazon SQS prevents other consuming components
# from receiving and processing that message.
visibilityTimeout = 60

# The S3 region to use.
s3Region = us-east-1

# Number of threads used to download S3 files in parallel. Callbacks can be
# invoked from any thread.
threadCount = 1

# The time allowed, in seconds, for threads to shut down after
# AWSCloudTrailEventProcessingExecutor.stop() is called. If they are still
# running beyond this time, they will be forcibly terminated.
threadTerminationDelaySeconds = 60

# The maximum number of AWSCloudTrailClientEvents sent to a single invocation
# of processEvents().
maxEventsPerEmit = 10

# Whether to include raw event information in CloudTrailDeliveryInfo.
enableRawEventInfo = false

# Whether to delete SQS message when the CloudTrail Processing Library is unable to process the notification.
deleteMessageUponFailure = false
```

다음 파라미터는 필수 파라미터입니다.
+ `sqsUrl` – CloudTrail 알림을 가져올 URL을 제공합니다. 이 값을 지정하지 않은 경우 `AWSCloudTrailProcessingExecutor`에서 `IllegalStateException`을 내보냅니다.
+ `accessKey` - 계정에 대한 고유 식별자(예: AKIAIOSFODNN7EXAMPLE).
+ `secretKey` - 계정에 대한 고유 식별자(예: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY).

`accessKey` 및 `secretKey` 파라미터는 라이브러리가 사용자를 AWS AWS 대신하여에 액세스할 수 있도록 라이브러리에 자격 증명을 제공합니다.

다른 파라미터의 기본값은 라이브러리에서 설정됩니다. 자세한 내용은 [AWS CloudTrail Processing Library 참조](https://docs.aws.amazon.com/awscloudtrail/latest/processinglib/) 단원을 참조하세요.

#### ClientConfiguration 생성


classpath 속성에서 옵션을 설정하는 대신, 다음 예와 같이 `ClientConfiguration` 객체에서 옵션을 초기화하고 설정하여 `AWSCloudTrailProcessingExecutor`에 옵션을 제공할 수 있습니다.

```
ClientConfiguration basicConfig = new ClientConfiguration(
    "http://sqs.us-east-1.amazonaws.com/123456789012/queue2",
    new DefaultAWSCredentialsProviderChain());

basicConfig.setEnableRawEventInfo(true);
basicConfig.setThreadCount(4);
basicConfig.setnEventsPerEmit(20);
```

### 이벤트 프로세서 구현


CloudTrail 로그를 처리하려면 CloudTrail 로그 데이터를 수신하는 `EventsProcessor`를 구현해야 합니다. 다음은 구현의 예입니다.

```
public class SampleEventsProcessor implements EventsProcessor {

    public void process(List<CloudTrailEvent> events) {
        int i = 0;
        for (CloudTrailEvent event : events) {
            System.out.println(String.format("Process event %d : %s", i++, event.getEventData()));
        }
    }
}
```

`EventsProcessor`를 구현할 경우 `AWSCloudTrailProcessingExecutor`가 CloudTrail 이벤트를 전송하는 데 사용하는 `process()` 콜백을 구현합니다. 이벤트는 `CloudTrailClientEvent` 객체 목록에 제공됩니다.

`CloudTrailClientEvent` 객체는 CloudTrail 이벤트 및 전달 정보를 읽는 데 사용할 수 있는 `CloudTrailEvent` 및 `CloudTrailEventMetadata`를 제공합니다.

이 간단한 예에서는 `SampleEventsProcessor`에 전달된 각 이벤트에 대한 이벤트 정보를 인쇄합니다. 자체 구현에서는 적절한 방식으로 로그를 처리할 수 있습니다. `AWSCloudTrailProcessingExecutor`에 전송할 이벤트가 있고 실행되는 동안에는 계속해서 `EventsProcessor`로 이벤트를 전송합니다.

### Processing Executor 인스턴스화 및 실행


`EventsProcessor`를 작성하고 CloudTrail Processing Library에 대한 구성 값을 설정(속성 파일에서 설정 또는 `ClientConfiguration` 클래스를 사용하여 설정)한 후 이러한 요소를 사용하여 `AWSCloudTrailProcessingExecutor`를 초기화하고 사용할 수 있습니다.

**`AWSCloudTrailProcessingExecutor`를 사용하여 CloudTrail 이벤트를 처리하려면**

1. `AWSCloudTrailProcessingExecutor.Builder` 객체를 인스턴스화합니다. `Builder`의 생성자는 `EventsProcessor` 객체와 classpath 속성 파일 이름을 사용합니다.

1. `Builder`의 `build()` 팩토리 메서드를 호출하여 `AWSCloudTrailProcessingExecutor` 객체를 구성하고 가져옵니다.

1. `AWSCloudTrailProcessingExecutor`의 `start()` 및 `stop()` 메서드를 사용하여 CloudTrail 이벤트 처리를 시작 및 종료합니다.

```
public class SampleApp {
  public static void main(String[] args) throws InterruptedException {
    AWSCloudTrailProcessingExecutor executor = new
      AWSCloudTrailProcessingExecutor.Builder(new SampleEventsProcessor(),
        "/myproject/cloudtrailprocessing.properties").build();

    executor.start();
    Thread.sleep(24 * 60 * 60 * 1000); // let it run for a while (optional)
    executor.stop(); // optional
  }
}
```

## 고급 주제


**Topics**
+ [

### 처리할 이벤트 필터링
](#use-the-cloudtrail-processing-library-advanced-filter-events)
+ [

### 데이터 이벤트 처리
](#use-the-cpl-advanced-integers-floats)
+ [

### 진행률 보고
](#use-the-cloudtrail-processing-library-advanced-report-progress)
+ [

### 오류 처리
](#use-the-cloudtrail-processing-library-advanced-handle-errors)

### 처리할 이벤트 필터링


기본적으로 Amazon SQS 대기열의 S3 버킷에 있는 모든 로그 및 로그에 포함된 모든 이벤트는 ​`EventsProcessor`에 전송됩니다. CloudTrail Processing Library는 CloudTrail 로그를 가져오는 데 사용되는 소스를 필터링하고 처리할 이벤트를 필터링하기 위해 구현할 수 있는 선택적 인터페이스를 제공합니다.

`SourceFilter`  
`SourceFilter` 인터페이스를 구현하여 제공된 소스의 로그를 처리할지 여부를 선택할 수 있습니다. `SourceFilter`는 `CloudTrailSource` 객체를 수신하는 단일 콜백 메서드인 `filterSource()`를 선언합니다. 소스의 이벤트가 처리되지 않도록 하려면 `filterSource()`에서 `false`를 반환합니다.  
CloudTrail Processing Library는 라이브러리가 Amazon SQS 대기열의 로그를 폴링한 후 `filterSource()` 메서드를 호출합니다. 이는 라이브러리가 로그에 대해 이벤트 필터링 또는 처리를 시작하기 전에 발생합니다.  
다음은 구현의 예입니다.  

```
public class SampleSourceFilter implements SourceFilter{
  private static final int MAX_RECEIVED_COUNT = 3;

  private static List<String> accountIDs ;
  static {
    accountIDs = new ArrayList<>();
    accountIDs.add("123456789012");
    accountIDs.add("234567890123");
  }

  @Override
  public boolean filterSource(CloudTrailSource source) throws CallbackException {
    source = (SQSBasedSource) source;
    Map<String, String> sourceAttributes = source.getSourceAttributes();

    String accountId = sourceAttributes.get(
      SourceAttributeKeys.ACCOUNT_ID.getAttributeKey());

    String receivedCount = sourceAttributes.get(
      SourceAttributeKeys.APPROXIMATE_RECEIVE_COUNT.getAttributeKey());

    int approximateReceivedCount = Integer.parseInt(receivedCount);

    return approximateReceivedCount <= MAX_RECEIVED_COUNT && accountIDs.contains(accountId);
  }
}
```
자체 `SourceFilter`를 제공하지 않을 경우 `DefaultSourceFilter`가 사용되며 이 경우 모든 소스가 처리됩니다(항상 `true`를 반환함).

`EventFilter`  
`EventFilter` 인터페이스를 구현하여 CloudTrail 이벤트를 `EventsProcessor`에 전송할지 여부를 선택할 수 있습니다. `EventFilter`는 `CloudTrailEvent` 객체를 수신하는 단일 콜백 메서드인 `filterEvent()`를 선언합니다. 이벤트가 처리되지 않도록 하려면 `filterEvent()`에서 `false`를 반환합니다.  
CloudTrail Processing Library는 라이브러리가 Amazon SQS 대기열의 로그를 폴링한 후와 소스 필터링 후에 `filterEvent()` 메서드를 호출합니다. 이는 라이브러리가 로그에 대해 이벤트 처리를 시작하기 전에 발생합니다.  
다음 구현 예제를 참조하십시오.  

```
public class SampleEventFilter implements EventFilter{

  private static final String EC2_EVENTS = "ec2.amazonaws.com";

  @Override
  public boolean filterEvent(CloudTrailClientEvent clientEvent) throws CallbackException {
    CloudTrailEvent event = clientEvent.getEvent();

    String eventSource = event.getEventSource();
    String eventName = event.getEventName();

    return eventSource.equals(EC2_EVENTS) && eventName.startsWith("Delete");
  }
}
```
자체 `EventFilter`를 제공하지 않을 경우 `DefaultEventFilter`가 사용되며 이 경우 모든 이벤트가 처리됩니다(항상 `true`를 반환함).

### 데이터 이벤트 처리


CloudTrail은 데이터 이벤트를 처리할 때 정수(`int`)이든 `float`(소수를 포함하는 숫자)이든 상관없이 숫자를 원래 형식으로 유지합니다. 데이터 이벤트의 필드에 정수가 있는 이벤트의 경우 CloudTrail은 이전에 이러한 숫자를 부동 소수점으로 처리했습니다. 현재 CloudTrail은 이러한 필드의 숫자를 처리할 때 원래 형식을 유지합니다.

모범 사례로, 자동화 중단을 방지하려면 CloudTrail 데이터 이벤트를 처리하거나 필터링하는 데 사용하는 코드 또는 자동화에서 유연성을 유지하고 `int` 및 `float` 형식의 숫자를 모두 허용해야 합니다. 최상의 결과를 얻으려면 CloudTrail Processing Library 버전 1.4.0 이상을 사용하세요.

다음 코드 조각 예에서는 데이터 이벤트의 `ResponseParameters` 블록에 있는 `desiredCount` 파라미터의 `float` 형식 숫자인 `2.0`을 보여 줍니다.

```
"eventName": "CreateService",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "000.00.00.00",
    "userAgent": "console.amazonaws.com",
    "requestParameters": {
        "clientToken": "EXAMPLE",
        "cluster": "default",
        "desiredCount": 2.0
...
```

다음 코드 조각 예에서는 데이터 이벤트의 `ResponseParameters` 블록에 있는 `desiredCount` 파라미터의 `int` 형식 숫자인 `2`를 보여 줍니다.

```
"eventName": "CreateService",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "000.00.00.00",
    "userAgent": "console.amazonaws.com",
    "requestParameters": {
        "clientToken": "EXAMPLE",
        "cluster": "default",
        "desiredCount": 2
...
```

### 진행률 보고


`ProgressReporter` 인터페이스를 구현하여 CloudTrail Processing Library 진행률 보고를 사용자 지정합니다. `ProgressReporter`는 다음 작업이 시작될 때와 끝날 때 호출되는 `reportStart()` 및 `reportEnd()`라는 두 개의 메서드를 선언합니다.
+ Amazon SQS에서 메시지 폴링
+ Amazon SQS의 메시지 구문 분석
+ CloudTrail 로그의 Amazon SQS 소스 처리
+ Amazon SQS의 메시지 삭제
+ CloudTrail 로그 파일 다운로드
+ CloudTrail 로그 파일 처리

두 메서드는 수행된 작업에 대한 정보를 포함하는 `ProgressStatus` 객체를 수신합니다. `progressState` 멤버는 현재 작업을 식별하는 `ProgressState` 열거형의 멤버를 보유합니다. 이 멤버는 `progressInfo` 멤버에 추가 정보를 포함할 수 있습니다. 또한 `reportStart()`에서 반환할 수 있는 모든 객체는 `reportEnd()`에 전달되므로 이벤트 처리가 시작된 시간 등의 컨텍스트 정보를 제공할 수 있습니다.

다음은 작업이 완료될 때까지 걸리는 시간에 대한 정보를 제공하는 구현 예제입니다.

```
public class SampleProgressReporter implements ProgressReporter {
  private static final Log logger =
    LogFactory.getLog(DefaultProgressReporter.class);

  @Override
  public Object reportStart(ProgressStatus status) {
    return new Date();
  }

  @Override
  public void reportEnd(ProgressStatus status, Object startDate) {
    System.out.println(status.getProgressState().toString() + " is " +
      status.getProgressInfo().isSuccess() + " , and latency is " +
      Math.abs(((Date) startDate).getTime()-new Date().getTime()) + "
      milliseconds.");
  }
}
```

자체 `ProgressReporter`를 구현하지 않을 경우 실행 중인 상태의 이름을 인쇄하는 `DefaultExceptionHandler`가 대신 사용됩니다.

### 오류 처리


`ExceptionHandler` 인터페이스를 사용하면 로그 처리 중 예외가 발생할 경우 특수 처리를 제공할 수 있습니다. `ExceptionHandler`는 객체를 수신하는 단일 콜백 메서드 `handleException()`를 선언하고 이 콜백 메서드는 발생한 예외에 대한 컨텍스트가 포함된 `ProcessingLibraryException` 객체를 수신합니다.

전달된 `ProcessingLibraryException`의 `getStatus()` 메서드를 사용하여 예외 발생 시 실행된 작업을 확인하고 작업 상태에 대한 추가 정보를 구할 수 있습니다. `ProcessingLibraryException`은 Java의 표준 `Exception` 클래스에서 파생되므로 Exception 메서드 중 하나를 사용하여 예외에 대한 정보를 검색할 수도 있습니다.

다음 구현 예제를 참조하십시오.

```
public class SampleExceptionHandler implements ExceptionHandler{
  private static final Log logger =
    LogFactory.getLog(DefaultProgressReporter.class);

  @Override
  public void handleException(ProcessingLibraryException exception) {
    ProgressStatus status = exception.getStatus();
    ProgressState state = status.getProgressState();
    ProgressInfo info = status.getProgressInfo();

    System.err.println(String.format(
      "Exception. Progress State: %s. Progress Information: %s.", state, info));
  }
}
```

자체 `ExceptionHandler`를 제공하지 않을 경우 표준 오류 메시지를 인쇄하는 `DefaultExceptionHandler`가 대신 사용됩니다.<a name="delete-message-exception"></a>

**참고**  
`deleteMessageUponFailure` 파라미터가 `true`인 경우 CloudTrail Processing Library는 일반 예외를 처리 오류와 구별하지 않고 대기열 메시지를 삭제할 수 있습니다.  
예를 들어 `SourceFilter`를 사용하여 타임스탬프를 기준으로 메시지를 필터링합니다.
그러나 CloudTrail 로그 파일을 수신하는 S3 버킷에 액세스하는 데 필요한 권한이 없습니다. 필요한 권한이 없으므로 `AmazonServiceException`이 발생합니다. CloudTrail Processing Library는 이를 `CallBackException`으로 래핑합니다.
`DefaultExceptionHandler`는 이를 오류로 로깅하지만 필요한 권한이 없는 근본 원인을 식별하지 않습니다. CloudTrail Processing Library는 이를 처리 오류로 간주하고 메시지에 유효한 CloudTrail 로그 파일이 포함되어 있는 경우에도 메시지를 삭제합니다.
`SourceFilter`를 사용하여 메시지를 필터링하려면 `ExceptionHandler`가 서비스 예외를 처리 오류와 구별할 수 있는지 확인합니다.

## 추가 리소스


CloudTrail Processing Library에 대한 자세한 내용은 다음을 참조하세요.
+ CloudTrail Processing Library 애플리케이션을 구현하는 방법을 보여 주는 [샘플](https://github.com/aws/aws-cloudtrail-processing-library/tree/master/src/sample) 코드가 포함된 [CloudTrail Processing Library](https://github.com/aws/aws-cloudtrail-processing-library) GitHub 프로젝트
+ [CloudTrail Processing Library Java 패키지 설명서](https://docs.aws.amazon.com/awscloudtrail/latest/processinglib/)