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

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

AWS Command Line Interface로 로그를 검증하려면 CloudTrail validate-logs 명령을 사용하세요. 이 명령에서는 검증을 수행하기 위해 Amazon S3 버킷에 전달된 다이제스트 파일을 사용합니다. 다이제스트 파일에 대한 내용은 CloudTrail 다이제스트 파일 구조를 참조하십시오.

AWS CLI를 사용하여 다음과 같은 변경 유형을 감지할 수 있습니다.

  • CloudTrail 로그 파일 수정 또는 삭제

  • CloudTrail 다이제스트 파일 수정 또는 삭제

  • 위 두 파일 수정 또는 삭제

참고

AWS CLI는 다이제스트 파일이 참조하는 로그 파일만 검증합니다. 자세한 내용은 특정 파일을 CloudTrail이 전달했는지 확인 단원을 참조하세요.

사전 조건

AWS CLI로 로그 파일 무결성을 검증하려면 다음 조건이 충족되어야 합니다.

  • AWS에 대한 온라인 연결이 있어야 합니다.

  • 다이제스트 및 로그 파일을 포함하는 Amazon S3 버킷에 대한 읽기 액세스 권한이 있어야 합니다.

  • 다이제스트 및 로그 파일은 CloudTrail이 해당 파일을 전송한 원래 Amazon S3 위치에서 이동되지 않아야 합니다.

참고

로컬 디스크로 다운로드한 로그 파일은 AWS CLI로 검증할 수 없습니다. 자체 검증 도구 생성에 대한 내용은 CloudTrail 로그 파일 무결성 검증에 대한 사용자 지정 구현 단원을 참조하세요.

validate-logs

구문

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

aws cloudtrail validate-logs --trail-arn <trailARN> --start-time <start-time> [--end-time <end-time>] [--s3-bucket <bucket-name>] [--s3-prefix <prefix>] [--verbose]

옵션

validate-logs에 대한 명령줄 옵션은 다음과 같습니다. --trail-arn--start-time 옵션이 필요합니다.

--start-time

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

--end-time

지정한 UTC 타임스탬프 값이 검증되거나 검증되기 전에 전달된 선택적인 로그 파일을 지정합니다. 기본값은 현재 UTC 시간(Date.now())입니다. 예: 2015-01-08T12:31:41Z.

참고

지정된 시간 범위의 경우 validate-logs 명령은 해당 다이제스트 파일에서 참조하는 로그 파일만 확인합니다. Amazon S3 버킷의 다른 로그 파일은 확인되지 않습니다. 자세한 내용은 특정 파일을 CloudTrail이 전달했는지 확인 단원을 참조하세요.

--s3-bucket

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

--s3-prefix

다이제스트 파일이 저장되는 Amazon S3 접두사를 선택적으로 지정합니다. 지정되지 않은 경우 AWS CLI는 DescribeTrails()를 호출하여 가져옵니다.

참고

현재 접두사가 지정한 시간 범위 도중에 사용된 접두사와 다를 때에만 이 옵션을 사용해야 합니다.

--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에 지정된 값에 도달하거나 다이제스트 체인이 종료될 때까지 계속됩니다. 다이제스트 파일이 누락되었거나 올바르지 않은 경우 확인할 수 없는 시간 범위는 출력에 위치합니다.

검증 결과

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

Validating log files for trail trail_ARN between time_stamp and time_stamp

기본 출력의 각 라인에는 다음과 같은 형식으로 하나의 다이제스트 또는 로그 파일의 확인 결과가 포함됩니다.

<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 #1 key with fingerprint 지문 지정된 지문이 있는 PKCS #1 형식의 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://example-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://example-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1925Z_WZZw1RymnjCRjxXc.json.gz valid Log file s3://example-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1915Z_POuvV87nu6pfAV2W.json.gz valid Log file s3://example-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1930Z_l2QgXhAKVm1QXiIA.json.gz valid Log file s3://example-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1920Z_eQJteBBrfpBCqOqw.json.gz valid Log file s3://example-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1950Z_9g5A6qlR2B5KaRdq.json.gz valid Log file s3://example-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1920Z_i4DNCC12BuXd6Ru7.json.gz valid Log file s3://example-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1915Z_Sg5caf2RH6Jdx0EJ.json.gz valid Digest file s3://example-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://example-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/09/01/111111111111_CloudTrail_us-east-2_20150901T1910Z_YYSFiuFQk4nrtnEW.json.gz valid [...] Log file s3://example-bucket/AWSLogs/144218288521/CloudTrail/us-east-2/2015/09/01/144218288521_CloudTrail_us-east-2_20150901T1055Z_0Sfy6m9f6iBzmoPF.json.gz valid Log file s3://example-bucket/AWSLogs/144218288521/CloudTrail/us-east-2/2015/09/01/144218288521_CloudTrail_us-east-2_20150901T1040Z_lLa3QzVLpOed7igR.json.gz valid Digest file s3://example-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://example-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://example-bucket/AWSLogs/144218288521/CloudTrail/us-east-2/2015/09/01/144218288521_CloudTrail_us-east-2_20150901T0830Z_eaFvO3dwHo4NCqqc.json.gz valid Digest file s3://example-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://example-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://example-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/08/31/111111111111_CloudTrail_us-east-2_20150831T2245Z_mbJkEO5kNcDnVhGh.json.gz valid Log file s3://example-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/08/31/111111111111_CloudTrail_us-east-2_20150831T2225Z_IQ6kXy8sKU03RSPr.json.gz valid Log file s3://example-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/08/31/111111111111_CloudTrail_us-east-2_20150831T2230Z_eRPVRTxHQ5498ROA.json.gz valid Log file s3://example-bucket/AWSLogs/111111111111/CloudTrail/us-east-2/2015/08/31/111111111111_CloudTrail_us-east-2_20150831T2255Z_IlWawYZGvTWB5vYN.json.gz valid Digest file s3://example-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 플래그를 사용하지 않습니다. 다음 샘플 출력에서 오류 하나가 발견되었습니다. 헤더, 오류 및 요약 정보만 반환됩니다.

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://example-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 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

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

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