Lightsail에서 Amazon Athena를 사용하여 버킷 액세스 로그 분석
이 안내서에서는 액세스 로그를 사용하여 버킷에 대한 요청을 식별하는 방법을 보여줍니다. 자세한 내용은 버킷 액세스 로그를 참조하세요.
목차
Amazon Athena를 사용하여 요청에 대한 액세스 로그 쿼리
Amazon Athena Athena를 사용하여 액세스 로그에서 버킷에 대한 요청을 쿼리하고 식별할 수 있습니다.
Lightsail에서는 액세스 로그를 Lightsail 버킷의 객체로 저장합니다. 로그를 분석할 수 있는 도구를 사용하는 것이 보통 더 쉽습니다. Athena는 객체의 분석을 지원하며 액세스 로그를 쿼리하는 데 사용할 수 있습니다.
예
다음 예에서는 Amazon Athena에서 버킷 서버 액세스 로그를 쿼리할 수 있는 방법을 보여줍니다.
참고
Athena 쿼리에서 버킷 위치를 지정하려면 다음과 같이 로그가 S3 URI로 전달되는 대상 버킷 이름과 대상 접두사의 형식을 지정해야 합니다.s3://
amzn-s3-demo-bucket1
-logs/prefix/
-
https://console.aws.amazon.com/athena/
에서 Athena 콘솔을 엽니다. -
쿼리 편집기에서 다음과 유사한 명령을 실행합니다.
create database bucket_access_logs_db
참고
S3 버킷과 동일한 AWS 리전에 데이터베이스를 생성하는 것이 가장 좋습니다.
-
쿼리 편집기에서 다음과 유사한 명령을 실행하여 2단계에서 생성한 데이터베이스에 테이블 스키마를 생성합니다.
STRING
및BIGINT
데이터 형식 값이 액세스 로그 속성입니다. Athena에서 이 속성을 쿼리할 수 있습니다.LOCATION
의 경우 앞서 설명한 대로 버킷 및 접두사 경로를 입력하십시오.CREATE EXTERNAL TABLE `s3_access_logs_db.amzn-s3-demo-bucket_logs`( `bucketowner` STRING, `bucket_name` STRING, `requestdatetime` STRING, `remoteip` STRING, `requester` STRING, `requestid` STRING, `operation` STRING, `key` STRING, `request_uri` STRING, `httpstatus` STRING, `errorcode` STRING, `bytessent` BIGINT, `objectsize` BIGINT, `totaltime` STRING, `turnaroundtime` STRING, `referrer` STRING, `useragent` STRING, `versionid` STRING, `hostid` STRING, `sigv` STRING, `ciphersuite` STRING, `authtype` STRING, `endpoint` STRING, `tlsversion` STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ( 'input.regex'='([^ ]*) ([^ ]*) \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\"|-) (-|[0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\"|-) ([^ ]*)(?: ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*))?.*$') STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION '
s3://amzn-s3-demo-bucket1-logs/prefix/
' -
탐색 창의 데이터베이스 아래에서 데이터베이스를 선택하십시오.
-
테이블에서 테이블 이름 옆의 Preview table(테이블 미리보기)을 선택하십시오.
결과 창에
bucketowner
,bucket
,requestdatetime
등 서버 액세스 로그의 데이터가 표시됩니다. 즉, Athena 테이블이 만들어졌다는 뜻입니다. 이제 버킷 서버 액세스 로그를 쿼리할 수 있습니다.
예 - 객체를 삭제한 사람과 시점 표시(타임스탬프, IP 주소 및 IAM 사용자)
SELECT RequestDateTime, RemoteIP, Requester, Key FROM s3_access_logs_db.amzn-s3-demo-bucket_logs WHERE key = 'images/picture.jpg' AND operation like '%DELETE%';
예 - IAM 사용자가 수행한 모든 작업 표시
SELECT * FROM s3_access_logs_db.amzn-s3-demo-bucket_logs WHERE requester='arn:aws:iam::123456789123:user/user_name';
예 - 특정 기간에 객체에 수행된 모든 작업 표시
SELECT * FROM s3_access_logs_db.amzn-s3-demo-bucket_logs WHERE Key='prefix/images/picture.jpg' AND parse_datetime(RequestDateTime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2017-02-18:07:00:00','yyyy-MM-dd:HH:mm:ss') AND parse_datetime('2017-02-18:08:00:00','yyyy-MM-dd:HH:mm:ss');
예 - 특정 기간에 특정 IP 주소에서 전송한 데이터의 양 표시
SELECT SUM(bytessent) AS uploadTotal, SUM(objectsize) AS downloadTotal, SUM(bytessent + objectsize) AS Total FROM s3_access_logs_db.amzn-s3-demo-bucket_logs WHERE RemoteIP='1.2.3.4' AND parse_datetime(RequestDateTime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2017-06-01','yyyy-MM-dd') AND parse_datetime('2017-07-01','yyyy-MM-dd');
Amazon S3 액세스 로그를 사용하여 객체 액세스 요청 식별
액세스 로그에 대한 쿼리를 사용하여 GET, PUT 및 DELETE와 같은 작업에 대한 객체 액세스 요청을 식별하고 해당 요청에 대한 추가 정보를 검색할 수 있습니다.
다음 Amazon Athena 쿼리 예제에서는 서버 액세스 로그에서 버킷에 대한 모든 PUT
객체 요청을 가져오는 방법을 보여줍니다.
예 - 특정 기간에 PUT 객체 요청을 보내는 모든 요청자 표시
SELECT Bucket, Requester, RemoteIP, Key, HTTPStatus, ErrorCode, RequestDateTime FROM s3_access_logs_db WHERE Operation='REST.PUT.OBJECT' AND parse_datetime(RequestDateTime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2019-07-01:00:42:42','yyyy-MM-dd:HH:mm:ss') AND parse_datetime('2019-07-02:00:42:42','yyyy-MM-dd:HH:mm:ss')
다음 Amazon Athena 쿼리 예제에서는 서버 액세스 로그에서 Amazon S3에 대한 모든 GET 객체 요청을 가져오는 방법을 보여 줍니다.
예 - 특정 기간에 GET 객체 요청을 보내는 모든 요청자 표시
SELECT Bucket, Requester, RemoteIP, Key, HTTPStatus, ErrorCode, RequestDateTime FROM s3_access_logs_db WHERE Operation='REST.GET.OBJECT' AND parse_datetime(RequestDateTime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2019-07-01:00:42:42','yyyy-MM-dd:HH:mm:ss') AND parse_datetime('2019-07-02:00:42:42','yyyy-MM-dd:HH:mm:ss')
다음 Amazon Athena 쿼리 예제에서는 서버 액세스 로그에서 S3 버킷에 대한 모든 익명 요청을 가져오는 방법을 보여 줍니다.
예 - 특정 기간에 버킷에 요청하는 모든 익명 요청자 표시
SELECT Bucket, Requester, RemoteIP, Key, HTTPStatus, ErrorCode, RequestDateTime FROM s3_access_logs_db.amzn-s3-demo-bucket_logs WHERE Requester IS NULL AND parse_datetime(RequestDateTime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2019-07-01:00:42:42','yyyy-MM-dd:HH:mm:ss') AND parse_datetime('2019-07-02:00:42:42','yyyy-MM-dd:HH:mm:ss')
참고
-
필요에 맞게 날짜 범위를 수정할 수 있습니다.
-
이 쿼리 예제는 보안 모니터링에도 유용할 수 있습니다. 예상치 못하거나 승인되지 않은 IP 주소/요청자의
PutObject
또는GetObject
호출 결과를 검토하고 버킷에 대한 익명 요청을 식별할 수 있습니다. -
이 쿼리는 로깅이 사용 설정된 시간부터의 정보만 검색합니다.