Amazon Athena를 사용하여 Amazon VPC 흐름 로그를 분석하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2021년 4월 16일

Amazon Athena를 사용하여 Amazon Virtual Private Cloud(Amazon VPC) 흐름 로그를 분석하려고 합니다.

간략한 설명

Amazon VPC 흐름 로그를 사용하면 VPC의 네트워크 인터페이스에서 송수신되는 IP 트래픽에 대한 정보를 캡처할 수 있습니다. 로그는 네트워크 트래픽 패턴을 조사하고 Amazon VPC 네트워크에서 위협과 위험을 식별하는 데 사용할 수 있습니다.

해결 방법

Athena를 사용하여 VPC 로그 분석

Amazon Athena를 사용하여 액세스 로그를 분석하려면 다음을 수행합니다.

1.    [Amazon Athena 콘솔 쿼리 편집기(Amazon Athena console query editor)] 탭에서 다음과 유사한 명령을 실행하여 test_db_vpclogs 데이터베이스를 생성합니다.
중요: 흐름 로그를 저장하려는 Amazon S3 버킷과 동일한 AWS 리전에서 데이터베이스를 만드는 것이 가장 좋습니다.

CREATE DATABASE test_db_vpclogs;

참고: test_db_vpclogs를 생성하고자 하는 데이터베이스의 이름으로 바꾸어야 합니다.

2.    생성한 데이터베이스에서 다음과 유사한 명령을 실행하여 VPC 흐름 로그에 대한 테이블을 생성합니다. 이 명령을 사용하면 파티션 프로젝션으로 테이블을 만들고 테이블을 분할하며 사용 사례에 따라 파티션을 자동으로 채울 수 있습니다.

CREATE EXTERNAL TABLE IF NOT EXISTS test_table_vpclogs (
version int,
account string,
interfaceid string,
sourceaddress string,
destinationaddress string,
sourceport int,
destinationport int,
protocol int,
numpackets int,
numbytes bigint,
starttime int,
endtime int,
action string,
logstatus string,
vpcid string,
subnetid string,
instanceid string,
tcpflags int,
type string,
pktsrcaddr string,
pktdstaddr string,
region string,
azid string,
sublocationtype string,
sublocationid string,
pktsrcawsservice string,
pktdstawsservice string,
flowdirection string,
trafficpath string
)
PARTITIONED BY (region string, day string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' '
LOCATION 's3://awsexamplebucket/awsexampleprefix/awsexamplelogs/1111222233334444/vpcflowlogs/test_region_code/'
TBLPROPERTIES
(
"skip.header.line.count"="1",
"projection.enabled" = "true",
"projection.region.type" = "enum",
"projection.region.values" = "us-east-1,us-west-2,ap-south-1,eu-west-1",
"projection.day.type" = "date",
"projection.day.range" = "2021/01/01,NOW",
"projection.day.format" = "yyyy/MM/dd",
"storage.location.template" = "s3://awsexamplebucket/awsexampleprefix/awsexamplelogs/1111222233334444/vpcflowlogs/test_region_code/${region}/${day}"
)

다음을 수행합니다.

  • 쿼리의 test_table_vpclogs를 테이블 이름으로 바꿉니다.
  • 로그 데이터가 포함된 Amazon S3 버킷을 가리키도록 쿼리의 LOCATION 파라미터를 수정합니다.

참고: 프로젝션된 파티션이 Amazon S3에 없는 경우에도 Athena는 여전히 파티션을 프로젝션합니다. 쿼리에서 분할된 특성을 사용하는 것이 가장 좋습니다.

3.    콘솔에서 쿼리 편집기를 사용하여 테이블에서 SQL 문을 실행합니다. 쿼리를 저장하고 이전 쿼리를 보거나 쿼리 결과를 CSV 형식으로 다운로드할 수 있습니다.

쿼리의 예

참고: 쿼리의 test_table_vpclogs를 생성한 테이블의 이름으로 바꿉니다. 쿼리에 맞게 열 값 및 기타 변수를 수정하세요.

1.    특정 기간 동안 처음 100개의 액세스 로그 항목을 시간순으로 보려면 다음과 유사한 쿼리를 실행합니다.

SELECT * FROM test_table_vpclogs WHERE day >= '2021/02/01' AND day < '2021/02/28' ORDER BY time ASC LIMIT 100;

2.    특정 기간 동안 상위 10개의 HTTP 패킷 수를 받는 서버를 보려면 다음과 유사한 쿼리를 실행합니다.

SELECT SUM(numpackets) AS
  packetcount,
  destinationaddress
FROM test_table_vpclogs
WHERE destinationport = 443 AND day >= '2021/03/01' AND day < '2021/03/31'
GROUP BY destinationaddress
ORDER BY packetcount DESC
LIMIT 10;

이 쿼리는 HTTPS 포트 443에서 수신된 패킷 수를 계산하고 대상 IP 주소별로 그룹화하며 이전 주의 상위 10개 항목을 반환합니다.

3.    특정 기간 동안 생성된 로그를 확인하려면 다음과 유사한 쿼리를 실행합니다.

SELECT interfaceid, sourceaddress, action, protocol, to_iso8601(from_unixtime(starttime))
AS start_time, to_iso8601(from_unixtime(endtime))
AS end_time
FROM test_table_vpclogs
WHERE day >= '2021/04/01' AND day < '2021/04/30';

이 쿼리는 2020-12-04 11:28:19.000 및 2020-12-04 11:28:33.000 사이에 만들어진 로그를 반환합니다.

4.    특정 기간 사이의 특정 소스 IP 주소에 대한 액세스 로그를 보려면 다음과 유사한 쿼리를 실행합니다.

SELECT * FROM test_table_vpclogs WHERE sourceaddress= '10.117.1.22' AND day >= '2021/02/01' AND day < '2021/02/28';

5.    거부된 TCP 연결을 나열하려면 다음과 유사한 쿼리를 실행합니다.

SELECT day_of_week(date) AS
day,
date,
interfaceid,
sourceaddress,
action,
protocol
FROM test_table_vpclogs
WHERE action = 'REJECT' AND protocol = 6 AND day >= '2021/02/01' AND day < '2021/02/28' LIMIT 10;

6.    '10.117'로 시작하는 IP 주소 범위에 대한 액세스 로그를 보려면 다음과 유사한 쿼리를 실행합니다.

SELECT * FROM test_table_vpclogs WHERE split_part(sourceaddress,’.’, 1)=’10’ AND split_part(sourceaddress,’.’, 2) =‘117’;

7.    특정 시간 범위 사이의 특정 대상 IP 주소에 대한 액세스 로그를 보려면 다음과 유사한 쿼리를 실행합니다.

SELECT * FROM test_table_vpclogs WHERE destinationaddress= '10.0.1.14' AND day >= '2021/01/01' AND day < '2021/01/31';