본문 바로가기
[AWS-RDP]/CloudTrail

[중요][AWS] Athena로 CloudTrail 로그 분석

by METAVERSE STORY 2023. 4. 5.
반응형
728x170

 

 

오늘은 깊게 분석할 것 없이 아래의 간단한 실습을 해볼 생각이다.

1. CloudTrail 생성 및 로그가 S3에 쌓이도록 구성
2. S3에 쌓인 로그 파일을 Athena로 분석하기

굳이 CloudTrail 로그를 S3에 올리는 이유는 CloudTrail의 최대 로그 보존 기간이 90일이기 때문이다. 그 이전의 데이터는 유지하지 않기에 간혹 과거의 데이터를 조회하지 못해 난감한 경우가 있었다. (누가 어떤 작업을 했는지, CreateInstance 로그 등등) 또한 로그 파일이 쌓이다 보면 일일이 수많은 파일을 열어 확인해야 하는 번거로움이 있는데 이를 Athena를 활용해 쿼리를 날려 내가 원하는 데이터를 추릴 수 있다. 오늘은 이 실습을 해보려 한다.

https://docs.aws.amazon.com/ko_kr/awscloudtrail/latest/userguide/view-cloudtrail-events-console.html

 

CloudTrail 콘솔에서 CloudTrail 이벤트 보기 - AWS CloudTrail

다운로드가 완료되는 데 약간의 시간이 걸릴 수 있습니다. 더 빠른 결과를 얻으려면 다운로드 프로세스를 시작하기 전에 더 구체적인 필터 또는 더 짧은 시간 범위를 사용하여 결과를 좁히십시

docs.aws.amazon.com

 

 

CREATE EXTERNAL TABLE cloudtrail_logs (
eventversion STRING,
useridentity STRUCT<
               type:STRING,
               principalid:STRING,
               arn:STRING,
               accountid:STRING,
               invokedby:STRING,
               accesskeyid:STRING,
               userName:STRING,
  sessioncontext:STRUCT<
    attributes:STRUCT<
               mfaauthenticated:STRING,
               creationdate:STRING>,
    sessionissuer:STRUCT<  
               type:STRING,
               principalId:STRING,
               arn:STRING, 
               accountId:STRING,
               userName:STRING>,
    ec2RoleDelivery:string,
    webIdFederationData:map<string,string>
  >
>,
eventtime STRING,
eventsource STRING,
eventname STRING,
awsregion STRING,
sourceipaddress STRING,
useragent STRING,
errorcode STRING,
errormessage STRING,
requestparameters STRING,
responseelements STRING,
additionaleventdata STRING,
requestid STRING,
eventid STRING,
resources ARRAY<STRUCT<
               arn:STRING,
               accountid:STRING,
               type:STRING>>,
eventtype STRING,
apiversion STRING,
readonly STRING,
recipientaccountid STRING,
serviceeventdetails STRING,
sharedeventid STRING,
vpcendpointid STRING,
tlsDetails struct<
  tlsVersion:string,
  cipherSuite:string,
  clientProvidedHostHeader:string>
)
PARTITIONED BY (region string, year string, month string, day string)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 's3://CloudTrail_bucket_name/AWSLogs/Account_ID/CloudTrail/';

 

--------------------------------------------------------------

ALTER TABLE table_name ADD 
   PARTITION (region='us-east-1',
              year='2019',
              month='02',
              day='01')
   LOCATION 's3://cloudtrail_bucket_name/AWSLogs/Account_ID/CloudTrail/us-east-1/2019/02/01/'

 

 

 

 

 

 

========================================================================

 

 

1. CloudTrail 생성 및 로그가 S3에 쌓이도록 구성

방법은 간단하다. CloudTrail 서비스 콘솔 환경에 접근해 Trail을 생성해주면 된다. 생성할 때 아래 정보만 기입해주면 CloudTrail 생성과 동시, 지정한 S3버킷에 로그가 쌓이게 된다.

아래 AWS 공식 도큐먼트를 읽어보면 CloudTrail 로그를 S3 버킷에 쌓기 위해선 아래의 내용을 Bucket Policy에 추가해줘야 한다고 한다. 그런데 위 콘솔 작업을 마치고 막상 S3 Buckeet Policy를 확인해보면 이미 자동으로 수정되어 있었다. CloudFront OAI 설정할 때처럼 AWS에서 센스 있게 알아서 추가해주는 듯하다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AWSCloudTrailAclCheck20150319",
            "Effect": "Allow",
            "Principal": {"Service": "cloudtrail.amazonaws.com"},
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::myBucketName",
            "Condition": {
                "StringEquals": {
                    "aws:SourceArn": "arn:aws:cloudtrail:region:myAccountID:trail/trailName"
                }
            }
        },
        {
            "Sid": "AWSCloudTrailWrite20150319",
            "Effect": "Allow",
            "Principal": {"Service": "cloudtrail.amazonaws.com"},
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::myBucketName/[optionalPrefix]/AWSLogs/myAccountID/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control",
                    "aws:SourceArn": "arn:aws:cloudtrail:region:myAccountID:trail/trailName"
                }
            }
        }
    ]
}

https://docs.aws.amazon.com/ko_kr/awscloudtrail/latest/userguide/create-s3-bucket-policy-for-cloudtrail.html

 

CloudTrail에 대한 Amazon S3 버킷 정책 - AWS CloudTrail

기존 버킷에 이미 하나 이상의 정책이 연결되어 있는 경우 CloudTrail 액세스용 문을 해당 정책에 추가합니다. 버킷에 액세스하는 사용자에게 적절한지 발생한 권한 집합을 평가합니다.

docs.aws.amazon.com

 

2. S3에 쌓인 로그 파일을 Athena로 분석하기

운영을 하다 보면 아래처럼 각 Region, 날짜별로 거의 5분 단위로 로그가 쌓인다. 위 실습으로 방금 막 CloudTrail을 생성한 사용자라면 조금만 기다리면 로그 파일이 지정한 S3 버킷 경로에 생성되는 것을 볼 수 있을 것이다. 무튼 이 많은 로그에 특정 데이터를 찾아야 한다면 조금 막막할 수 있다. 하지만 Athena를 사용하면 저 많은 파일의 데이터를 하나의 DB에 모아, 사용자는 DB 데이터 기반으로 로그를 검색할 수가 있다.

Athena 서비스 화면에 접근하여 쿼리 창에 아래 내용을 입력해주자. 대충 CloudTrail 로그 파일에 맞게 Table을 생성하고, 지정한 S3 버킷 경로에 있는 모든 파일의 데이터를 Table 형식에 맞게 불러오겠다는 내용이다. 나의 경우, AWS 도큐먼트에 안내되어 있는 쿼리문 중 'PARTIONED BY' 부분은 제외하고 입력해줬다. 우리가 수정해줘야 하는 내용은 쿼리 맨 윗줄의 TABLE 이름과 쿼리 맨 아랫줄의 LOCATION의 S3 버킷 경로 부분이다.

CREATE EXTERNAL TABLE cloudtrail_logs (
eventversion STRING,
useridentity STRUCT<
               type:STRING,
               principalid:STRING,
               arn:STRING,
               accountid:STRING,
               invokedby:STRING,
               accesskeyid:STRING,
               userName:STRING,
sessioncontext:STRUCT<
attributes:STRUCT<
               mfaauthenticated:STRING,
               creationdate:STRING>,
sessionissuer:STRUCT<  
               type:STRING,
               principalId:STRING,
               arn:STRING, 
               accountId:STRING,
               userName:STRING>>>,
eventtime STRING,
eventsource STRING,
eventname STRING,
awsregion STRING,
sourceipaddress STRING,
useragent STRING,
errorcode STRING,
errormessage STRING,
requestparameters STRING,
responseelements STRING,
additionaleventdata STRING,
requestid STRING,
eventid STRING,
resources ARRAY<STRUCT<
               ARN:STRING,
               accountId:STRING,
               type:STRING>>,
eventtype STRING,
apiversion STRING,
readonly STRING,
recipientaccountid STRING,
serviceeventdetails STRING,
sharedeventid STRING
)
ROW FORMAT SERDE 'com.amazon.emr.hive.serde.CloudTrailSerde'
STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 's3://CloudTrail_bucket_name/AWSLogs/Account_ID/CloudTrail/';

https://docs.aws.amazon.com/ko_kr/athena/latest/ug/cloudtrail-logs.html

로그퀴리 템플릿 활용할 것!!

 

AWS CloudTrail 로그 쿼리 - Amazon Athena

여러 계정, 리전 및 날짜에 걸쳐 CloudTrail 이벤트 정보에 대한 SQL 쿼리를 수행하려면 CloudTrail Lake 사용을 고려해 보세요. CloudTrail Lake는 기업의 정보를 검색 가능한 단일 이벤트 데이터 스토어로

docs.aws.amazon.com

 

 

 

 

 

 

 

이대로 쿼리를 실행하려고 하면 아래처럼 안될 것이다. 이전에 먼저 해줘야 하는 것이 있다.

Settings에 접근해 쿼리 결과를 저장할 위치를 지정해줘야 한다.

적당히 S3 버킷의 특정 경로에 쿼리 결과를 저장하겠다는 설정을 해줬다.

쿼리를 실행시켜보니 Table이 정상적으로 생성되었다.

이제 테이블 안에 있는 필요한 데이터만 불러와 확인하면 된다. default 데이터베이스에 new_cloudtrail_logs라는 테이블에서 eventsource가 ec2.amazonaws.com과 일치한 데이터를 모두 불러와 보았다. 

"SELECT * FROM "default"."new_cloudtrail_logs" WHERE (eventsource='ec2.amazonaws.com');

데이터가 잘 출력이 되고 있다. 해당 결과 문은 아까 지정한 S3버킷 경로에서 파일로 확인할 수 있다.

 

 

 

 

 

 

출처 : https://bosungtea9416.tistory.com/entry/AWS-Athena%EB%A1%9C-CloudTrail-%EB%A1%9C%EA%B7%B8-%EB%B6%84%EC%84%9D

반응형
그리드형

댓글