Phân tích CloudTrail logs sử dụng Amazon Athena

Phân tích CloudTrail logs sử dụng Amazon Athena

avatar

Phong Nguyen

2024.01.25

Sau khi thiết lập gửi log cloudtrail đến S3. Chúng ta sẽ sử dụng Athena để thực hiện các câu truy vấn nhằm tìm những thông tin hữu ích 1 cách dễ dàng. Athena sử dụng SQL để truy vấn.

Lab Details

  1. You will practice using AWS CloudTrail and Amazon Athena to analyze trail logs.
  2. Duration: 20 minutes
  3. AWS Region: US East (N. Virginia) us-east-1

Architecture Diagram

Task Details

  1. Create Trail
  2. Create S3 bucket for Athena result
  3. Seting Athena Result bucket
  4. Create Database, Table, Run query

Create Trail

Step 1: Choose trail attributes

  • Trail name: management-event
  • Storage location**:** Create new S3 bucket
  • Trail log bucket and folder: để như default
  • Log file SSE-KMS encryption: Unchecked

Step 2: Choose log events

Step 3: Review and create

  • Click Create trail

Kết quả:

Logs của Cloudtrail không real-time: Khoảng 5p sau khi phát sinh lệnh gọi API thì mới có log

CloudTrail typically delivers logs within an average of about 5 minutes of an API call. This time is not guaranteed.

Create S3 bucket for Athena result

Tiếp theo chúng ta sẽ tạo 1 S3 bucket lưu kết quả truy vấn của Athena

  • Bucket name: d-s3-{cloudmentorpro}-athena-query-results
  • Thay {cloudmentorpro} bằng tên khác nhé

Seting Athena Result bucket

Tại Console của Athena -> Launch query editor

Create Database, Table, Run query

Tại giao diện Editor, run lệnh: create database s3_cloudtrail_logs_db;

Chọn Database vừa tạo và run lệnh để tạo table

Câu lệnh tạo table tham khảo ở đây

Copy Lệnh và thay thế các giá trị trong phần bôi đỏ, sẽ được như bên dưới:

CREATE EXTERNAL TABLE cloudtrail_logs_pp(
    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,
    readOnly STRING,
    resources ARRAY<STRUCT<
        arn: STRING,
        accountId: STRING,
        type: STRING>>,
    eventType STRING,
    apiVersion STRING,
    recipientAccountId STRING,
    serviceEventDetails STRING,
    sharedEventID STRING,
    vpcendpointid STRING,
    tlsDetails struct<
        tlsVersion:string,
        cipherSuite:string,
        clientProvidedHostHeader:string>
  )
PARTITIONED BY (
   `timestamp` 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://aws-cloudtrail-logs-067057696393-3245526b/AWSLogs/067057696393/CloudTrail/us-east-1'
TBLPROPERTIES (
  'projection.enabled'='true', 
  'projection.timestamp.format'='yyyy/MM/dd', 
  'projection.timestamp.interval'='1', 
  'projection.timestamp.interval.unit'='DAYS', 
  'projection.timestamp.range'='2024/01/24,NOW', 
  'projection.timestamp.type'='date', 
  'storage.location.template'='s3://aws-cloudtrail-logs-067057696393-3245526b/AWSLogs/067057696393/CloudTrail/us-east-1/${timestamp}')

Run lệnh:

Vậy là table tương ứng với logs của Cloudtrail đã được tạo xong, bây giờ chúng ta có thể truy vấn logs này bằng câu lệnh SQL.

Ví dụ lấy 100 records gần nhất:

SELECT
 useridentity.arn,
 eventname,
 sourceipaddress,
 eventtime
FROM cloudtrail_logs_pp
LIMIT 100;

Các tương tác nãy giờ của chúng ta lên môi trường AWS chắc chắn sẽ để lại trail logs, bạn cũng có thể confirm ở S3 bucket

Chẳng hạn như mình muốn biết ai đà người đã thực hiện truy vấn Athena.

SELECT
 useridentity.arn,
 eventname,
 sourceipaddress,
 eventtime
FROM cloudtrail_logs_pp
WHERE
  eventname = 'StartQueryExecution'
  AND eventsource = 'athena.amazonaws.com'
LIMIT 100;

Dựa trên cấu trúc của table mà chúng ta vừa tạo, chúng ta có thể thực hiện những truy vấn nâng cao với nhiều điều kiện theo nhu cầu. Hoặc là search google những yêu cầu mong muốn trích xuất thông tin gì từ CloudTrail log sử dụng Athena.

Cuối cùng chúng ta có thể lưu lại những câu truy vấn này cho việc re-use

Clean Up

  • Delete trail

  • Empty -> Delete S3 bucket: aws-cloudtrail-logs-*****

  • Delete table: cloudtrail_logs_pp

    DROP TABLE cloudtrail_logs_pp;
    
  • Delete database: Để xóa database s3_cloudtrail_logs_db đã tạo trước đó, việc này không thực hiện được ở Console Athena mà cần vào Console của Glue

Chúng ta không cần delete bucket kết quả truy vấn của Athena, lý do là có thể chúng ta sẽ cần dùng đến Athena trong tương lại. Lúc đấy không phải mất công để tạo bucket kết quả truy vấn nữa.