# IPinfo

## 개요

Panther는 [IPinfo](https://ipinfo.io/)와(과) 파트너십을 맺어 Panther 고객에게 통합된 IP 관련 인리치먼트를 제공합니다.

다음 방법으로 오탐 알러트를 줄이기 위해 Panther 디텍션에서 IPinfo 인리치먼트 데이터를 사용하십시오:

* 의심스러운 사용자의 현재 IP 지리위치 세부정보를 교차검증하여 프로필 정보의 이상 징후를 발견하고 차단합니다.
* 고위험 위치 또는 네트워크의 트래픽이 도달하기 전에 사전에 식별하여 차단합니다.
* 대상과 관련되어 보안 위험을 초래할 수 있는 다른 엔티티를 정확하고 신뢰성 있게 발견합니다.

IPinfo 데이터 세트는 추가 비용 없이 모든 Panther 계정에서 이용 가능하며 기본적으로 비활성화되어 있습니다. 사용 방법을 알아보십시오. [여기에 저장된 인리치먼트 데이터를 보는 방법](https://docs.panther.com/ko/enrichment/..#viewing-and-managing-enrichments)및, [여기에 인리치먼트 데이터가 포함된 로그 이벤트를 보는 방법](https://docs.panther.com/ko/enrichment/..#viewing-log-events-with-enrichment-data).

### IPinfo 작동 방식

알러트 이벤트는 JSON 이벤트의 `p_enrichment` 필드 내에서 자동으로 IPinfo 데이터로 인리치됩니다.

IPinfo 데이터는 디텍션에서 다음과 함께 액세스할 수 있습니다 [사전 구축된 Python 헬퍼](#available-methods) (그리고 [`deep_get`](https://docs.panther.com/ko/detections/rules/python/globals#deep_get)).

[IPinfo 데이터 세트](#ipinfo-datasets) 는 인리치먼트 테이블로 대량 저장되므로 디텍션 로직이나 알러트에서 이 인리치먼트를 활용하기 위해 API 호출을 할 필요가 없습니다.

IPinfo의 데이터는 하루에 한 번 업데이트됩니다.

### IPinfo 데이터 세트

IP 주소에 대한 컨텍스트 정보를 추가하는 세 가지 유형의 IPinfo 데이터가 제공됩니다:

* [지리위치 데이터](https://ipinfo.io/developers/data-types#geolocation-data)
* [ASN 데이터](https://ipinfo.io/developers/data-types#asn-data)
* [프라이버시 데이터](https://ipinfo.io/developers/data-types#privacy-data)

## IPinfo 데이터 세트 활성화 방법

CI/CD 워크플로우를 사용 중이라면, 다음을 참조하십시오 [아래 CI/CD 사용자의 섹션](#ci-cd-users) 추가 고려사항에 대해 알아보려면.

{% hint style="info" %}
분석가 역할이 Panther 콘솔에서 IPinfo 패키지를 보고 관리할 수 있도록 하려면 다음 권한이 할당되어야 합니다: **조회 룩업 보기** 및 **룩업 관리** 권한.
{% endhint %}

IPinfo 인리치먼트를 활성화하려면:

1. Panther 콘솔의 왼쪽 탐색 바에서 클릭 **디텍션.**
2. Detections **을 클릭합니다** 탭.
   * 이 페이지에서 IPinfo용으로 제공되는 내장 팩을 볼 수 있습니다.
3. 활성화하려는 IPInfo 타일의 오른쪽에서 팩을 활성화하려면 토글을 클릭하십시오.
4. 클릭 **으로 전환합니다.** 표시되는 대화상자에서.

   <figure><img src="https://2400888838-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2Fgit-blob-c253b0518a7638066e78fabcfd0c4d436d7d8709%2Fenable-detection-pack.png?alt=media" alt=""><figcaption></figcaption></figure>

   * Panther Analysis Tool(PAT)으로 CI/CD를 통해 추가 변경을 하고 싶다면, [Panther 분석 도구(PAT)](https://docs.panther.com/ko/panther/detections-repo/pat)에 대한 자세한 정보는 Panther 담당자에게 문의하십시오.
5. IPinfo 데이터 세트가 활성화되었는지 확인하려면 왼쪽 사이드바 메뉴에서 **구성** > **인리치먼트 제공자**
   * 보강이 활성화되었는지 확인하려면 왼쪽 사이드바 메뉴에서
   * 를 클릭하십시오. 여섯 개의 IPinfo 소스 테이블과 마지막으로 새로고침된 시간이 표시됩니다. 비활성화된 데이터 세트는 새로고침되지 않습니다.

     * 다음 `ipinfo_asn` ,`ipinfo_location` 및 `ipinfo_privacy` 테이블은 디텍션 엔진의 실시간 룩업에 사용됩니다.
     * 다음 `ipinfo_asn_datalake` , `ipinfo_location_datalake` 및 `ipinfo_privacy_datalake` 테이블은 데이터레이크에서 IPinfo 데이터를 쿼리하고 조인하는 데 사용됩니다.

     <figure><img src="https://2400888838-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2Fgit-blob-949da00adf04dbe323a38ce3379566036282c776%2Fimage%20(3)%20(1)%20(2)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1).png?alt=media" alt=""><figcaption></figcaption></figure>

### CI/CD 사용자

CLI 워크플로우에서 IPinfo 인리치먼트를 활성화하려면 다음을 참조하십시오 [Panther Analysis Tool로 인리치먼트 관리](https://docs.panther.com/ko/panther/detections-repo/pat/managing-enrichment) 가이드.

다음 고려사항을 참고하세요:

* CI/CD 사용자는 IPinfo 테이블을 얻기 위해 Detection Packs를 사용할 필요가 없습니다. 최신 릴리스를 가져와 [`Panther 관리형 보강 소스에 대한 지침을 따르세요:`](https://github.com/panther-labs/panther-analysis) Managing Lookup Tables and Enrichment Providers with the Panther Analysis Tool `다음을 참고하세요:` (PAT)를 사용하여 IPinfo 인리치먼트를 업로드할 수 있습니다.
  * 다음을 사용하여 IPinfo 테이블을 활성화하려면 [`Panther 관리형 보강 소스에 대한 지침을 따르세요:`](https://github.com/panther-labs/panther-analysis) panther\_analysis\_tool `(PAT)을 사용하여 MISP 경고 목록 보강 테이블을 업로드할 수 있습니다.`.
* CI/CD 사용자는 PAT를 사용하여 IPinfo 테이블을 사용자 지정하지 않는 한 Detection Packs를 통해 IPinfo 인리치먼트를 활성화할 수 있습니다.
  * Panther 콘솔에서 활성화한 후 PAT로 IPinfo를 관리하기로 선택하면 먼저 Panther 콘솔에서 Detection Packs를 비활성화해야 합니다. Panther 콘솔과 PAT를 동시에 사용하여 IPinfo를 관리하는 것은 지원되지 않습니다.
* IPinfo 인리치먼트를 관리하는 방법에 대한 자세한 내용은 다음을 참조하십시오: [Panther의 GitHub 리포지토리의 IPinfo 파일](https://github.com/panther-labs/panther-analysis/tree/master/lookup_tables/ipinfo).

## 데이터레이크에서 IPinfo 데이터를 쿼리하는 방법

데이터레이크에는 세 개의 IPinfo 테이블이 있습니다:

* `ipinfo_asn_datalake`
  * 다음 문서를 참조하세요 [IPinfo의 ASN API 문서](https://ipinfo.io/products/asn-api).
* `ipinfo_location_datalake`
  * 다음 문서를 참조하세요 [IPinfo의 IP 지리위치 API 문서](https://ipinfo.io/products/ip-geolocation-api).
* `ipinfo_privacy_datalake`
  * 다음 문서를 참조하세요 [IPinfo의 프라이버시 디텍션 API 문서](https://ipinfo.io/products/proxy-vpn-detection-api).

위의 각 테이블에는 또한 `<table>_history` 라는 모든 변경 사항을 기록하는 테이블이 있습니다.

### 다음을 사용하여 `조인키(joinkey)`

데이터레이크에서 IPinfo 데이터를 쿼리할 때는 쿼리를 효율적으로 하기 위해 `조인키(joinkey)` 를 사용해야 합니다. 다음 사용자 정의 함수들은 `조인키(joinkey)` 설정을 더 쉽게 만듭니다:

* `PANTHER_LOOKUPS.PUBLIC.IPINFO_RANGE_TO_CIDR`
* `PANTHER_LOOKUPS.PUBLIC.IPINFO_TO_INT`
* `PANTHER_LOOKUPS.PUBLIC.IPINFO_TO_IP`
  * 참고: IPinfo의 `TO_IP` 코드는 IPv4만 지원합니다.
* `PANTHER_LOOKUPS.PUBLIC.IPINFO_TO_JOIN_KEY`

객체에 추가됩니다. [데이터레이크를 `조인키(joinkey)` 사용하여 쿼리하는 예시는 아래에 있습니다](#example-query-the-data-lake-for-ipinfo-data-using-a-joinkey).

## 예시들

### 예시: IPinfo 위치 데이터를 기반으로 한 알러트

이 예시에서는 예기치 않은 국가에서 AWS 콘솔에 로그인할 때마다 알러트를 발생시키는 룰을 생성합니다.

```python
def rule(event):
    global ipinfo_location
    ipinfo_location = IPInfoLocation(event)
    match_field = ""
    if event.get("p_log_type") == "AWS.Cloudtrail":
        match_field = "sourceIPAddress"
    
    if event.get("eventname") == 'ConsoleLogin' and ipinfo_location.country(match_field) != "US":
        return True
    return False
```

### 예시: 데이터레이크에서 `조인키(joinkey)`

IP를 조회하려면 `71.114.47.25`를 지정해야 합니다 `조인키(joinkey)` 및 범위를.

```sql
SELECT
   *
FROM
   panther_lookups.public.ipinfo_asn_datalake
WHERE 
   PANTHER_LOOKUPS.PUBLIC.IPINFO_TO_JOIN_KEY(joinkey) = PANTHER_LOOKUPS.PUBLIC.IPINFO_TO_JOIN_KEY('71.114.47.25')
   AND 
   PANTHER_LOOKUPS.PUBLIC.IPINFO_TO_INT('71.114.47.25') BETWEEN 
     PANTHER_LOOKUPS.PUBLIC.IPINFO_TO_INT(startip) 
       AND PANTHER_LOOKUPS.PUBLIC.IPINFO_TO_INT(endip)

```

다른 테이블과 조인하려면 위와 동일한 패턴을 따르되 로그 테이블의 IP 주소를 사용하십시오.

```sql
SELECT
   log.*, 
   ipinfo.* EXCLUDE (p_schema_version,p_event_time, p_parse_time,p_log_type,p_row_id,p_source_id,p_source_label)
FROM
   panther_logs.public.panther_audit log 
     LEFT OUTER JOIN panther_lookups.public.ipinfo_asn_datalake ipinfo
   ON (
     PANTHER_LOOKUPS.PUBLIC.IPINFO_TO_JOIN_KEY(joinkey) = PANTHER_LOOKUPS.PUBLIC.IPINFO_TO_JOIN_KEY(log.sourceIP)
     AND 
     PANTHER_LOOKUPS.PUBLIC.IPINFO_TO_INT(log.sourceIP) BETWEEN 
       PANTHER_LOOKUPS.PUBLIC.IPINFO_TO_INT(startip) AND PANTHER_LOOKUPS.PUBLIC.IPINFO_TO_INT(endip)
   )
WHERE
   p_occurs_since('1 day', log)
LIMIT 10
```

## IPinfo Python 헬퍼 함수 사용법 및 메서드

Panther는 실시간 디텍션 엔진에서 IPInfo 데이터를 간편하게 사용하도록 헬퍼 함수를 통합했습니다.

### Python 룰에서 IPinfo 객체 생성하기

데이터셋에서 관련 데이터를 반환하는 메서드를 가진 객체를 생성하는 헬퍼 함수가 있습니다.

아래는 이러한 객체들을 생성하는 예시 코드 스니펫입니다:

{% code overflow="wrap" %}

```python
from panther_ipinfo_helpers import (IPInfoASN, IPInfoLocation, geoinfo_from_ip)

def rule(event):
    global ipinfo_location
    global ipinfo_asn
    ipinfo_location = IPInfoLocation(event) 
    ipinfo_asn = IPInfoASN(event)
```

{% endcode %}

다음 `global` 키워드는 선언된 함수 외부에서 객체를 사용하려는 경우에만 필요합니다.

### IPinfo 객체에서 메서드 호출하기

IPinfo 데이터셋의 다양한 구성요소는 `_location` 및 `_asn` 객체의 메서드를 통해 이용할 수 있습니다. 룰이 처리하는 하나의 이벤트에는 여러 필드(예: 네트워크 로그의 IP 주소, 출발지 및 목적지 IP)가 있을 수 있습니다. IPInfo 객체를 호출할 때는 찾고자 하는 필드를 명확히 지정하십시오.

아래 예시는 이전 예에서 생성한 `ipinfo_location` 및 `ipinfo_asn` 객체들에 대해 모든 헬퍼 메서드를 호출하여 디텍션 룰에서 이용 가능한 모든 인리치먼트 정보를 가져오는 방법을 보여줍니다.

```python
    match_field = ""
    if event.get("p_log_type") == "AWS.Cloudtrail":
        match_field = "sourceIPAddress"
    
    if ipinfo_location:
        city = ipinfo_location.city(match_field)
        country = ipinfo_location.country(match_field)
        latitude = ipinfo_location.latitude(match_field)
        longitude = ipinfo_location.longitude(match_field)
        postal_code = ipinfo_location.postal_code(match_field)
        region = ipinfo_location.region(match_field)
        region_code = ipinfo_location.region_code(match_field)
        timezone = ipinfo_location.timezone(match_field)
    
    if ipinfo_asn:
        asn = ipinfo_asn.asn(match_field)
        domain = ipinfo_asn.domain(match_field)
        name = ipinfo_asn.name(match_field)
        route = ipinfo_asn.route(match_field)
        asn_type = ipinfo_asn._type(match_field)
```

다음 예시는 `geoinfo_from_ip()` 함수를 사용하며, 이 함수는 `panther_oss_helper.geoinfo_from_ip()`와 동일한 형식의 지리위치 정보를 가진 딕셔너리를 반환하지만, `hostname` 및 `anycast` 필드는 제공하지 않습니다.

```python
result = geoinfo_from_ip(event, "sourceIPAddress")
```

참고로 참조되는 이벤트 필드가 배열인 경우, 헬퍼 함수는 일치하는 값들의 배열을 반환합니다. 예:

```python
countries_of_all_ips = ipinfo_location.country('p_any_ip_addresses')
for country in countries_of_all_ips:
    if country == 'some unusual country':
        return True
```

### 사용 가능한 메서드

다음 표는 IPinfo Location, ASN 및 Privacy 객체에 대한 사용 가능한 메서드, 설명 및 예상 반환 값을 보여줍니다.

모든 메서드는 검색하려는 필드 인수를 받습니다.

#### Location

<table><thead><tr><th width="185">Location 메서드</th><th width="152">반환 유형</th><th>예시</th></tr></thead><tbody><tr><td>city</td><td>문자열</td><td>"San Francisco"</td></tr><tr><td>country</td><td>문자열</td><td>"US"</td></tr><tr><td>latitude</td><td>문자열</td><td>"37.7812"</td></tr><tr><td>longitude</td><td>문자열</td><td>"-122.4614"</td></tr><tr><td>postal_code</td><td>문자열</td><td>"94118"</td></tr><tr><td>region</td><td>문자열</td><td>"California"</td></tr><tr><td>region_code</td><td>문자열</td><td>"CA"</td></tr><tr><td>timezone</td><td>문자열</td><td>"America/Los_Angeles"</td></tr><tr><td>context</td><td>객체</td><td><p>대문자화된 메서드 이름을 키로 하는 위의 모든 필드를 포함하는 딕셔너리, 예: {</p><p>"City":"San Francisco",<br>...</p><p>}</p></td></tr></tbody></table>

#### ASN

<table><thead><tr><th width="152">ASN 메서드</th><th width="137">반환 유형</th><th width="419">예시</th></tr></thead><tbody><tr><td>asn</td><td>문자열</td><td>"AS7018"</td></tr><tr><td>domain</td><td>문자열</td><td>"att.com"</td></tr><tr><td>name</td><td>문자열</td><td>"AT&#x26;T Services, Inc."</td></tr><tr><td>route</td><td>문자열</td><td>"107.128.0.0/12"</td></tr><tr><td>type</td><td>문자열</td><td>"isp"</td></tr><tr><td>context</td><td>객체</td><td><p>대문자화된 메서드 이름을 키로 하는 위의 모든 필드를 포함하는 딕셔너리, 예: {</p><p>"ASN":"AS7018",</p><p>"Domain" : "att.com",<br>...</p><p>}</p></td></tr></tbody></table>

#### Privacy

<table><thead><tr><th width="178.66666666666666">Privacy 메서드</th><th width="138">반환 유형</th><th>예시</th></tr></thead><tbody><tr><td>hosting</td><td>불리언</td><td>true</td></tr><tr><td>proxy</td><td>불리언</td><td>false</td></tr><tr><td>tor</td><td>불리언</td><td>true</td></tr><tr><td>vpn</td><td>불리언</td><td>false</td></tr><tr><td>relay</td><td>불리언</td><td>true</td></tr><tr><td>service</td><td>문자열</td><td>"NordVPN"</td></tr></tbody></table>
