# AWS VPC

## 개요

Panther는 AWS S3를 통해 Amazon Web Services(AWS) Virtual Private Cloud(VPC) 로그 수집을 지원합니다.

## AWS VPC 로그를 Panther에 온보드하는 방법

### 1단계: AWS에서 로깅 구성

AWS 구성은 VPC DNS 또는 흐름 로그를 온보드하는지에 따라 다릅니다. DNS와 흐름 로그를 모두 온보드하는 경우, 아래 두 탭의 절차를 모두 따라야 합니다.

{% tabs %}
{% tab title="VPC DNS" %}
AWS의 일부 구성을 통해 이 통합을 사용하여 DNS 쿼리를 모니터링할 수 있습니다. 악의적인 행위자는 데이터 절취, C2, DNS 터널링, 캐시 포이즈닝, DNS 하이재킹 등에 DNS를 사용할 수 있습니다. 네트워크의 장치가 수행한 쿼리와 수신한 응답을 로깅하는 것은 사전 경고와 조사에 유용할 수 있습니다.

아래 지침에서는 VPC 내 AWS 서비스에서 발생한 쿼리를 S3 버킷에 기록하는 방법을 설명합니다. 쿼리 로깅 구성은 Route 53 내에서 이루어지며 지정한 리전 내의 VPC에 적용됩니다. 구성은 리전별로 필요하지만 해당 리전의 여러 VPC에 적용할 수 있습니다.

1. AWS 계정에 로그인합니다.
2. 로그를 기록할 계획인 리전 내의 Route 53 서비스로 이동합니다.
3. 왼쪽에서 Resolver 아래의 **쿼리 로깅**.

   * “쿼리 로깅 구성” 페이지로 리디렉션되어야 합니다. 그렇지 않다면 “쿼리 로깅” 링크를 다시 클릭해 보세요.

   ![AWS의 쿼리 로깅 구성 페이지 중간에는 구성 항목이 없다는 메시지가 표시됩니다.](https://2400888838-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2Fgit-blob-18765563a1848137f0ae8c03eae10ed0a654e8d9%2Fvpc-query-logging.png?alt=media)
4. 오른쪽 상단에서 **쿼리 로깅 구성**.
5. 다음 페이지에서 쿼리 로깅 구성 양식을 작성합니다:
   * **이름**: 설명적인 이름을 입력하세요.
   * **쿼리 로그 대상**: 다음을 선택합니다 `S3 버킷`.
   * **Amazon S3 버킷**: 쿼리 로깅을 구성할 S3 버킷을 선택합니다.
   * **VPC 로그**: DNS 쿼리 로깅을 시작할 모든 VPC를 추가합니다. VPC를 검색한 다음 **VPC 추가**.\
     ![](https://2400888838-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2Fgit-blob-03eda308289fdc1051e9f99c60c28a7387d589d6%2Fvpc-config-query-logging.png?alt=media)
6. 페이지 하단에서 **쿼리 로깅 구성**.
   * 몇 분 내에 다음 위치의 S3 버킷에서 로그를 받기 시작해야 합니다. `s3://BucketName/BucketPrefix/AWSLogs/ACCOUNTID/vpcdnsquerylogs/VPCName/Year/Month/Day`
     {% endtab %}

{% tab title="VPC 흐름" %}
VPC 흐름 로깅을 구성하려면:

* AWS [Amazon S3에 게시하는 흐름 로그 생성](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs-s3-create-flow-log.html) 문서.
  * 아래에서 **로그 레코드 형식**를 선택하세요. **사용자 지정 형식**, 그런 다음 **표준 속성**. ( **AWS 기본 형식** 은 다음과 같은 필드를 제외합니다. `instance-id`.)\
    ![A checkbox next to "Standard attributes" has been selected. Under it, a number of fields, such as action and bytes, also have their checkboxes selected.](https://2400888838-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2Fgit-blob-a1e0e6794212c5a7e36ab62192fa4b1d19f63ddc%2Fimage.png?alt=media)
    {% endtab %}
    {% endtabs %}

### 2단계: Panther에서 새 AWS VPC 소스 생성

로그가 스트리밍될 S3 버킷을 지정하는 AWS VPC 소스를 Panther에 설정해야 합니다.

{% hint style="info" %}
DNS와 흐름 로그를 모두 온보드하는 경우:

* 두 종류의 로그가 모두 동일한 S3 버킷으로 전송되도록 구성된 경우, Panther에 AWS VPC 로그 소스 하나를 생성할 수 있습니다.
* DNS와 흐름 로그가 서로 다른 S3 버킷으로 전송되도록 구성한 경우, 이 단계를 두 번 완료해야 합니다(Panther에서 로그 소스 두 개를 설정).
  {% endhint %}

1. Panther Console의 왼쪽 탐색 표시줄에서 **구성** > **Log Sources**.
2. 클릭하세요. **새로 만들기**.
3. "AWS VPC"를 검색한 다음 해당 타일을 클릭합니다.
4. 클릭하세요. **설정 시작**.
5. 다음을 따르세요 [데이터 전송을 위한 S3 구성에 대한 Panther의 문서](https://docs.panther.com/ko/data-onboarding/data-transports/aws/s3).

### 예시 DNS 이벤트

{% code overflow="wrap" %}

```json
{"version":"1.100000","account_id":"0123456789012","region":"us-west-2","vpc_id":"vpc-c26c48ba","query_timestamp":"2022-10-07T21:39:49Z","query_name":"ec2messages.us-west-2.amazonaws.com.","query_type":"A","query_class":"IN","rcode":"NOERROR","answers":[{"Rdata":"52.94.176.105","Type":"A","Class":"IN"}],"srcaddr":"172.31.46.187","srcport":"52635","transport":"UDP","srcids":{"instance":"i-09d9aa4e31675db61"}}
```

{% endcode %}

## Panther 관리형 디택션

보기 [Panther-managed](https://docs.panther.com/detections/panther-managed) 의 AWS VPC 규칙 [panther-analysis GitHub 저장소](https://github.com/panther-labs/panther-analysis/tree/main/rules/aws_vpc_flow_rules).

## Data Explorer에서 로그 쿼리하기

예제 SQL 쿼리를 참조하세요. Panther의 [데이터 탐색기](https://docs.panther.com/ko/search/data-explorer)에서, [vpc-flow-logs-queries](https://docs.panther.com/ko/search/data-explorer/example-queries/vpc-flow-logs-queries "mention").

## 지원되는 AWS VPC 로그 유형

Panther는 [AWS.VPCDns](#aws.vpcdns) 및 [AWS.VPCFlow](#aws.vpcflow).

### AWS.VPCDns

DNS 쿼리 로그는 VPC DNS 확인자가 Route 53으로 전달하는 쿼리를 나타냅니다. 자세한 내용은 다음을 참조하세요. [Resolver 쿼리 로그 형식에 대한 AWS 문서](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resolver-query-logs-format.html).

```yaml
스키마: AWS.VPCDns
파서:
  native:
    name: AWS.VPCDns
description: DNS 쿼리 로그는 VPC DNS 확인자가 Route 53으로 전달하는 쿼리를 나타냅니다.
referenceURL: https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resolver-query-logs-format.html
필드:
  - name: version
    required: true
    description: 쿼리 로그 형식의 버전 번호입니다. 로그에 필드를 추가하거나 기존 필드의 형식을 변경하면 이 값이 증가합니다.
    유형: 문자열
  - name: account_id
    required: true
    description: VPC를 생성한 AWS 계정의 ID입니다.
    유형: 문자열
    지표:
      - aws_account_id
  - name: region
    required: true
    description: VPC를 생성한 AWS 리전입니다.
    유형: 문자열
  - name: vpc_id
    required: true
    description: 쿼리가 시작된 VPC의 ID입니다.
    유형: 문자열
  - name: query_timestamp
    required: true
    description: 쿼리가 제출된 날짜와 시간으로, ISO 8601 형식 및 협정 세계시(UTC)입니다.
    유형: 타임스탬프
    timeFormat: rfc3339
    isEventTime: true
  - name: query_name
    required: true
    description: 쿼리에 지정된 도메인 이름(example.com) 또는 하위 도메인 이름(www.example.com)입니다.
    유형: 문자열
  - name: query_type
    required: true
    description: 요청에 지정된 DNS 레코드 유형 또는 ANY입니다. Route 53이 지원하는 유형에 대한 정보는 다음을 참조하세요.
    유형: 문자열
  - name: query_class
    required: true
    description: 쿼리의 클래스입니다.
    유형: 문자열
  - name: rcode
    required: true
    description: Resolver가 DNS 쿼리에 대한 응답으로 반환한 DNS 응답 코드입니다. 응답 코드는 쿼리가 유효했는지 여부를 나타냅니다. 가장 일반적인 응답 코드는 NOERROR이며, 이는 쿼리가 유효했음을 의미합니다. 응답이 유효하지 않은 경우 Resolver는 그 이유를 설명하는 응답 코드를 반환합니다. 가능한 응답 코드 목록은 IANA 웹사이트의 DNS RCODE를 참조하세요.
    유형: 문자열
  - name: answers
    required: true
    description: 쿼리에 대한 응답
    유형: 배열
    요소:
      유형: 객체
      필드:
        - name: Rdata
          required: true
          description: Resolver가 쿼리에 응답하여 반환한 값입니다. 예를 들어 A 레코드의 경우 이는 IPv4 형식의 IP 주소입니다. CNAME 레코드의 경우 이는 CNAME 레코드의 도메인 이름입니다.
          유형: 문자열
        - name: Type
          required: true
          description: Resolver가 쿼리에 응답하여 반환하는 값의 DNS 레코드 유형(A, MX 또는 CNAME 등)입니다.
          유형: 문자열
        - name: Class
          required: true
          description: 쿼리에 대한 Resolver 응답의 클래스입니다.
          유형: 문자열
  - name: srcaddr
    required: true
    description: 쿼리가 시작된 인스턴스의 IP 주소입니다.
    유형: 문자열
    지표:
      - ip
  - name: srcport
    required: true
    description: 쿼리가 시작된 인스턴스의 포트입니다.
    유형: 문자열
  - name: transport
    required: true
    description: DNS 쿼리를 제출하는 데 사용된 프로토콜입니다.
    유형: 문자열
  - name: srcids
    required: true
    description: DNS 쿼리가 시작되었거나 통과한 소스의 ID 목록입니다.
    유형: 객체
    필드:
      - name: instance
        description: 쿼리가 시작된 인스턴스의 ID입니다.
        유형: 문자열
        지표:
          - aws_instance_id
      - name: resolver-endpoint
        description: DNS 쿼리를 온프레미스 DNS 서버로 전달하는 리졸버 엔드포인트의 ID입니다.
        유형: 문자열
  - name: firewall_룰_group_id
    description: 쿼리의 도메인 이름과 일치한 DNS Firewall 룰 그룹의 ID입니다. 이는 DNS Firewall이 작업이 알러트 또는 차단으로 설정된 룰에 대해 일치 항목을 찾은 경우에만 채워집니다.
    유형: 문자열
  - name: firewall_룰_action
    description: 쿼리의 도메인 이름과 일치한 룰에 의해 지정된 작업입니다. 이는 DNS Firewall이 작업이 알러트 또는 차단으로 설정된 룰에 대해 일치 항목을 찾은 경우에만 채워집니다.
    유형: 문자열
  - name: firewall_domain_list_id
    설명: 쿼리에서 도메인 이름과 일치한 룰이 사용하는 도메인 목록입니다. 이는 DNS Firewall이 동작이 알러트 또는 차단으로 설정된 룰에 대한 일치를 찾은 경우에만 채워집니다.
    유형: 문자열
```

### AWS.VPCFlow

VPC Flow는 VPC NetFlow 로그로, EC2의 네트워크 트래픽을 3계층으로 나타낸 것입니다.

Panther가 VPC NetFlow 로그를 올바르게 수집하려면, 헤더가 있는 CSV 형식으로 S3에서 직접 제공되어야 합니다.

자세한 내용은 다음을 참조하세요. [흐름 로그 레코드 예시를 제공하는 AWS의 문서](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs-records-examples.html).

```yaml
스키마: AWS.VPCFlow
파서:
  native:
    이름: AWS.VPCFlow
설명: VPCFlow는 VPC NetFlow 로그로, EC2의 네트워크 트래픽을 3계층으로 나타낸 것입니다.
referenceURL: https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs-records-examples.html
필드:
  - name: version
    설명: VPC Flow Logs 버전입니다. 기본 형식을 사용하는 경우 버전은 2입니다. 사용자 지정 형식을 지정하는 경우 버전은 3입니다.
    type: bigint
  - 이름: 계정
    설명: 흐름 로그에 대한 AWS 계정 ID입니다.
    유형: 문자열
    지표:
      - aws_account_id
  - 이름: interfaceId
    설명: 트래픽이 기록되는 네트워크 인터페이스의 ID입니다.
    유형: 문자열
  - 이름: srcAddr
    설명: 들어오는 트래픽의 소스 주소 또는 네트워크 인터페이스에서 나가는 트래픽의 네트워크 인터페이스 IPv4 또는 IPv6 주소입니다. 네트워크 인터페이스의 IPv4 주소는 항상 해당 프라이빗 IPv4 주소입니다.
    유형: 문자열
    지표:
      - ip
  - 이름: dstAddr
    설명: 나가는 트래픽의 대상 주소 또는 네트워크 인터페이스에서 들어오는 트래픽의 네트워크 인터페이스 IPv4 또는 IPv6 주소입니다. 네트워크 인터페이스의 IPv4 주소는 항상 해당 프라이빗 IPv4 주소입니다.
    유형: 문자열
    지표:
      - ip
  - 이름: srcPort
    설명: 트래픽의 소스 포트입니다.
    type: bigint
  - 이름: dstPort
    설명: 트래픽의 목적지 포트입니다.
    type: bigint
  - 이름: protocol
    설명: 트래픽의 IANA 프로토콜 번호입니다.
    type: bigint
  - 이름: packets
    설명: 흐름 동안 전송된 패킷 수입니다.
    type: bigint
  - 이름: bytes
    설명: 흐름 동안 전송된 바이트 수입니다.
    type: bigint
  - 이름: start
    required: true
    설명: 흐름 시작 시각(UTC)입니다.
    유형: 타임스탬프
    timeFormat: rfc3339
  - 이름: 종료
    required: true
    설명: 플로우 종료 시각(UTC).
    유형: 타임스탬프
    timeFormat: rfc3339
  - 이름: 작업
    설명: '트래픽과 연결된 작업입니다. ACCEPT: 기록된 트래픽은 보안 그룹 또는 네트워크 ACL에 의해 허용되었습니다. REJECT: 기록된 트래픽은 보안 그룹 또는 네트워크 ACL에 의해 허용되지 않았습니다.'
    유형: 문자열
  - 이름: status
    required: true
    설명: '플로우 로그의 로깅 상태입니다. OK: 데이터가 선택한 대상에 정상적으로 로깅되고 있습니다. NODATA: 캡처 기간 동안 네트워크 인터페이스로 들어오거나 나가는 네트워크 트래픽이 없었습니다. SKIPDATA: 캡처 기간 동안 일부 플로우 로그 레코드가 건너뛰어졌습니다. 이는 내부 용량 제약 또는 내부 오류 때문일 수 있습니다.'
    유형: 문자열
  - 이름: vpcId
    설명: 트래픽이 기록되는 네트워크 인터페이스를 포함하는 VPC의 ID입니다.
    유형: 문자열
  - 이름: subNetId
    설명: 트래픽이 기록되는 네트워크 인터페이스를 포함하는 서브넷의 ID입니다.
    유형: 문자열
  - 이름: instanceId
    description: 트래픽이 기록되는 네트워크 인터페이스와 연결된 인스턴스의 ID입니다. 해당 인스턴스가 사용자 소유인 경우에만 해당합니다. 요청자 관리 네트워크 인터페이스인 경우 '-' 기호를 반환합니다. 예를 들어 NAT 게이트웨이의 네트워크 인터페이스가 이에 해당합니다.
    유형: 문자열
    지표:
      - aws_instance_id
  - name: tcpFlags
    description: "다음 TCP 플래그의 비트마스크 값입니다: SYN: 2, SYN-ACK: 18, FIN: 1, RST: 4. ACK는 SYN과 함께 있는 경우에만 보고됩니다. 집계 간격 동안 TCP 플래그는 OR 연산될 수 있습니다. 짧은 연결의 경우 플래그가 흐름 로그 레코드의 같은 줄에 설정될 수 있습니다. 예를 들어, SYN-ACK와 FIN은 19, SYN과 FIN은 3입니다."
    type: bigint
  - name: trafficType
    description: '트래픽 유형: IPv4, IPv6 또는 EFA.'
    유형: 문자열
  - name: pktSrcAddr
    description: 트래픽의 패킷 수준(원래) 원본 IP 주소입니다. 이 필드를 srcaddr 필드와 함께 사용하여 트래픽이 통과하는 중간 계층의 IP 주소와 트래픽의 원래 원본 IP 주소를 구분합니다. 예를 들어 트래픽이 NAT 게이트웨이의 네트워크 인터페이스를 통해 흐르거나, Amazon EKS에서 pod의 IP 주소가 해당 pod가 실행 중인 인스턴스 노드의 네트워크 인터페이스 IP 주소와 다른 경우입니다.
    유형: 문자열
    지표:
      - ip
  - name: pktDstAddr
    description: 트래픽의 패킷 수준(원래) 대상 IP 주소입니다. 이 필드를 dstaddr 필드와 함께 사용하여 트래픽이 통과하는 중간 계층의 IP 주소와 트래픽의 최종 대상 IP 주소를 구분합니다. 예를 들어 트래픽이 NAT 게이트웨이의 네트워크 인터페이스를 통해 흐르거나, Amazon EKS에서 pod의 IP 주소가 해당 pod가 실행 중인 인스턴스 노드의 네트워크 인터페이스 IP 주소와 다른 경우입니다.
    유형: 문자열
    지표:
      - ip
  - name: pktSrcAwsService
    description: '원본 IP 주소가 AWS 서비스인 경우, pkt-srcaddr 필드에 대한 IP 주소 범위 하위 집합의 이름입니다. 가능한 값은 AMAZON | AMAZON_APPFLOW | AMAZON_CONNECT | API_GATEWAY | CHIME_MEETINGS | CHIME_VOICECONNECTOR | CLOUD9 | CLOUDFRONT | CODEBUILD | DYNAMODB | EC2 | EC2_INSTANCE_CONNECT | GLOBALACCELERATOR | KINESIS_VIDEO_STREAMS | ROUTE53 | ROUTE53_HEALTHCHECKS | S3 | WORKSPACES_GATEWAYS 입니다.'
    유형: 문자열
  - name: pktDstAwsService
    description: 대상 IP 주소가 AWS 서비스인 경우, pkt-dstaddr 필드에 대한 IP 주소 범위 하위 집합의 이름입니다. 가능한 값 목록은 pkt-src-aws-service 필드를 참조하세요.
    유형: 문자열
  - name: flowDirection
    description: '트래픽이 캡처되는 인터페이스를 기준으로 한 흐름의 방향입니다. 가능한 값은 ingress | egress입니다.'
    유형: 문자열
  - name: trafficPath
    description: 트래픽이 대상까지 나가는 경로입니다. 트래픽이 egress 트래픽인지 확인하려면 flow-direction 필드를 확인하세요. 가능한 값은 다음과 같습니다. 어떤 값도 적용되지 않으면 필드는 -로 설정됩니다. 네트워크 인터페이스가 Nitro System 기반 인스턴스에 연결된 경우 가능한 값에는 7과 8이 포함되지만 2는 포함되지 않습니다. Nitro System 기반이 아닌 인스턴스(예: T2 및 M4)에서는 가능한 값에 2가 포함되지만 7 또는 8은 포함되지 않습니다. 1 — 동일한 VPC의 다른 리소스를 통해, 2 — 인터넷 게이트웨이 또는 게이트웨이 VPC 엔드포인트를 통해, 3 — 가상 프라이빗 게이트웨이를 통해, 4 — 동일 리전 VPC 피어링 연결을 통해, 5 — 리전 간 VPC 피어링 연결을 통해, 6 — 로컬 게이트웨이를 통해, 7 — 게이트웨이 VPC 엔드포인트를 통해, 8 — 인터넷 게이트웨이를 통해
    type: smallint
  - name: region
    트래픽이 기록되는 네트워크 인터페이스가 포함된 리전입니다.
    유형: 문자열
  - name: azId
    description: 트래픽이 기록되는 네트워크 인터페이스가 포함된 가용 영역의 ID입니다. 트래픽이 하위 위치에서 온 경우, 이 필드에는 '-' 기호가 표시됩니다.
    유형: 문자열
  - name: sublocationType
    description: "sublocation-id 필드에 반환되는 하위 위치의 유형입니다. 가능한 값은 wavelength | outpost | localzone입니다. 트래픽이 하위 위치에서 온 것이 아니면, 이 필드에는 '-' 기호가 표시됩니다."
    유형: 문자열
  - name: sublocationId
    description: 트래픽이 기록되는 네트워크 인터페이스가 포함된 하위 위치의 ID입니다. 트래픽이 하위 위치에서 온 것이 아니면, 이 필드에는 '-' 기호가 표시됩니다.
    유형: 문자열
```
