Amazon Web Services 한국 블로그

Amazon VPC Flow Logs에 추가 메타 데이터를 통한 효율적인 로그 분석

Amazon Virtual Private Cloud(VPC)가 제공하는 VPC Flow Logs를 사용하면,  클라우드 내 사설 네트워크 인터페이스를 통과하는 IP 트래픽에 대한 정보를 분석할 수 있습니다. Flow Logs 데이터는 Amazon CloudWatch Logs 또는 Amazon Simple Storage Service(S3)에 저장할 수 있습니다.

2015년 출시된 VPC Flow Logs는 여러 VPC에 걸친 연결 문제 해결, 침입 탐지 또는 규정 준수를 위한 아카이브 등 다양한 사용 사례에 사용되어 왔습니다. 지금까지 VPC Flow Logs는 소스 IP, 소스 포트, 대상 IP, 대상 포트, 작업(수락, 거부) 및 상태를 비롯한 정보를 제공했습니다. 활성화된 VPC Flow 로그 항목은 아래와 유사한 형태를 가집니다.

이 정보는 대부분의 흐름을 이해하는 데 충분했지만 유의미한 결론을 내리려면 IP 주소를 인스턴스 ID와 일치시키거나 흐름의 방향성을 추측하기 위해 추가적인 계산이나 검색이 필요했습니다.

이러한 네트워크 흐름에 대한 이해를 더욱 높이기 위해 VPC Flow Logs 레코드에 포함할 수 있는 추가 메타데이터의 지원이 가능해졌습니다. 이 기능을 통해 로그 데이터에서 유의미한 정보를 추출하기 위해 필요한 계산 또는 검색 횟수를 감소함으로써 스크립트를 간소화하거나 사후처리의 필요성을 아예 제거할 수 있게 해 줍니다.

이제 새 VPC Flow Log를 생성할 때 다음과 같은 메타데이터를 선택적으로 추가할 수 있습니다.

  • vpc-id : 소스 ENI(탄력적 네트워크 인터페이스)를 포함하는 VPC의 ID입니다.
  • subnet-id : 소스 ENI를 포함하는 서브넷의 ID입니다.
  • instance-id : 소스 인터페이스와 연관된 인스턴스의 Amazon Elastic Compute Cloud(EC2) 인스턴스 ID입니다. AWS 서비스(예: AWS PrivateLink, NAT Gateway, Network Load Balancer 등)에서 ENI를 배치할 때 이 필드는 “-“여야 합니다.
  • tcp-flags : 집계 기간 내에 관측된 TCP 플래그에 대한 비트마스크입니다. 예를 들어, FIN은 0x01 (1), SYN은 0x02 (2), ACK는 0x10 (16), SYN + ACK는 0x12 (18) 등이 됩니다(비트는 RFC793 “Transmission Control Protocol Specification”의 “Control Bits” 섹션에 지정되어 있음).
    이 정보는 누가 연결을 시작 및 종료했는지에 대해 알 수 있게 해 줍니다. TCP는 3방향 핸드셰이크를 사용하여 연결을 설정합니다. 연결 시스템은 SYN 패킷을 대상에 전송하고, 대상은 SYN + ACK로 응답하며, 마지막으로 연결 시스템은 ACK를 전송합니다. Flow Logs에서 핸드셰이크는 2(SYN) 및 18(SYN + ACK)의 tcp-flags 값을 가진 두 줄로 표시됩니다.  ACK는 SYN가 동반되는 경우에만 보고됩니다(그렇지 않은 경우 필터링할 노이즈가 너무 많음).
  • type : 트래픽의 유형(IPV4, IPV6 또는 탄력적 패브릭 어댑터)입니다.
  • pkt-srcaddr : 소스의 패킷 수준의 IP 주소입니다. 일반적으로 이 필드는 srcaddr과 함께 사용되어 NAT 게이트웨어와 같이 트래픽이 통과하는 중간 레이어의 IP 주소를 구분합니다.
  • pkt-dstaddr : 패킷 수준의 대상 IP 주소입니다. 이전 필드와 유사하되 대상 IP 주소에 대한 필드입니다.

VPC Flow Log를 생성하려면, 다음의 예와 같이 AWS 관리 콘솔, AWS CLI(명령줄 인터페이스) 또는 CreateFlowLogs API를 사용하고, 필드를 사용할 추가 정보 및 순서를 선택합니다.

또는 다음과 같이 AWS CLI(명령줄 인터페이스)를 사용합니다.

$ aws ec2 create-flow-logs --resource-type VPC \
                            --region eu-west-1 \
                            --resource-ids vpc-12345678 \
                            --traffic-type ALL  \
                            --log-destination-type s3 \
                            --log-destination arn:aws:s3:::sst-vpc-demo \
                            --log-format '${version} ${vpc-id} ${subnet-id} ${instance-id} ${interface-id} ${account-id} ${type} ${srcaddr} ${dstaddr} ${srcport} ${dstport} ${pkt-srcaddr} ${pkt-dstaddr} ${protocol} ${bytes} ${packets} ${start} ${end} ${action} ${tcp-flags} ${log-status}'

# 버킷 이름과 VPC ID를 교체하십시오!

{
    "ClientToken": "1A....HoP=",
    "FlowLogIds": [
        "fl-12345678123456789"
    ],
    "Unsuccessful": [] 
}

향상된 VPC Flow Logs는 S3에 전송됩니다. VPC Flow Logs가 S3 버킷에 정보를 쓸 수 있도록 승인하는 필수 S3 버킷 정책은 자동으로 추가됩니다. VPC Flow Logs는 네트워크 인터페이스에 대한 실시간 로그 스트림을 캡처하지 않으므로 선택한 대상에 대한 데이터를 수집 및 게시하는 데에는 몇 분의 시간이 소요될 수 있습니다. 작성된 로그는 S3s3://<bucket name>/AWSLogs/<account id>/vpcflowlogs/<region>/<year>/<month>/<day>/에서 확인할 수 있습니다.

IP 주소 90.90.0.200의 노트북에서 EC2 인스턴스로의 SSH 연결은 다음과 같은 형태로 표시됩니다.

3 vpc-exxxxxx2 subnet-8xxxxf3 i-0bfxxxxxxaf eni-08xxxxxxa5 48xxxxxx93 IPv4 172.31.22.145 90.90.0.200 22 62897 172.31.22.145 90.90.0.200 6 5225 24 1566328660 1566328672 ACCEPT 18 OK
3 vpc-exxxxxx2 subnet-8xxxxf3 i-0bfxxxxxxaf eni-08xxxxxxa5 48xxxxxx93 IPv4 90.90.0.200 172.31.22.145 62897 22 90.90.0.200 172.31.22.145 6 4877 29 1566328660 1566328672 ACCEPT 2 OK

172.31.22.145EC2 인스턴스의 프라이빗 IP 주소입니다. 이 주소는 인스턴스에 ifconfig를 입력했을 때 표시되는 주소입니다.  모든 플래그는 집계 기간 동안 “OR” 연산으로 설정됩니다. 연결이 짧은 경우 SYNFIN(3) 그리고 SYN+ACKFIN(19)까지 같은 줄에 설정됩니다.

Flow Log가 생성되고 나면 필드를 추가하거나 로그 구조를 수정할 수 없습니다. 이는 실수로 이 데이터를 사용하는 스크립트가 작동하지 않게 되는 것을 방지합니다. 모든 수정 작업에는 VPC Flow Logs를 삭제하고 다시 생성하는 과정이 필요합니다. VPC Flow Logs의 추가 정보를 캡처할 때에는 추가 비용이 발생하지 않고, 일반적인 VPC Flow Log 요금이 적용됩니다.

향상된 VPC Flow Log 레코드는 모든 필드를 선택할 때 더 많은 스토리지를 사용할 수 있다는 점에 유의하십시오.  필드를 사용할 때에는 해당 사용 사례와 관련된 필드만 선택하는 것이 좋습니다.

향상된 VPC Flow Logs는 VPC Flow logs를 지원하는 모든 리전에서 사용할 수 있으며, 오늘 바로 사용을 시작할 수 있습니다.

— seb;