안녕하세요 !!
오늘은 CloudTrail에서 추적 생성을 할 때에 있는 옵션인 '로그 파일 검증(Log file validation)'에 대하여
간단하게 포스팅 해보려합니다.
사실, '어..뭐 무결성 체크하는거면.. 좋지 뭐..허헣' 하고 체크해놓고선 이 녀석이 어떻게 동작하는지,
어떻게 확인하는지에 대한 궁금증 없이 지냈었는데요.
저와 같은 분이 계실 것 같기에.. 간단하게 포스팅 시작하겠습니다.
먼저 사용하는 이유 에 대해서 알아보겠습니다.
AWS Docs에서는 아래와 같이 안내하고 있습니다.
사용하는 이유
검증된 로그 파일은 보안 및 과학수사에서 중요한 역할을 합니다. 예를 들어, 검증된 로그 파일을 사용하면 로그 파일 자체가 변경되지 않았음을 또는 특정 사용자 자격 증명이 특정 API 활동을 수행했음을 확실하게 주장할 수 있습니다.
'CloudTrail에 API 찍혔는데, 너 발뺌하지마!! DB 너가 지웠잖아?!!'
??? : '그 로그 조작된거 아니야? 내가 어떻게 믿어?'
이런 상황일 때, '내가 너 그럴줄 알았어! 우리 로그파일 무결성 활성화 해놨어! 자! 봐봐!'
하는 용도라고 생각하시면 편할 듯 합니다.
다음으로는 작동 방식입니다.
CloudTrail 로그 파일 검증을 활성화하면, CloudTrail은 모든 로그파일에 해시를 생성하게 되고,
지난 1시간동안의 로그파일을 참조하고 각 해시를 포함하는 파일을 만들어서 지정한 S3 Bucket으로 전송합니다.
이를 다이제스트 파일이라고 합니다.
실제로 로그를 저장중인 S3 Bucket을 확인해보시면, 하위 프리픽스에 CloudTrail-Digest 라는 디렉터리를 확인하실 수 있습니다.
해당 다이제스트 파일에는 로그를 저장하는 S3 Bucket Name, 다이제스트 파일이 다루는 시작시간/종료시간, 해시 알고리즘, 다이제스트 파일을 서명하는데 쓰인 Private Key와 일치하는 Public Key의 인코딩 지문 등을 담고있습니다.
따라서, 해당 다이제스트 파일이나 로그파일이 수정(이동,삭제,변경..)되면 무결성이 깨지게됩니다.
무결성이 유지되고 있는지, 확인을 해볼텐데요. 아쉽게도 Web Console에서는 지원하지 않습니다.
따라서, CLI 환경에서 작업해주어야 하는데요. 저는 ReadOnlyAccess 권한을 가진 임시 User를 생성하여 Access Key를 발급받았습니다.
후에 자격증명을 잘 등록해주시고, 아래와 같은 명령어를 날려주시면 됩니다.
aws cloudtrail validate-logs --trail-arn arn:aws:cloudtrail:ap-northeast-2:111122223333:trail/JHJangAccount-CloudTrail --start-time 2021-07-04T15:00:00Z --end-time 2021-07-04T16:00:00Z --verbose --profile default
여기서 넘겨주는 Parameter는
1. CloudTrail의 ARN
2. 로그파일 검증을 시작한 Start Time(UTC 시간 기준)
3. 로그파일 검증을 종료할 End Time(UTC 시간 기준) => 입력하지 않으면, Start Time부터 현재 시간까지 조회됩니다.
4. --verbose 옵션은 모든 로그 및 다이제스트 파일의 출력 검증 정보입니다. 상세보기(?) 느낌입니다.
저는 위 명령어에서 한국시간기준으로 2021-07-05 00:00 ~ 2021-07-05 01:00 시간까지의 로그파일을 검증하는 것 입니다.
Result는 아래와 같습니다.
Digest file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail-Digest/ap-northeast-2/2021/07/04/111122223333_CloudTrail-Digest_ap-northeast-2_JHJangAccount-CloudTrail_ap-northeast-2_20210704T160935Z.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1530Z_xpbYOf53bN3Kakwm.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1515Z_OocbMOX7NjfrNXWq.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1600Z_cCCXLgd1CdoffUnk.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1545Z_ROZnv4ocQSBBC4qO.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1540Z_oDph8sfYTTXXfn6N.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1535Z_XHXOYBqyIhgQKIzX.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1535Z_mgSyMTV2iMS5LPkd.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1520Z_vcUvVIDpuIXEFHu4.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1540Z_kyjCdr0J4ZPc125h.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1555Z_sULkCkd114DM8bAu.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1510Z_LAt2tdSxvQarGVEI.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1505Z_FBVDMLHOIt6G8Tjv.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1535Z_Oq0FLMsMAnBbeTlu.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1510Z_UirQBzcLD7A8jBoD.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1520Z_6Hfmu0B3yySsKQgQ.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1605Z_za9WZ7JxsJbqS6jQ.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1550Z_7u7U63BgxQdRnQR2.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1525Z_ZZwmjKTB92diytMR.json.gz valid
Digest file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail-Digest/ap-northeast-2/2021/07/04/111122223333_CloudTrail-Digest_ap-northeast-2_JHJangAccount-CloudTrail_ap-northeast-2_20210704T150935Z.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1505Z_Y3bmd4F6I23Ozrgy.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1435Z_XrdFXOhmByHfZqcf.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1425Z_M5b2BDuTDwueVmMQ.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1435Z_y5iQkKRrlAqMCrb1.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1410Z_TzUtKwAbtm8Lbede.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1455Z_D1k5ls3mAMycg8YI.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1420Z_Z6zCfKL0GxR8ezTA.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1450Z_PVoQLBN4UP5c6vj2.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1440Z_rjf213lxhcDYI2e6.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1510Z_Sbqk7Tlv0Jio4OrF.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1430Z_ZsOXxVQQnVriiui4.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1420Z_7uZ4yNSL3YB3jtZO.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1500Z_ThmtpQR9M7Uh2bFz.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1425Z_fNwPPsHtMnTOvdbe.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1440Z_LakdIAOi21giU5dP.json.gz valid
Log file s3://jhjang-account-111122223333-cloudtrail/AWSLogs/111122223333/CloudTrail/ap-northeast-2/2021/07/04/111122223333_CloudTrail_ap-northeast-2_20210704T1445Z_Zsr8lyEj2AbvRSjr.json.gz valid
Results requested for 2021-07-04T15:00:00Z to 2021-07-04T16:00:00Z
Results found for 2021-07-04T15:09:35Z to 2021-07-04T16:00:00Z:
2/2 digest files valid
34/34 log files valid
여기서 중요한건, 맨 밑의 2줄 입니다.
다이제스트 파일 자체의 무결성 및 로그 파일들의 무결성을 점검한 결과 값 인데요.
만약 로그파일이나 다이제스트 파일 자체에서 무결성이 깨졌다면, 아래와 같은 메시지가 나타납니다.
파일 형식 | 메시지 | 설명 |
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 | 로그 파일이 없어 확인할 수 없습니다. |
간단하게 CloudTrail 로그파일에 대한 무결성 검증에 대해서 알아봤는데요.
'어~ 무결성 체크~ 좋아!!' 하고 활성화만 해놓고 사용을 안하기보다는 각종 증적자료용으로도 쓰일 수 있는 무결성 검증 잘 사용하셔서, 각종 심사에 대비하셨으면 합니다 ^^
또한, Bucket 구조가 다이제스트 파일을 위한 하위 프리픽스가 별도로 생성되다보니, 권한도 더 촘촘히 가져갈 수도 있습니다 ^^ 이러한 부분들은 내부정책에 맞게 커스터마이징 하시면 될 듯 합니다!!
그럼 다음 포스팅으로 또 인사드리겠습니다.
감사합니다. (_ _)
'AWS > CloudTrail' 카테고리의 다른 글
CloudTrail의 전송 중 암호화 (7) | 2021.07.12 |
---|