AWS CloudTrail은 AWS 인프라에서 행해지는 모든 작업을 기록, 모니터링 및 보관할 수 있으며 이를 기반으로 규정 준수, 보안 분석, 비정상적인 활동 탐지 등을 자동화 또는 간소화 하는데 도움을 줍니다. 다수의 사용자가 다수의 AWS 인프라에서 동시에 개발 및 운영할때 CloudTrail를 이용해서 이력관리가 가능해 집니다.
-
Activity Monitoring: AWS Management Console, CLI, API, SDK 등을 통해서 이루어진 작업 내용을 기록
-
로그 저장: S3에 로그를 저장할수 있고 Athena를 통해서 S3에 저장된 로그에 쿼리를 실행
-
다른 AWS서비스들 연계: 알람 생성, 접근 / 사용 패턴 분석 및 Event-driven 작업 생성
-
CloudTrail 구성
-
S3 Select, AWS Console, AWS CLI, AWS Athena를 이용해서 Trail 분석
-
Cross-Account CloudTrail 구성
-
특정 API에 대한 Slack 알람 설정
-
AWS Management Console에서 좌측 상단에 있는 [Services] 를 선택하고 검색창에서 CloudTrail를 검색하거나 [Management & Governance] 밑에 있는 [CloudTrail] 를 선택
-
[Create trail] → Trail name = <YOUR_INITIAL>-cloudtrail, S3 Bucket = <YOUR_INITIAL>-cloudtrail-logs → [Create]
EC2, RDS, S3, DynamoDB, IAM, 기타등등의 Dashboard에 들어가 보는등 AWS Management console을 브라우징 하거나 CLI, API 또는 AWS SDK를 통해서 리소스 생성 또는 수정작업을 실행해서 Trail 로그 생성
-
AWS Management Console에서 좌측 상단에 있는 [Services] 를 선택하고 검색창에서 S3를 검색하거나 [Storage] 바로 밑에 있는 [S3] 를 선택
-
위에서 생성된 S3 Bucket을 선택 → AWSLogs → <AWS_ACCOUNT_ID> → CloudTrail → <AWS_REGION> → YYYY → MM → DD → 로그파일 선택 → 우측 상단 탭에서 [Select from] 선택 → [Show file preview]
{ "Records": [ { "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "arn": "arn:aws:iam::1234567890:user/woo", "accountId": "1234567890", "accessKeyId": "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "userName": "woo", "sessionContext": { "sessionIssuer": {}, "webIdFederationData": {}, "attributes": { "mfaAuthenticated": "true", "creationDate": "2019-12-30T01:33:17Z" } }, "invokedBy": "signin.amazonaws.com" }, "eventTime": "2019-12-30T05:25:30Z", "eventSource": "ec2.amazonaws.com", "eventName": "DescribeInstances", "awsRegion": "ap-northeast-2", "sourceIPAddress": "123.123.123.123", "userAgent": "signin.amazonaws.com", "requestParameters": { "maxResults": 1000, "instancesSet": {}, "filterSet": {} }, "responseElements": null, "requestID": "d8199693-a9c0-4885-86a4-402b455625ee", "eventID": "90ba7b1c-9405-4afb-96c2-ff0356fce66e", "eventType": "AwsApiCall", "recipientAccountId": "1234567890" } ] }
-
[NEXT] → SQL editor 에서 아래의 Query 구문을 실행해서 특정 IP 주소에서 온 API Call의 리스트를 필터
select * from s3object[*].Records[*] as records where records.sourceIPAddress != '<YOUR_IP_ADDRESS>';
CloudTrail Dashboard 에서 [Event history] 로 이동후 이벤트 필터
-
Root User 로그: User name = root
-
전체 S3 Bucket 로그: Resource type = Bucket
-
특정 S3 Bucket 로그: Resource name = <YOUR_INITIAL>-cloudtrail-logs
-
특정 시간대 로그: Time range에서 From을 어제로, To를 오늘로 설정후 [Apply]
-
지난 90일간의 이벤트 로그
aws cloudtrail lookup-events
-
지난 90일간의 이벤트 로그 중에서 100개만 불러오기
aws cloudtrail lookup-events --max-items 100
-
2019년 12월 1일에 발생한 이벤트 로그 불러오기 (UTC기준)
aws cloudtrail lookup-events --start-time 2019-12-01 --end-time 2019-12-02
-
특정 IAM User 로그:
aws cloudtrail lookup-events --lookup-attributes AttributeKey=Username,AttributeValue=<USERNAME>
-
EC2 인스턴스 삭제 이벤트 로그:
aws cloudtrail lookup-events --lookup-attributes AttributeKey=EventName,AttributeValue=TerminateInstances
-
CloudTrail Dashboard 에서 [Event history] 로 이동후 Run advanced queries in Amazon Athena → Storage location = Trail이 저장된 S3 Bucket 지정 → [Create table] → Athena table name을 메모하고 [Go to Athena]
-
로그인된 계정에서 AWS Athena 사용이 처음이라면 아래와 같은 메세지창이 보여집니다.
-
Athena Dashboard에서 위에서 생성된 Table 오른쪽 끝에 ⋮를 클릭 하고 [Preview table] 를 통해서 데이터 미리보기
-
Query
-
특정 IAM User 로그:
SELECT * FROM "default"."<TABLE_NAME>" WHERE useridentity.username = '<USERNAME>';
-
다수의 IAM User 로그:
SELECT * FROM "default"."<TABLE_NAME>" WHERE useridentity.username = '<USERNAME_1>' OR useridentity.username = '<USERNAME_2>';
-
최근 7일이내에 접속한 유저:
SELECT DISTINCT useridentity.username FROM "default"."<TABLE_NAME>" WHERE from_iso8601_timestamp(eventtime) > date_add('day', -7, now());
-
Root User 로그:
SELECT * FROM "default"."<TABLE_NAME>" WHERE useridentity.type = 'Root';
-
-
S3 Dashboard로 이동후 Trail이 저장되는 Bucket 클릭
-
[Permissions] → [Bucket Policy] → 아래 Policy 블록을 Bucket policy editor에 붙여놓고 <BUCKET_NAME> 에 해당 S3 Bucket 이름, <ACCOUNT_A_ID> 에 해당 계정 ID, <ACCOUNT_A_ID> 에 다른 AWS 계정 ID를 입력 [Save]
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AWSCloudTrailAclCheck", "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": "s3:GetBucketAcl", "Resource": "arn:aws:s3:::<BUCKET_NAME>" }, { "Sid": "AWSCloudTrailWrite", "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::<BUCKET_NAME>/AWSLogs/<ACCOUNT_A_ID>/*", "arn:aws:s3:::<BUCKET_NAME>/AWSLogs/<ACCOUNT_B_ID>/*" ], "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } } } ] }
-
다른 AWS 계정으로 접속후 CloudTrail Dashboard로 이동
-
[Create trail] → Trail name = <YOUR_INITIAL>-cloudtrail, Create a new S3 bucekt = No, S3 Bucket = 다른 계정에 생성한 Trail Bucket → [Create]