# 사용자 지정 보강

## 개요

사용자 정의 보강(“Lookup Tables”라고도 함)을 사용하면 Panther에 사용자 정의 보강 데이터를 저장하고 참조할 수 있습니다. 즉, 이 추가된 컨텍스트를 디택션에서 참조하고 알러트로 전달할 수 있습니다. 특히 신원/자산 정보, 취약점 컨텍스트 또는 네트워크 맵을 포함하는 사용자 정의 보강을 만드는 데 유용할 수 있습니다.

다음이 있습니다 [네 가지 가져오기 방법 옵션](#how-to-configure-a-custom-enrichment): 예약 검색, 정적 파일, S3 버킷 또는 Google Cloud Storage(GCS) 버킷.

사용자 정의 보강에 하나 이상의 로그 유형을 연결할 수 있으며, 그러면 해당 유형의 모든 수신 로그(보강 테이블 값과 일치하는 로그)는 보강 데이터를 포함하게 됩니다. 보강 처리 과정에 대해 자세히 알아보려면 [수신 로그가 보강되는 방식](#how-incoming-logs-are-enriched)을 참조하세요. 또한 [Python 디택션에서 보강 데이터를 동적으로 참조](#option-2-dynamically-using-lookup)할 수도 있습니다. 다음 방법을 알아보세요 [저장된 보강 데이터 보기](/ko/enrichment.md#viewing-and-managing-enrichments)와 [보강 데이터가 포함된 로그 이벤트 보기](/ko/enrichment.md#viewing-log-events-with-enrichment-data).

데이터가 몇몇 특정 디택션에만 필요하고 자주 업데이트되지 않는다면, 보강 대신 [Global helpers](https://docs.panther.com/writing-detections/globals) 사용을 고려하세요. 또한 다음을 사용할 수 있습니다 [Panther-managed enrichments](/ko/enrichment.md#panther-managed-lookup-tables) 예: IPinfo 및 Tor Exit Nodes.

사용자 정의 보강의 개수 및/또는 보강 테이블 크기 제한을 늘리려면 Panther 지원 팀에 문의하세요.

## 수신 로그가 보강되는 방식

Panther의 보강은 전통적으로 다음 두 가지를 모두 정의합니다:

* 기본 키: 보강 테이블 데이터의 한 필드.
  * 보강이 CLI 워크플로에서 정의된 경우, 이는 다음으로 지정됩니다 `PrimaryKey` 필드 [YAML 구성 파일](/ko/enrichment/custom/lookup-table-specification-reference.md).
* 하나 이상의 연결된 로그 유형과, 각 유형마다 하나 이상의 선택기: 선택기(Selector)는 이벤트 필드로, 해당 값이 보강 테이블의 기본 키 값과 비교되어 일치 항목을 찾습니다.
  * 보강에 대한 로그 유형/선택기를 설정하는 방법은 두 가지가 있습니다. 아래의 [보강에 대해 로그 유형과 선택기가 설정되는 방식](#how-log-types-and-selectors-are-set-for-a-lookup-table)을 참조하세요.

로그가 Panther로 수집될 때, 해당 로그 유형이 보강과 연결된 유형이라면 그 로그의 모든 선택기 필드 값이 보강의 기본 키 값과 비교됩니다. 선택기 필드의 값과 기본 키 값이 일치하면, 해당 로그는 일치한 기본 키에 연결된 보강 데이터로 다음 안에 보강됩니다 `p_enrichment` 필드. 자세히 알아보려면 아래 `p_enrichment` 구조 [`p_enrichment` 에서 확인하세요](#p_enrichment-structure).

아래 이미지의 예에서 선택기 필드(수신 로그의 이벤트 내)는 `ip_address`입니다. 보강 LUT1의 기본 키는 `bad_actor_ip`입니다. 오른쪽의 알러트 이벤트에서는 선택기 값( `bad_actor_name`)과 기본 키 값(`1.1.1.1`)이 일치했기 때문에 로그가 보강 데이터(포함`1.1.1.1`).

<figure><img src="/files/b9902e3408e617c5d6b46355824551a559946668" alt="A diagram showing how Lookup Tables work: On the left, there is a code box labeled &#x22;Incoming logs.&#x22; An arrow branches off the logs and points to a Lookup Table including &#x22;bad_actor_ip&#x22; and &#x22;bad_actor_name.&#x22; On the right, an arrow goes from the Lookup Table to an Alert Event, showing the alert you would receive based on the log example."><figcaption></figcaption></figure>

### 보강에 대해 로그 유형과 선택기가 설정되는 방식

보강을 생성할 때 연결된 로그 유형과 선택기를 수동으로 설정할 수 있습니다([옵션 1](#option-1-manually-choose-log-types-and-selectors)), 그리고/또는 자동 매핑되도록 둘 수 있습니다([옵션 2](#option-2-let-log-types-and-selectors-be-automatically-mapped-by-indicator-fields)).

#### 옵션 1: 로그 유형과 선택기를 수동으로 선택

보강을 생성할 때, 보강이 연결되어야 할 하나 이상의 로그 유형을 선택할 수 있으며, 각 로그 유형마다 하나 이상의 선택기 필드를 지정할 수 있습니다.

{% hint style="info" %}
이 방식으로 로그 유형과 선택기를 수동으로 선택하더라도, [옵션 2](#option-2-let-log-types-and-selectors-be-automatically-mapped-by-indicator-fields) 에서 설명한 자동 매핑은 계속 적용됩니다.
{% endhint %}

{% tabs %}
{% tab title="Panther Console" %}

* Panther Console에서 보강을 생성할 때, 연결된 로그 유형과 선택기를 설정할 수 있습니다. 자세한 내용은 [사용자 정의 보강 구성 방법](#how-to-configure-a-lookup-table)을 참조하세요.

<figure><img src="/files/94376dee0371839c615481ed9c01b66566cd4648" alt="Under an &#x22;Associated Log Types (Optional)&#x22; header is a form with fields for Log Type, Selectors, and Add Log Type. At the bottom is a Continue button."><figcaption></figcaption></figure>
{% endtab %}

{% tab title="CLI 워크플로" %}

* CLI 워크플로에서 보강을 생성할 때는 YAML 구성 파일을 만들고 업로드하게 됩니다. `AssociatedLogTypes` 값은 다음을 포함하는 객체 목록이 됩니다 `LogType` 및 `Selectors` 필드.
* 전체 필드 목록은 [Custom Enrichment Specification Reference](/ko/enrichment/custom/lookup-table-specification-reference.md) 를 참조하세요.
  {% endtab %}
  {% endtabs %}

#### 옵션 2: 로그 유형과 선택기를 자동으로 매핑

보강의 기본 키는 다음으로 표시할 수 있습니다 [indicator](/ko/search/panther-fields.md#indicator-fields) 또는 [CIDR validation](https://docs.panther.com/data-onboarding/custom-log-types/reference#ip-and-cidr-format-validation).

indicator 예시:

```yaml
    - name: attack_ids           # 이것은 기본 키입니다
      description: 공격 필드
      type: array
      element:
        type: string
        indicators:
            - mitre_attack_technique
```

각 indicator 값에 대해 Panther는 자동으로:

1. 모든 **Active** 로그 유형 중 어떤 이벤트 필드든 동일한 indicator로 지정하는 유형을 찾습니다.
2. 해당 로그 유형들을 보강에 연결합니다.
3. 각 로그 유형에 대해 `p_any` 필드를 해당 indicator와 연관된 선택기로 설정합니다.

예를 들어, 보강 데이터의 스키마가 `attack_ids` 기본 키를 다음으로 지정한다고 합시다 `mitre_attack_technique` 위와 같이 indicator로 지정하면, Panther 인스턴스에서 또한 `mitre_attack_technique` indicator를 설정한 모든 로그 유형이 보강에 연결되며, 각각 `p_any_mitre_attack_techniques` 선택기를 갖게 됩니다.

CIDR Validation 예시:

```yaml
    - name: cidr           # 이것은 기본 키입니다
      description: CIDR 블록
      type: string
      validate:
        cidr: ipv4
```

이 경우 Panther는 자동으로:

* 모든 **Active** 다음으로 어떤 이벤트 필드든 지정하는 로그 유형을 `ip` indicator로 식별합니다.
* 해당 로그 유형들을 보강에 연결합니다.
* 각 로그 유형에 대해 `p_any_ip_addresses` 필드를 해당 indicator와 연관된 선택기로 설정합니다.

이 매핑은 보강 데이터가 새로 고쳐질 때마다 발생합니다.

### `p_enrichment` 에서 확인하세요

로그 이벤트가 보강 데이터로 주입되면, `p_enrichment` 필드가 이벤트에 추가되고, 다음을 사용해 디택션 내에서 접근할 수 있습니다 `deep_get()` 또는 `DeepKey`. `p_enrichment` 필드에는 다음이 포함됩니다:

* 수신 로그 이벤트와 일치한 하나 이상의 보강 이름
* 보강과 일치한 수신 로그의 선택기 이름
* 보강의 기본 키를 통해 일치한 보강 데이터(일치한 선택기 값을 포함하는 주입된 `p_match` 필드 포함)

다음은 `p_enrichment` 필드의 구조입니다:

```yaml
'p_enrichment': {
    <보강1 이름>: {
        <선택기 이름>: {
            'p_match': <선택기 값>,
	          <보강 키>: <보강 값>,
	          ...
	      }
    }
}
```

다음에 유의하세요 `p_enrichment` 은 데이터 레이크에 로그 이벤트와 함께 저장되지 않습니다. 자세한 내용은 [보강 데이터가 포함된 로그 이벤트 보기](/ko/enrichment.md#viewing-log-events-with-enrichment-data) 를 참조하세요.

## 디택션에서 보강 데이터에 접근하는 방법

### 옵션 1(로그가 보강된 경우): 다음을 사용 `deep_get()`

로그 이벤트가 수집 시 보강되었다면(에서 설명한 대로 [수신 로그가 보강되는 방식](#how-incoming-logs-are-enriched)), 다음 안의 데이터에 접근할 수 있습니다 `p_enrichment` 필드([그 구조는 위에서 설명함](#p_enrichment-structure))를 사용하여 `deep_get()` event 객체 함수. 자세한 내용은 `deep_get()` [Python 디택션 작성하기에서 확인하세요](/ko/detections/rules/python.md#deep_get).

이 방법의 전체 예시는 아래 [사용자 정의 보강 데이터를 사용하여 디택션 작성](#writing-a-detection-using-lookup-table-data).

### 옵션 2: 다음을 사용해 동적으로 `lookup()`

Python 디택션에서 다음을 사용해 보강 데이터에 동적으로 접근하는 것도 가능합니다 [이 `event.lookup()` 함수를](/ko/detections/rules/python.md#lookup). 이 방법을 사용하면, 수신 이벤트에 주입되지 않더라도 다음에서 설명한 대로 보강 데이터의 모든 값에 접근할 수 있습니다 [수신 로그가 보강되는 방식](#how-incoming-logs-are-enriched).

## 사용자 정의 보강 구성 전제 조건

보강을 구성하기 전에 다음이 준비되어 있는지 확인하세요:

* 보강 데이터 전용 스키마
  * 이는 보강 데이터의 형태를 설명합니다.
* 보강 데이터의 기본 키
  * 이 기본 키는 보강 스키마에서 정의한 필드 중 하나입니다. 기본 키 값은 수신 로그의 선택기 값과 비교됩니다.
  * 아래의 [기본 키 데이터 유형](#primary-key-data-types) 섹션을 참조하여 기본 키 요구 사항에 대해 자세히 알아보세요.
* (선택 사항) 수신 로그의 선택기
  * 이 선택기들의 값은 보강 데이터에서 일치 항목을 찾는 데 사용됩니다.
* (CLI 워크플로): 보강 구성 파일
  * 다음을 참조하세요 [Custom Enrichment Specification Reference](/ko/enrichment/custom/lookup-table-specification-reference.md) 를 참조하세요.
  * 다음을 권장합니다 [다음의 포크를 만들고 `panther-analysis` 저장소의](/ko/panther/detections-repo/setup/deprecated/public-fork.md) 그리고 다음을 설치하세요 [Panther Analysis Tool (PAT)](/ko/panther/detections-repo/pat.md).
* 파일 업로드 또는 S3/GCS 버킷을 사용하는 경우:
  * JSON 또는 CSV 형식의 보강 데이터
    * JSON 파일은 줄, 배열 또는 객체 등 다양한 방식으로 이벤트를 형식화할 수 있습니다.
* 예약 검색을 사용하는 경우:
  * 보강에 사용할 데이터를 반환하는 SQL 쿼리
    * 다음을 통해 데이터 웨어하우스에 접근할 수 있는지 확인하세요 [Panther의 Data Explorer](/ko/search/data-explorer.md).

### 기본 키 데이터 유형

보강 테이블의 기본 키 열은 다음 데이터 유형 중 하나여야 합니다:

* String
* Number
* Array(문자열 또는 숫자 배열)
  * 배열을 사용하면 보강 테이블의 한 행을 여러 문자열 또는 숫자 기본 키 값과 연결할 수 있습니다. 이렇게 하면 여러 기본 키에 대해 특정 데이터 행을 중복할 필요가 없습니다.

<details>

<summary>예시: 문자열 배열 vs. 문자열 기본 키 유형</summary>

수신 로그 이벤트가 특정 사용자와 연결될 때 추가 개인 정보로 보강되도록, 사용자 데이터를 사용자 정의 보강 테이블에 저장하고 싶다고 합시다. 사용자의 이메일 주소로 일치시키고 싶으므로, 이메일 필드가 보강 테이블의 기본 키이자 로그 이벤트의 선택기가 됩니다.

보강 테이블의 기본 키 열을 string 유형으로 할지 string array 유형으로 할지 결정하고 있습니다.

먼저, 로그 소스에서 수신할 것으로 예상되는 아래 두 이벤트를 검토해 보세요:

```json
# 수신 로그 이벤트 1
{
    "actor_email": "janedoeemailone@mail.com",
    "action": "LOGIN"
}

# 수신 로그 이벤트 2
{
    "actor_email": "janedoeemailtwo@mail.com",
    "action": "EXPORT_FILE"
}
```

두 이메일 주소(`janedoeemailone@mail.com` 및 `janedoeemailtwo@mail.com`)는 같은 사용자, `Jane Doe`.

에 속합니다. Panther가 이러한 이벤트를 수신하면, 보강 테이블을 사용해 각각을 Jane의 전체 이름과 역할로 보강하고 싶을 것입니다. 보강 후에는 이 이벤트들이 다음과 같이 보일 것입니다:

<pre class="language-json"><code class="lang-json"><strong># 보강 후 로그 이벤트 1
</strong>{
    "actor_email": "janedoeemailone@mail.com",
    "action": "LOGIN",
    "p_enrichment": {
        "&#x3C;lookup_table_name>": {
            "actor_email": {
                "full_name": "Jane Doe",
                "p_match":  "janedoeemailone@mail.com",
                "role": "ADMIN"
            }
        }
    }
}

<strong># 강화 후 두 번째 로그 이벤트
</strong>{
    "actor_email": "janedoeemailtwo@mail.com",
    "action": "EXPORT_FILE",
    "p_enrichment": {
        "&#x3C;lookup_table_name>": {
            "actor_email": {
                "full_name": "Jane Doe",
                "p_match": "janedoeemailtwo@mail.com",
                "role": "ADMIN"
            }
        }
    }
}
</code></pre>

다음 중 하나를 사용하여 사용자 지정 강화를 정의함으로써 이 강화를 수행할 수 있습니다:

* (권장) 문자열 배열 형식의 기본 키 열
* 문자열 형식의 기본 키 열

문자열 배열 형식의 기본 키 열이 있는 강화 테이블을 사용하면 Jane의 여러 이메일 주소를 하나의 기본 키 항목에 포함하여 하나의 데이터 행과 연결할 수 있습니다. 이는 다음과 같이 보일 수 있습니다:

또는 문자열 형식의 기본 키 열이 있는 강화 테이블을 정의할 수 있습니다. 하지만 이벤트와 강화 테이블 간의 일치는 사용자의 이메일 주소를 기준으로 이루어지고, Jane의 경우에서 보이듯 사용자는 여러 이메일 주소를 가질 수 있으므로 각 이메일마다 강화 테이블 행을 복제해야 합니다. 이는 다음과 같이 보일 수 있습니다:

두 옵션 모두 동일한 결과를 제공하지만(즉, 로그 이벤트가 동일한 방식으로 강화됨), 편의성과 유지 관리 오류 가능성 감소 측면에서 문자열 배열 기본 키로 강화를 정의하는 것이 권장됩니다.

</details>

## 사용자 정의 보강 구성 방법

다음 사항을 충족한 후 [사전 요구 사항](#prerequisites-for-configuring-a-custom-enrichment)을 충족하면 다음 방법 중 하나를 사용하여 사용자 지정 강화를 생성하고 구성할 수 있습니다. Panther Console에서는 이제 각 방법이 강화 온보딩 페이지의 전용 타일로 제공되어 빠르고 직접적으로 접근할 수 있습니다:

* [옵션 1: 예약된 검색으로 사용자 지정 강화 데이터 가져오기](#option-1-import-custom-enrichment-data-with-a-scheduled-search)
  * **타일: "예약된 쿼리로 데이터 가져오기"**
  * 반복 일정에 따라 자동 업데이트되는 데이터 웨어하우스에서 직접 데이터를 가져오는 데 가장 적합합니다.
  * 예: 현재 환경에 따라 자동으로 새로 고쳐져야 하는 의심스러운 IP, 사용자 행동 패턴 또는 AWS 계정 매핑을 추적하는 경우.
* [옵션 2: ](#option-2-import-lookup-table-data-via-file-upload)[파일 업로드를 통해 사용자 지정 강화 데이터 가져오기](https://docs.panther.com/enrichment/custom#option-1-import-lookup-table-data-via-file-upload)
  * **타일: "CSV 또는 JSON 파일 업로드"**
  * AWS 계정 정보나 회사 서브넷과 같이 비교적 정적인 데이터에 가장 적합합니다.
  * 파일 업로드를 통해 채워지는 사용자 지정 강화 테이블의 최대 크기는 6MB입니다(API 요청의 페이로드 크기 제한 때문).
  * 예: AWS CloudTrail 로그에서 개발 계정과 운영 계정을 구분하기 위한 메타데이터 추가.
* [옵션 3: S3 버킷에서 사용자 지정 강화 데이터 동기화](#option-3-sync-custom-enrichment-data-from-an-s3-bucket)
  * **타일: "AWS S3에서 데이터 동기화"**
  * 기본 정보 → S3 연결 → 스키마 → 검증의 간소화된 4단계 마법사를 사용합니다.
  * 상대적으로 자주 업데이트되는 대량의 데이터가 있을 때 가장 적합합니다. S3 버킷의 변경 사항은 Panther에 동기화됩니다.
  * S3 버킷에서 동기화되는 사용자 지정 강화 테이블의 최대 크기는 10GB입니다.
  * 예: 회사 직원과 관련된 그룹 및 권한 수준이 무엇인지 알고 싶다고 가정해 보겠습니다. 이 경우 회사는 그룹 및 권한 정보가 포함된 최신 Active Directory 목록 사본이 들어 있는 S3 버킷을 보유하고 있을 수 있습니다.
* [옵션 4: Google Cloud Storage(GCS) 버킷에서 사용자 지정 강화 데이터 동기화](#option-4-sync-custom-enrichment-data-from-a-google-cloud-storage-gcs-bucket)
  * **타일: "Google Cloud Storage에서 데이터 동기화"**
  * 상대적으로 자주 업데이트되는 대량의 데이터가 있을 때 가장 적합합니다. GCS 버킷의 변경 사항은 Panther에 동기화됩니다.
  * GCS 버킷에서 동기화되는 사용자 지정 강화 테이블의 최대 크기는 10GB입니다.
  * Panther 인스턴스에서 Google Cloud Storage가 활성화되어 있어야 합니다.

이 방법 중 하나를 선택한 후에는 Panther Console에서 작업하거나 [PAT](/ko/panther/detections-repo/pat.md).

{% hint style="warning" %}
사용자 지정 강화 테이블의 한 행에 대한 최대 크기는 65535바이트입니다.
{% endhint %}

### 옵션 1: 예약된 검색으로 사용자 지정 강화 데이터 가져오기

{% hint style="info" %}
예약된 검색을 사용한 사용자 지정 강화 데이터 가져오기는 Panther 버전 1.117부터 공개 베타이며, 모든 고객이 사용할 수 있습니다. 버그 신고 및 기능 요청은 Panther 지원 팀에 공유해 주세요.
{% endhint %}

사용자 지정 강화 데이터는 다음의 결과로 자동 채워질 수 있습니다. [예약된 검색](/ko/search/scheduled-searches.md). 이 방법을 사용하면 외부 스크립트나 수동 CSV 내보내기가 필요하지 않으며, 정의된 일정에 따라 자동으로 업데이트되는 강화 데이터를 유지할 수 있습니다.

{% hint style="warning" %}
**예약된 검색으로 사용자 지정 강화 데이터를 가져올 때의 제한 사항**

* CIDR 매칭은 사용할 수 없습니다.
* 예약된 검색은 최소 15분 간격으로 실행할 수 있습니다.
* 검색 시간 초과는 15분으로 고정되어 있으며 구성할 수 없습니다.
  {% endhint %}

<details>

<summary>Panther Console</summary>

**Panther Console을 통해 예약된 검색으로 데이터 가져오기**

1. Panther Console의 왼쪽 탐색 표시줄에서 **구성** > **강화를 클릭합니다.**
2. 오른쪽 상단에서 **새로 만들기**.
   * 를 클릭합니다. 또는 다음에서 시작할 수도 있습니다. **조사 > 데이터 탐색기** 페이지에서 쿼리를 입력한 다음 **쿼리를 통해 강화 생성**.
3. 을 클릭합니다. **예약된 쿼리로 데이터 가져오기** 타일.
4. 다음 페이지에서 **기본 정보** 필드에 다음을 입력합니다:
   * **강화 이름**: 사용자 지정 강화에 대한 설명 이름.
   * **설명 - 선택 사항**: 테이블에 대한 추가 정보.
   * **참조 - 선택 사항**: 일반적으로 내부 리소스로 연결되는 하이퍼링크에 사용됩니다.
5. 클릭 **설정**.
6. 다음 페이지에서 **쿼리** 필드에 다음을 입력합니다:
   * **SQL 쿼리**: 사용자 지정 강화에 대한 데이터를 반환하는 SQL 쿼리를 작성합니다. 다음을 클릭하여 Data Explorer에서 쿼리를 테스트할 수 있습니다. **Data Explorer에서 테스트**.
     * 쿼리가 Panther가 수집한 데이터를 가져오는 경우, 다음으로 시작하는 [표준 필드](/ko/search/panther-fields.md) 를 제외하거나 이름을 바꾸세요. `p_` 접두사는 예약된 이름이기 때문입니다.
     * 강화 스키마는 SQL 쿼리를 기반으로 생성됩니다. 예를 들어 쿼리를 수정하면 스키마 필드와 유형을 수정할 수 있습니다. `SELECT AVG(total_events)::FLOAT AS mean_total_events` 다음 유형의 필드를 생성합니다 `float` 및 이름 `mean_total_events`
   * **일정 유형 및 빈도**: 데이터가 얼마나 자주 새로 고쳐져야 하는지에 따라 스케줄링 빈도를 구성합니다. 다음 중에서 선택하세요:
     * **기간**: 고정된 시간 간격으로 쿼리를 실행합니다(예: 2시간마다).
     * **Cron 표현식**: 다음을 사용하여 특정 날짜와 시간에 쿼리를 실행합니다. [Cron 표현식](/ko/search/scheduled-searches.md#how-to-use-the-scheduled-search-crontab)
7. 클릭 **계속**. Panther가 SQL 쿼리로부터 자동으로 스키마를 생성합니다.
8. 다음 페이지에서 **스키마** 페이지에서 자동 생성된 스키마를 검토하고 드롭다운에서 **기본 키** 를 선택합니다.
   * 모든 `문자열` 필드에 대해 선택적으로 [지표 필드](/ko/search/panther-fields.md#indicator-fields) 를 클릭하여 추가할 수 있습니다. **지표 추가** 필드 옆에 있는 드롭다운에서 하나 이상의 지표 유형(예: IP 주소, 도메인 이름, SHA256 해시)을 선택합니다. 지표를 추가하면 [자동 로그 유형 및 Selector 매핑](#option-2-let-log-types-and-selectors-be-automatically-mapped) 이 강화에 대해 사용할 수 있습니다.
   * 필드가 지표에 적합하도록 하려면 다음으로 형변환하세요. `STRING` SQL 쿼리에서.
9. 클릭 **강화 생성**.
10. 다음 페이지에서 **검증** 페이지에서 선택적으로 다음을 설정합니다. **이 강화가 데이터를 받지 못할 경우 알러트를 설정하시겠습니까?** 토글을 `예` 로 전환하여 알러트를 활성화합니다.
    * 다음을 입력합니다. **Number** 및 **기간** 필드에 Panther가 이 알림을 보내는 빈도를 지정합니다.
    * 이 알러트의 알러트 대상은 페이지 하단에 표시됩니다. 알림이 전송되는 위치를 구성하고 사용자 지정하려면 다음을 참조하세요. [Panther 대상](/ko/alerts/destinations.md).
11. 클릭 **설정 완료**.

{% hint style="info" %}
예약된 검색은 구성된 일정에 따라 실행되며 사용자 지정 강화 데이터를 자동으로 업데이트합니다. 다음에서 검색 기록을 볼 수 있습니다. [검색 기록 페이지](/ko/search/search-history.md).
{% endhint %}

{% hint style="info" %}
**SQL 기반 강화 편집:** 기존 SQL 기반 사용자 지정 강화를 편집할 때는 흐름에 추가적인 **연관 로그 유형** 단계가 쿼리와 스키마 단계 사이에 포함됩니다. 이를 통해 강화 구성을 편집하는 동안 로그 유형 연결을 관리할 수 있습니다.
{% endhint %}

</details>

### 옵션 2: 파일 업로드를 통해 사용자 지정 강화 데이터 가져오기

Panther Console 또는 PAT를 통해 파일 업로드로 데이터를 가져올 수 있습니다:

<details>

<summary>Panther Console</summary>

**Panther Console을 통해 파일 업로드로 사용자 지정 강화 데이터 가져오기**

1. Panther Console의 왼쪽 탐색 표시줄에서 **구성** > **강화**.
2. 오른쪽 상단에서 **새로 만들기**을 클릭한 다음 **사용자 지정 강화**.
3. 다음 페이지에서 **기본 정보** 페이지를 선택합니다:
   * **강화 이름**: 사용자 지정 강화에 대한 설명 이름.
   * **활성화됨?**: 이 토글이 `예`로 설정되어 있는지 확인하세요. 이는 이 과정의 나중 단계에서 데이터를 가져오기 위해 필요합니다.
   * **설명 - 선택 사항**: 테이블에 대한 추가 정보.
   * **참조 - 선택 사항**: 일반적으로 내부 리소스로 연결되는 하이퍼링크에 사용됩니다.\ <img src="/files/86d55ecd4f185e98196c74f5650d696b3be8338b" alt="" data-size="original">
4. 클릭 **계속**.
5. 다음 페이지에서 **연관 로그 유형(선택 사항)** 페이지에서 선택적으로 로그 유형/Selector를 지정합니다:
   * 클릭 **로그 유형 추가**.
   * 다음을 클릭합니다. **로그 유형** 드롭다운을 열고 로그 유형을 선택합니다.
   * 하나 이상 선택하세요 **Selectors**, 사용자 지정 강화로 강화하려는 로그 유형의 외래 키 필드입니다.
     * 다음을 사용하여 중첩 객체의 속성을 참조할 수도 있습니다. [JSON 경로 구문](https://goessner.net/articles/JsonPath/). 예를 들어 맵의 필드를 참조하려면 다음을 입력할 수 있습니다. `$.field.subfield`.
   * 클릭 **로그 유형 추가** 필요한 경우 다른 항목을 추가합니다.\
     ![](/files/9072f376f4db23ddc0dda72d7204f59a5cbb3f51)\
     위의 예시 화면에서는 다음을 선택했습니다. **AWS.CloudTrail** 로그를 선택하고 다음을 입력했습니다. `accountID` 및 `recipientAccountID` CloudTrail 로그의 키를 나타내기 위해.
6. 클릭 **계속**.
7. 다음 페이지에서 **테이블 스키마** 페이지에서 테이블 스키마를 구성합니다.\
   \&#xNAN;*참고: 아직 새 스키마를 만들지 않았다면 다음을 참조하세요.* [*스키마 생성에 대한 문서*](https://docs.runpanther.io/data-onboarding/custom-log-types/example-csv)*. 또한 사용자 지정 강화 데이터를 사용하여 스키마를 추론할 수도 있습니다. 스키마를 만든 후에는 강화를 구성하는 동안 Table Schema 페이지의 드롭다운에서 선택할 수 있습니다.*\
   \&#xNAN;*참고: CSV 스키마는 사용자 지정 강화와 함께 작동하려면 열 헤더가 필요합니다*.
   * 다음을 선택합니다. **스키마 이름** 를 선택합니다.
   * 다음을 선택합니다. **기본 키 이름** 드롭다운에서 선택합니다. 이는 다음과 같은 테이블의 고유한 열이어야 합니다. `accountID`.\
     ![The image shows the Table Schema form from the Panther Console. The Schema Name field is filled in with "Custom.AWSaccountIDs" and the Primary Key Name field is set to "awsacctid."](/files/eb52dc6d9e80fd823ad48c5a6c4e6d80cf33b467)
8. 클릭 **계속**.
9. 강화 온보딩 페이지에서 다음을 클릭합니다. **설정** 의 **CSV 또는 JSON 파일 업로드** 타일.
10. 다음 페이지에서 **파일 업로드** 페이지에서 파일을 끌어다 놓거나 **파일 선택** 을 클릭하여 가져올 강화 데이터 파일을 선택합니다. 파일은 다음 형식이어야 합니다. `.csv` 또는 `.json` 형식이어야 합니다.
11. 클릭 **설정 완료**. 소스 설정 성공 페이지가 표시됩니다.
12. 선택적으로, 다음 항목 옆의 ***S*****이 사용자 지정 강화가 데이터를 받지 못할 경우 알러트를 설정하시겠습니까?**&#xC124;정을 **예** 로 전환하여 알러트를 활성화합니다.

    * 다음을 입력합니다. **Number** 및 **기간** 필드에 Panther가 이 알림을 보내는 빈도를 지정합니다.
    * 로 전환하세요. 이 알러트의 알러트 대상은 페이지 하단에 표시됩니다. 알림이 전송되는 위치를 구성하고 사용자 지정하려면 다음 문서를 참조하세요. [Panther 대상](/ko/alerts/destinations.md).

    ​![The image shows a success page in the Panther Console after creating a Lookup Table. There is an option to set an  alarm in case this Lookup Table doesn't receive any data, and dropdown selectors to choose a time period when you receive the alerts. At the bottom, there is a section showing which destinations will receive the alert.](https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2FoyqgS5R8TnNzpDRtl9e9%2Fimage.png?alt=media\&token=5d8c27d1-ac28-460c-a2f5-bd2c503a49f1)

{% hint style="info" %}
사용자 지정 강화 업로드 실패에 대해 생성된 알림은 다음 위치에서 확인할 수 있습니다. **시스템 오류** 탭에서 **알러트 및 오류** Panther Console의 페이지.
{% endhint %}

</details>

<details>

<summary>PAT</summary>

**PAT를 통해 파일 업로드로 사용자 지정 강화 데이터 가져오기**

{% hint style="info" %}
데이터 파일이 1MB보다 크면 대신 다음을 사용하는 것이 좋습니다. [S3 동기화 업로드 방법](#option-2-sync-via-s3-source) 또는 [GCS 동기화 업로드 방법](#option-3-sync-via-google-cloud-storage-source).
{% endhint %}

**파일 및 폴더 설정**

사용자 지정 강화에는 다음 파일이 필요합니다:

* 강화 테이블용 YAML 구성 파일
  * 이 사용자 지정 강화 구성 파일은 다음 이름을 포함하는 폴더에 저장되어야 합니다. `lookup_tables`*.* 이는 최상위 수준의 `lookup_tables` 디렉터리이거나 이름이 다음과 일치하는 하위 디렉터리일 수 있습니다. `*lookup_tables*`. 다음 항목을 사용할 수 있습니다: [panther-analysis](https://github.com/panther-labs/panther-analysis) 저장소를 참고 자료로 사용할 수 있습니다.
* 테이블에 데이터를 로드할 때 사용할 스키마를 정의하는 YAML 파일
  * 이 데이터 스키마 파일은 해당 디렉터리 외부의 디렉터리에 저장해야 합니다. `lookup_tables` 예를 들어, 다른 사용자 지정 로그 스키마와 함께 저장할 수 있으며, 예: `/schemas` panther-analysis 저장소 루트의 디렉터리입니다.
* 테이블에 로드할 데이터를 포함하는 JSON 또는 CSV 파일(선택 사항, 자세한 내용은 계속 읽어보세요).

**스키마 및 구성 파일 작성**

테이블 구성에서 해당 값 중 일부를 참조하므로, 일반적으로 먼저 데이터 스키마를 작성하는 것이 좋습니다.

1. YAML 데이터 스키마 파일을 만드세요. 이 스키마는 테이블에 데이터를 업로드하는 데 사용할 파일을 읽는 방법을 정의합니다. 데이터를 CSV 파일로 사용하는 경우 스키마는 CSV를 구문 분석할 수 있어야 합니다.
   * 테이블 스키마는 로그 스키마와 동일한 형식입니다. 스키마 작성에 대한 자세한 내용은 다음에 대한 문서를 참조하세요. [로그 스키마 관리.](https://docs.panther.com/data-onboarding/custom-log-types#uploading-log-schemas-with-the-panther-analysis-tool)
2. YAML 구성 파일을 만드세요. 필수 및 허용 값의 전체 목록은 다음에서 확인하세요. [Custom Enrichment Specification Reference](/ko/enrichment/custom/lookup-table-specification-reference.md).
   * 로컬 파일에 저장된 데이터를 사용하는 사용자 지정 enrichment의 예시 구성은 다음과 같습니다:

     ```yaml
     AnalysisType: lookup_table
     LookupName: my_lookup_table # 고유한 표시 이름
     Schema: Custom.MyTableSchema # 이전 단계에서 정의한 스키마
     Filename: ./my_lookup_table_data.csv # 데이터에 대한 상대 경로
     Description: >
       이 테이블에 어떤 정보가 포함되어 있는지에 대한 유용한 설명입니다.
       예를 들어, 이 테이블은 IP 주소를 호스트 이름으로 변환할 수 있습니다
     Reference: >
       이 테이블과 관련된 추가 문서의 URL
     Enabled: true # 테이블 사용을 중지하려면 false로 설정
     LogTypeMap:
       PrimaryKey: ip                # 테이블의 기본 키
       AssociatedLogTypes:           # 이 테이블과 매칭할 로그 유형 목록
         - LogType: AWS.CloudTrail
           Selectors:
             - "sourceIPAddress"     # CloudTrail 로그의 필드
             - "p_any_ip_addresses"  # Panther가 생성한 필드도 사용할 수 있습니다
         - LogType: Okta.SystemLog
           Selectors:
             - "$.client.ipAddress"  # JSON 값에 대한 경로도 허용됩니다
     ```
3. 저장소 루트에서 다음을 실행하여 스키마 파일을 업로드하세요 [`panther_analysis_tool update-custom-schemas`](/ko/panther/detections-repo/pat/pat-commands.md#update-custom-schemas-creating-or-updating-custom-schemas) `--path ./schemas`.
4. 저장소 루트에서 다음을 사용하여 사용자 지정 enrichment를 업로드하세요\
   [`panther_analysis_tool upload`](/ko/panther/detections-repo/pat/pat-commands.md#upload-uploading-packages-to-panther-directly).

**Panther Analysis Tool를 통해 사용자 지정 enrichment 업데이트:**

1. 해당 사용자 지정 enrichment의 YAML 구성 파일을 찾으세요.
2. 파일을 열고 다음 필드를 찾으세요 `Filename`. 데이터 파일로 연결되는 파일 경로가 표시될 것입니다.
3. 다음에 표시된 파일을 업데이트하거나 교체하세요 `Filename`. 허용되는 값은 다음을 참조하세요 [Custom Enrichment Specification Reference](/ko/enrichment/custom/lookup-table-specification-reference.md).
4. 구성 파일을 저장한 다음 다음 명령으로 변경 사항을 업로드하세요:

   ```yaml
   panther_analysis_tool upload
   ```

   선택적으로, 사용자 지정 enrichment만 업로드하도록 지정할 수 있습니다:

   ```yaml
   panther_analysis_tool upload --filter AnalysisType=lookup_table
   ```

</details>

### 옵션 3: S3 버킷에서 사용자 지정 강화 데이터 동기화

Panther Console 또는 PAT를 통해 S3 버킷에서 데이터 동기화를 설정할 수 있습니다:

<details>

<summary>Panther Console</summary>

**Panther Console를 통해 S3 버킷에서 사용자 지정 enrichment 데이터 동기화**

S3 동기화 enrichment 설정은 간소화된 4단계 마법사를 사용합니다: **기본 정보** → **S3에 연결** → **스키마** → **검증**.

1. Panther Console의 왼쪽 탐색 표시줄에서 **구성 > Enrichments**.
2. 오른쪽 상단에서 **새로 만들기**.
3. 을 클릭합니다. **AWS S3에서 데이터 동기화** 타일.
4. 다음 페이지에서 **기본 정보** 필드에 다음을 입력합니다:

   * **강화 이름**: 사용자 지정 강화에 대한 설명 이름.
   * **설명 - 선택 사항**: 테이블에 대한 추가 정보.
   * **참조 - 선택 사항**: 일반적으로 내부 리소스로 연결되는 하이퍼링크에 사용됩니다.

   ![이미지는 Panther Console의 사용자 지정 enrichment에 대한 기본 정보 양식을 보여줍니다. Enrichment Name 필드에는 "Employee Directory"가 입력되어 있습니다. 설명에는 "특정 사용자가 속한 그룹과 권한이 있는 디렉터리."라고 적혀 있습니다. 하단에는 Setup 버튼이 있습니다.](/files/f2da46f6e7a1d4088ec71c464313b2fee9553c74)
5. 클릭 **설정**.
6. 다음 페이지에서 **S3에 연결** 페이지에서 S3 소스와 IAM 역할을 한 단계로 구성하세요:

   **소스 세부 정보:**

   * 다음을 입력하세요 **Account ID**, S3 버킷이 있는 12자리 AWS 계정 ID입니다.
   * 다음을 입력하세요 **S3 URI**, 특정 S3 버킷을 식별하는 고유한 경로입니다.
   * 선택적으로 다음을 입력하세요 **KMS Key - Optional** 데이터가 KMS-SSE로 암호화된 경우.

   **IAM 역할 설정:** 다음 방법 중 하나를 선택하세요:

   * **AWS UI 사용**: 클릭하세요 **Select** 이 카드에서 사전 입력된 템플릿을 사용하여 AWS 콘솔에서 CloudFormation 스택을 시작합니다.
   * **CloudFormation 템플릿 파일 사용**: 클릭하세요 **Select** 이 카드에서 인프라를 코드로 관리하는 템플릿 파일을 다운로드하여 자체 파이프라인을 통해 배포합니다.
   * **수동 설정**: 클릭하세요 **모든 것을 직접 설정하고 싶습니다** 링크를 카드 아래에서 클릭하여 IAM 역할을 직접 구성하세요. 스택을 배포하고 Role ARN을 얻은 후, 양식에 붙여넣어 **계속** 버튼을 활성화하세요.

   ![이미지는 Panther Console의 "Set up your S3 Enrichment" 양식을 보여줍니다. Account ID, S3 URI, KMS Key 필드와 함께 IAM Role Setup 섹션이 있으며, 두 개의 카드(Using the AWS UI 및 Using a CloudFormation Template File)와 모든 것을 수동으로 설정하는 링크가 있습니다.](/files/a89a7027d84ca36571e75129508e93c1c306956e)
7. 클릭 **계속**.
8. 다음 페이지에서 **스키마** 페이지에서 테이블 스키마를 구성합니다.\
   \&#xNAN;*참고: 아직 새 스키마를 만들지 않았다면 다음을 참조하세요.* [*스키마 생성에 대한 문서*](https://docs.runpanther.io/data-onboarding/custom-log-types/example-csv)*. 스키마를 생성하면 사용자 지정 enrichment를 구성하는 동안 스키마 페이지의 드롭다운에서 이를 선택할 수 있습니다.*
   * 다음을 선택합니다. **스키마 이름** 를 선택합니다.
   * 다음을 선택합니다. **기본 키 이름** 드롭다운에서 선택합니다. 이는 다음과 같은 테이블의 고유한 열이어야 합니다. `accountID`.
9. 클릭 **계속**.
10. 다음 페이지에서 **검증** 페이지에서 선택적으로 **이 사용자 지정 enrichment가 데이터를 받지 못할 경우 경보를 설정하시겠습니까?** 로 **예** 로 전환하여 알러트를 활성화합니다.
    * 다음을 입력합니다. **Number** 및 **기간** 필드에 Panther가 이 알림을 보내는 빈도를 지정합니다.
    * 로 전환하세요. 이 알러트의 알러트 대상은 페이지 하단에 표시됩니다. 알림이 전송되는 위치를 구성하고 사용자 지정하려면 다음 문서를 참조하세요. [Panther 대상](/ko/alerts/destinations.md).
11. 클릭 **설정 완료** enrichment 구성을 완료합니다.

{% hint style="info" %}
**기존 S3 enrichment를 편집하는 경우:** 기존 S3 동기화 enrichment를 편집할 때 마법사에는 추가 **연관 로그 유형** 단계가 다음 사이에 포함됩니다 **S3에 연결** 및 **스키마**, 로그 유형/선택기를 지정할 수 있습니다:

* 클릭 **로그 유형 추가**.
* 다음을 클릭합니다. **로그 유형** 드롭다운을 열고 로그 유형을 선택합니다.
* 하나 이상 선택하세요 **Selectors**, 사용자 지정 enrichment 데이터로 보강할 로그 유형의 외래 키 필드입니다.
  * 중첩된 객체의 속성은 다음을 사용하여 참조할 수 있습니다 [JSON 경로 구문](https://goessner.net/articles/JsonPath/). 예: `$.field.subfield`.
* 클릭 **로그 유형 추가** 필요한 경우 다른 항목을 추가합니다.
  {% endhint %}

​![The image shows a success page in the Panther Console after creating a Lookup Table. There is an option to set an  alarm in case this Lookup Table doesn't receive any data, and dropdown selectors to choose a time period when you receive the alerts. At the bottom, there is a section showing which destinations will receive the alert.](https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2FoyqgS5R8TnNzpDRtl9e9%2Fimage.png?alt=media\&token=5d8c27d1-ac28-460c-a2f5-bd2c503a49f1)​

{% hint style="info" %}
사용자 지정 enrichment 업로드 실패에 대해 생성된 알림은 다음에서 확인할 수 있습니다 **시스템 오류** 탭에서 **알러트 및 오류** Panther Console의 페이지.
{% endhint %}

**IAM 역할 생성**

S3 소스를 사용하는 Panther 사용자 지정 enrichment에 사용할 IAM Role을 만드는 방법에는 세 가지가 있습니다:

* [AWS Console UI를 사용하여 IAM 역할 생성.](#create-an-iam-role-using-aws-console-ui)
* [CloudFormation 템플릿 파일을 사용하여 IAM 역할 생성](#create-an-iam-role-using-aws-console-ui).
* [IAM 역할을 수동으로 생성](#create-an-iam-role-manually).

<img src="/files/ae59f193809ae80ad9c238c04d2ded9b7eb376a5" alt="" data-size="original">

**AWS Console UI를 사용하여 IAM 역할 생성**

1. "Set Up an IAM role" 페이지에서 S3 소스를 사용하는 사용자 지정 enrichment를 생성하는 과정 중, "Using the AWS Console UI"라고 표시된 타일을 찾으세요. 타일 오른쪽에서 다음을 클릭하세요 **Select**.
2. 클릭 **Launch Console UI**.\
   ![The image shows the screen after you choose to use AWS UI to set up your role. There is a green button in the center labeled "Launch Coonsole UI." At the bottom, there is a field to enter your Role ARN.](/files/4d68561214f7c2906164bda1660bdea41e35aed7)
   * 템플릿 URL이 미리 채워진 상태로 새 브라우저 탭의 AWS 콘솔로 리디렉션됩니다.
   * CloudFormation 스택은 S3 버킷의 객체를 읽는 데 필요한 최소 권한을 가진 AWS IAM 역할을 생성합니다.
   * AWS에서 CloudFormation 스택의 "Outputs" 탭을 클릭하고 Role ARN을 확인하세요.
3. Panther 계정으로 돌아가세요.
4. "Use AWS UI to set up your role" 페이지에서 Role ARN을 입력하세요.
5. 클릭 **설정 완료**.

**CloudFormation 템플릿 파일을 사용하여 IAM 역할 생성**

1. "Set Up an IAM role" 페이지에서 S3 소스를 사용하는 사용자 지정 enrichment를 생성하는 과정 중, "CloudFormation Template File"이라고 표시된 타일을 찾으세요. 타일 오른쪽에서 다음을 클릭하세요 **Select**.
2. 클릭 **CloudFormation template**, 그러면 자체 파이프라인을 통해 적용할 수 있도록 템플릿이 다운로드됩니다.
3. AWS에서 템플릿 파일을 업로드하세요:
   1. AWS 콘솔을 열고 CloudFormation 제품으로 이동하세요.
   2. 클릭 **스택 생성**.
   3. 클릭 **템플릿 파일 업로드** 을 선택하고 다운로드한 CloudFormation 템플릿을 선택하세요.
4. Panther의 "CloudFormation Template" 페이지에서 Role ARN을 입력하세요.
5. 클릭 **설정 완료**.

**IAM 역할을 수동으로 생성**

1. "Set Up an IAM role" 페이지에서 S3 소스를 사용하는 사용자 지정 enrichment를 생성하는 과정 중, 다음이라고 표시된 링크를 클릭하세요 **모든 것을 직접 설정하고 싶습니다**.
2. 필수 IAM 역할을 생성하세요. 필요한 IAM 역할은 수동으로 또는 자체 자동화를 통해 생성할 수 있습니다. 역할 이름은 다음 형식을 사용해야 합니다 `PantherLUTsRole-${Suffix}`(예: `PantherLUTsRole-MyLookupTable`).
   * IAM 역할 정책에는 아래에 정의된 문이 포함되어야 합니다:

     ```
         "Version": "2012-10-17",
         "Statement": [
             {
                 "Action": "s3:GetBucketLocation",
                 "Resource": "arn:aws:s3:::<bucket-name>",
                 "Effect": "Allow"
             },
             {
                 "Action": "s3:GetObject",
                 "Resource": "arn:aws:s3:::<bucket-name>/<input-file-path>",
                 "Effect": "Allow"
             }
         ]
     }
     ```
   * S3 버킷이 AWS KMS를 사용한 서버 측 암호화로 구성된 경우, Panther API가 해당 KMS 키에 액세스할 수 있도록 허용하는 추가 문을 포함해야 합니다. 이 경우 정책은 다음과 유사합니다:

     ```
         "Version": "2012-10-17",
         "Statement": [
             {
                 "Action": "s3:GetBucketLocation",
                 "Resource": "arn:aws:s3:::<bucket-name>",
                 "Effect": "Allow"
             },
             {
                 "Action": "s3:GetObject",
                 "Resource": "arn:aws:s3:::<bucket-name>/<input-file-path>",
                 "Effect": "Allow"
             },
             {
                 "Action": ["kms:Decrypt", "kms:DescribeKey"],
                 "Resource": "arn:aws:kms:<region>:<your-accound-id>:key/<kms-key-id>",
                 "Effect": "Allow"
             }
         ]
     }
     ```
3. Panther의 "Setting up role manually" 페이지에서 Role ARN을 입력하세요.
   * 이는 AWS 계정의 CloudFormation 스택 "Outputs" 탭에서 확인할 수 있습니다.
4. 클릭 **설정 완료**, 그러면 새 Employee Directory 테이블이 나열된 Enrichments 목록 페이지로 리디렉션됩니다.

</details>

<details>

<summary>PAT</summary>

**PAT를 통해 S3 버킷에서 사용자 지정 enrichment 데이터 동기화**

**파일 및 폴더 설정**

사용자 지정 강화에는 다음 파일이 필요합니다:

* 강화 테이블용 YAML 구성 파일
  * 이 사용자 지정 강화 구성 파일은 다음 이름을 포함하는 폴더에 저장되어야 합니다. `lookup_tables`*.* 이는 최상위 수준의 `lookup_tables` 디렉터리이거나 이름이 다음과 일치하는 하위 디렉터리일 수 있습니다. `*lookup_tables*`. 다음 항목을 사용할 수 있습니다: [panther-analysis](https://github.com/panther-labs/panther-analysis) 저장소를 참고 자료로 사용할 수 있습니다.
* 테이블에 데이터를 로드할 때 사용할 스키마를 정의하는 YAML 파일
  * 이 데이터 스키마 파일은 해당 디렉터리 외부의 디렉터리에 저장해야 합니다. `lookup_tables` 디렉터리(예: `/schemas` panther analysis 저장소의 루트에). 다른 사용자 지정 로그 스키마와 함께 저장할 수 있습니다.
* 테이블에 로드할 데이터를 포함하는 JSON 또는 CSV 파일(선택 사항, 자세한 내용은 계속 읽어보세요).

**스키마 및 구성 파일 작성**

테이블 구성에서 해당 값 중 일부를 참조하므로, 일반적으로 먼저 데이터 스키마를 작성하는 것이 좋습니다.

1. YAML 데이터 스키마 파일을 만드세요. 이 스키마는 테이블에 데이터를 업로드하는 데 사용할 파일을 읽는 방법을 정의합니다. 데이터를 CSV 파일로 사용하는 경우 스키마는 CSV를 구문 분석할 수 있어야 합니다.
   * 테이블 스키마는 로그 스키마와 동일한 형식입니다. 스키마 작성에 대한 자세한 내용은 다음에 대한 문서를 참조하세요. [로그 스키마 관리.](https://docs.panther.com/data-onboarding/custom-log-types#uploading-log-schemas-with-the-panther-analysis-tool)
2. 테이블 구성용 YAML 파일을 만드세요. S3의 파일에 저장된 데이터를 사용하는 사용자 지정 enrichment의 경우 예시 구성은 다음과 같습니다:
   * 다음 사항에 유의하세요 `Refresh` 필드에는 다음이 포함됩니다 `RoleARN`, `ObjectPath`, 그리고 `PeriodMinutes` 필드.
   * 필수 및 허용 값의 전체 목록은 다음에서 확인하세요 [Custom Enrichment Specification Reference](/ko/enrichment/custom/lookup-table-specification-reference.md).

     ```yaml
     AnalysisType: lookup_table
     LookupName: my_lookup_table # 고유한 표시 이름
     Schema: Custom.MyTableSchema # 이전 단계에서 정의한 스키마
     Refresh:
       RoleArn: arn:aws:iam::123456789012:role/PantherLUTsRole-my_lookup_table # 조직의 AWS 계정에 있는 역할
       ObjectPath: s3://path/to/my_lookup_table_data.csv
       PeriodMinutes: 120 # 2시간마다 S3에서 동기화
     Description: >
       이 테이블에 어떤 정보가 포함되어 있는지에 대한 유용한 설명입니다.
       예를 들어, 이 테이블은 IP 주소를 호스트 이름으로 변환할 수 있습니다
     Reference: >
       이 테이블과 관련된 추가 문서의 URL
     Enabled: true # 테이블 사용을 중지하려면 false로 설정
     LogTypeMap:
       PrimaryKey: ip                # 테이블의 기본 키
       AssociatedLogTypes:           # 이 테이블과 매칭할 로그 유형 목록
         - LogType: AWS.CloudTrail
           Selectors:
             - "sourceIPAddress"     # CloudTrail 로그의 필드
             - "p_any_ip_addresses"  # Panther가 생성한 필드도 사용할 수 있습니다
         - LogType: Okta.SystemLog
           Selectors:
             - "$.client.ipAddress"  # JSON 값에 대한 경로도 허용됩니다
     ```
3. 저장소 루트에서 다음을 실행하여 스키마 파일을 업로드하세요 [`panther_analysis_tool update-custom-schemas`](/ko/panther/detections-repo/pat/pat-commands.md#update-custom-schemas-creating-or-updating-custom-schemas) `--path ./schemas`.
4. 저장소 루트에서 다음을 사용하여 사용자 지정 enrichment를 업로드하세요\
   [`panther_analysis_tool upload`](/ko/panther/detections-repo/pat/pat-commands.md#upload-uploading-packages-to-panther-directly).

**사전 요구 사항**

S3와 동기화하도록 사용자 지정 enrichment를 구성하기 전에 다음 항목을 준비해야 합니다:

1. Panther가 S3 버킷에 액세스하는 데 사용할 수 있는 AWS의 IAM 역할 ARN입니다. Panther용 IAM 역할 설정에 대한 자세한 내용은 다음 섹션을 참조하세요 [IAM 역할 생성.](#creating-an-iam-role)
2. 데이터를 저장하려는 파일의 경로입니다. 경로 형식은 다음과 같아야 합니다: `s3://bucket-name/path_to_file/file.csv`

</details>

### 옵션 4: Google Cloud Storage(GCS) 버킷에서 사용자 지정 강화 데이터 동기화

Panther Console 또는 PAT를 통해 GCS 버킷에서 데이터 동기화를 설정할 수 있습니다:

<details>

<summary>Panther Console</summary>

**Panther Console를 통해 GCS 버킷에서 사용자 지정 enrichment 데이터 동기화**

GCS 동기화 enrichment 설정은 간소화된 4단계 마법사를 사용합니다: **기본 정보** → **GCS에 연결** → **스키마** → **검증**.

1. Panther Console의 왼쪽 탐색 표시줄에서 **구성 > Enrichments**.
2. 오른쪽 상단에서 **새로 만들기**.
3. 을 클릭합니다. **Google Cloud Storage에서 데이터 동기화** 타일.
4. 다음 페이지에서 **기본 정보** 필드에 다음을 입력합니다:
   * **강화 이름**: 사용자 지정 강화에 대한 설명 이름.
   * **설명 - 선택 사항**: 테이블에 대한 추가 정보.
   * **참조 - 선택 사항**: 일반적으로 내부 리소스로 연결되는 하이퍼링크에 사용됩니다.
5. 클릭 **설정**.
6. 다음 페이지에서 **GCS에 연결** 페이지에서 Google Cloud Storage 소스와 ID 설정을 한 단계로 구성하세요:

   **소스 세부 정보:**

   * 다음을 입력하세요 **Google Cloud Storage URI**, 특정 객체를 식별하는 고유한 경로입니다(예: `gs://my-bucket/path/to/file.json`).

   **ID 설정:**

   * 기본적으로 다음이 **Terraform Template File** 카드가 표시됩니다 — 클릭하세요 **계속** 카드에서 Terraform 기반 설정을 사용하세요.
   * 대신 Workload Identity Federation을 수동으로 구성하려면 다음을 클릭하세요 **모든 것을 직접 설정하고 싶습니다** 카드 아래의 링크.
   * 방법을 선택한 후 안내에 따라 JSON 자격 증명 구성 파일을 업로드하세요.
   * 데이터는 다음 형식이어야 합니다 `.csv` 또는 `.json` 형식이어야 합니다.\
     ![](/files/1fe53f7f3f1a4aed381568eb261c3dce749066a1)
7. 클릭 **계속**.
8. 다음 페이지에서 **스키마** 페이지에서 테이블 스키마를 구성합니다.\
   \&#xNAN;***참고:** 아직 새 스키마를 생성하지 않았다면 다음을 참조하세요* [*스키마 생성에 대한 문서*](https://docs.runpanther.io/data-onboarding/custom-log-types/example-csv)*. 스키마를 생성하면 사용자 지정 enrichment를 구성하는 동안 스키마 페이지의 드롭다운에서 이를 선택할 수 있습니다.*
   1. 다음을 선택합니다. **스키마 이름** 를 선택합니다.
   2. 다음을 선택합니다. **기본 키 이름** 드롭다운에서 선택합니다. 이는 다음과 같은 테이블의 고유한 열이어야 합니다. `accountID`.
9. 클릭 **계속**.
10. 다음 페이지에서 **검증** 페이지에서 선택적으로 **이 사용자 지정 enrichment가 데이터를 받지 못할 경우 경보를 설정하시겠습니까?** 로 **예** 로 전환하여 알러트를 활성화합니다.

    * 다음을 입력합니다. **Number** 및 **기간** 필드에 Panther가 이 알림을 보내는 빈도를 지정합니다.
    * 로 전환하세요. 이 알러트의 알러트 대상은 페이지 하단에 표시됩니다. 알림이 전송되는 위치를 구성하고 사용자 지정하려면 다음 문서를 참조하세요. [Panther 대상](/ko/alerts/destinations.md).

    ![](/files/c71386d833d08af780369e6d8d92e2d29b24603c)​
11. 클릭 **설정 완료**.

{% hint style="info" %}
**기존 GCS enrichment를 편집하는 경우:** 기존 GCS enrichment를 편집할 때 추가 **연관 로그 유형** 단계가 다음 사이에 나타납니다 **GCS에 연결** 및 **스키마** 단계, 로그 유형/선택기를 지정할 수 있습니다:

* 클릭 **로그 유형 추가**.
* 다음을 클릭합니다. **로그 유형** 드롭다운을 열고 로그 유형을 선택합니다.
* 하나 이상 선택하세요 **Selectors**, 사용자 지정 enrichment 데이터로 보강할 로그 유형의 외래 키 필드입니다.
  * 다음을 사용하여 중첩 객체의 속성을 참조할 수도 있습니다. [JSON 경로 구문](https://goessner.net/articles/JsonPath/). 예를 들어 맵의 필드를 참조하려면 다음을 입력할 수 있습니다. `$.field.subfield`.
* 클릭 **로그 유형 추가** 필요한 경우 다른 항목을 추가합니다.
  {% endhint %}

{% hint style="info" %}
사용자 지정 enrichment 업로드 실패에 대해 생성된 알림은 다음에서 확인할 수 있습니다 **시스템 오류** 탭에서 **알러트 및 오류** Panther Console의 페이지.
{% endhint %}

**ID 설정 옵션**

다음의 일부로 **GCS에 연결** 마법사의 단계에서 다음을 사용하여 두 가지 ID 설정 방법 중에서 선택할 수 있습니다 [Workload Identity Federation](https://cloud.google.com/iam/docs/workload-identity-federation):

* **Terraform Template File** (기본 카드): 설정에 제공된 Terraform 템플릿을 사용합니다. 다음을 클릭하세요 **계속** 카드에서 계속 진행하세요.
* **수동 설정**: 클릭하세요 **모든 것을 직접 설정하고 싶습니다** GCP 콘솔에서 Workload Identity Federation을 수동으로 구성하려면 카드 아래의 링크를 클릭하세요.

![](/files/788f148bd5dd5a9dc53dfc54f9a1d1e07b79c436)

**Terraform 템플릿 파일을 사용하여 Workload Identity Federation 설정**

1. 다음 페이지에서 **GCS에 연결** 페이지의 **ID 설정** 섹션에서 다음을 클릭하세요 **계속** 의 **Terraform Template File** 카드.
2. 클릭 **Terraform template**, 그러면 자체 파이프라인을 통해 적용할 수 있도록 템플릿이 다운로드됩니다.
3. 다음의 필드를 채우세요 `panther.tfvars` 파일에 구성 값을 입력하세요.
   * 값을 제공하세요: `panther_workload_identity_pool_id`, `panther_workload_identity_pool_provider_id`**,** 및 `panther_aws_account_id`.
   * 파일의 지침에 따라 나머지 리소스와 함께 버킷을 생성할지, 아니면 이미 버킷이 있는지 결정하세요.
4. Terraform 구성 파일이 포함된 작업 디렉터리를 초기화하고 다음을 실행하세요. `terraform init`.
5. 해당하는 **Terraform 명령어를** 복사하여 CLI에서 실행하세요.
6. 풀의 자격 증명 구성 파일을 생성하려면 다음을 복사하세요. **gcloud 명령어를** 제공된 값에서 프로젝트 번호, 풀 ID, 공급자 ID를 바꾼 다음 CLI에서 실행하세요.
   * 프로젝트 번호, 풀 ID, 공급자 ID는 다음의 출력에서 찾을 수 있습니다. **Terraform 명령어를**.
7. 자격 증명 구성 파일을 업로드하세요. **ID 설정** 섹션에
8. 다음을 클릭하여 마법사를 계속 진행하세요. **계속**.

**GCP 콘솔에서 Workload Identity Federation을 수동으로 설정**

다음을 선택하면 **모든 것을 직접 설정하고 싶습니다** 옵션을 **ID 설정** 섹션에서 Workload Identity Federation을 수동으로 구성할 수 있습니다:

1. Google Cloud 콘솔에서 Panther가 로그를 가져올 버킷을 확인하세요.
   * 아직 버킷을 만들지 않았다면, 다음을 참조하세요. [버킷 생성에 대한 Google 문서](https://cloud.google.com/storage/docs/creating-buckets).

{% hint style="warning" %}
[균일한 버킷 수준 액세스](https://cloud.google.com/storage/docs/uniform-bucket-level-access) Workload Identity Federation 엔티티가 클라우드 스토리지 리소스에 액세스하도록 허용하려면 대상 버킷에서 반드시 활성화되어야 합니다.
{% endhint %}

2. [IAM API 사용 설정](https://console.cloud.google.com/apis/library/iam.googleapis.com).
3. 다음을 따라 AWS와 함께 Workload Identity Federation을 구성하세요. [AWS 또는 Azure와 함께 Workload Identity Federation 구성](https://cloud.google.com/iam/docs/workload-identity-federation-with-other-clouds) 문서.
   1. 다음 중 하나를 [속성 매핑 및 조건을 정의하는](https://cloud.google.com/iam/docs/workload-identity-federation-with-other-clouds#mappings-and-conditions)경우 다음 예시를 참고하세요:
      * 예시 [속성 매핑](https://cloud.google.com/iam/docs/workload-identity-federation#mapping):

        <table><thead><tr><th width="195.8271484375">Google</th><th width="523.1220703125">AWS</th></tr></thead><tbody><tr><td><code>google.subject</code></td><td><code>assertion.arn.extract('arn:aws:sts::{account_id}:')+":"+assertion.arn.extract('assumed-role/{role_and_session}').extract('/{session}')</code></td></tr><tr><td><code>attribute.account</code></td><td><code>assertion.account</code></td></tr></tbody></table>
      * 예시 [속성 조건](https://cloud.google.com/iam/docs/workload-identity-federation#conditions):\
        `attribute.account=="<PANTHER_AWS_ACCOUNT_ID>"`
   2. 다음을 할 때 [ID 풀에 공급자를 추가하는](https://cloud.google.com/iam/docs/workload-identity-federation-with-other-clouds#aws)선택하세요. **AWS**.

{% hint style="warning" %}
다음의 값은 `google.subject` 속성 [127자를 초과할 수 없습니다](https://cloud.google.com/iam/docs/workload-identity-federation#mapping). 다음을 사용할 수 있습니다 [공통 표현 언어(CEL) 식](https://cloud.google.com/iam/docs/workload-identity-federation#mapping) AWS에서 발급된 토큰의 속성을 변환하거나 결합하기 위해 사용됩니다. 위 표에서 제안된 식은 이 제한을 고려한 것이며, ARN을 Panther 엔터티를 고유하게 식별하는 값으로 변환하려는 시도입니다. AWS 속성에 대한 자세한 내용은 "Example 2 - Called by user created with AssumeRole"를 참조하세요. [이 AWS 문서 페이지](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetCallerIdentity.html).
{% endhint %}

4. 필요한 IAM 역할을 계정에 할당합니다.

* 다음 권한은 Pub/Sub 구독과 토픽이 있는 프로젝트에 필요합니다:

  <table data-header-hidden><thead><tr><th width="327.374982940047" align="center">필요한 권한</th><th width="294.15662026309724" align="center">역할</th><th width="208" align="center">조건</th></tr></thead><tbody><tr><td align="center"><strong>필요한 권한</strong></td><td align="center"><strong>역할</strong></td><td align="center"><strong>범위</strong></td></tr><tr><td align="center"><p><code>storage.objects.get</code></p><p><code>storage.objects.list</code></p></td><td align="center"><code>roles/storage.objectViewer</code></td><td align="center"><em>bucket-name</em></td></tr></tbody></table>

  * **참고:** 특정 리소스의 권한에 대해 조건 또는 IAM 정책을 설정할 수 있습니다. 이는 GCP의 IAM 섹션(아래 예시 스크린샷에서 볼 수 있음) 또는 특정 리소스의 페이지에서 수행할 수 있습니다.\
    ![In the Google Cloud console, the "IAM" navigation bar item is circled. In a slide-out panel, sections titled "Add principals" and "Assign roles" are circled.](/files/a4a66c9ddb93df2d2e451f85e9839e240f453bd6)
  * **참고:** 다음을 사용하여 권한을 생성할 수 있습니다. `gcloud` CLI 도구에서 `$PRINCIPAL_ID` 는 다음과 같을 수 있습니다:\
    `principalSet://iam.googleapis.com/projects/<THE_ACTUAL_GOOGLE_PROJECT_NUMBER>/locations/global/workloadIdentityPools/<THE_ACTUAL_POOL_ID>/attribute.account/<THE_ACTUAL_PANTHER_AWS_ACCOUNT_ID>`
    * `gcloud projects add-iam-policy-binding $PROJECT_ID --member="$PRINCIPAL_ID" --role="roles/storage.objectViewer"`

5. [자격 증명 구성 파일을 다운로드합니다](https://cloud.google.com/iam/docs/workload-download-cred-and-grant-access), 이 파일은 Panther에서 GCP 인프라에 인증하는 데 사용됩니다.

* gcloud CLI 도구를 사용하여 자격 증명 구성 파일을 생성하려면 다음 명령 형식을 사용하세요:\
  `gcloud iam workload-identity-pools create-cred-config projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/$POOL_ID/providers/$PROVIDER_ID --aws --output-file=config.json`

6. 다시 **GCS에 연결** Panther Console의 단계로 돌아가 자격 증명 구성 파일을 **ID 설정** 섹션에 업로드한 다음, 마법사를 계속 진행합니다.

</details>

<details>

<summary>PAT</summary>

**PAT를 통해 GCS 버킷에서 사용자 정의 보강 데이터 동기화**

**파일 및 폴더 설정**

사용자 지정 강화에는 다음 파일이 필요합니다:

* 강화 테이블용 YAML 구성 파일
  * 이 사용자 지정 강화 구성 파일은 다음 이름을 포함하는 폴더에 저장되어야 합니다. `lookup_tables`*.* 이는 최상위 수준의 `lookup_tables` 디렉터리이거나 이름이 다음과 일치하는 하위 디렉터리일 수 있습니다. `*lookup_tables*`. 다음 항목을 사용할 수 있습니다: [panther-analysis](https://github.com/panther-labs/panther-analysis) 저장소를 참고 자료로 사용할 수 있습니다.
* 테이블에 데이터를 로드할 때 사용할 스키마를 정의하는 YAML 파일
  * 이 데이터 스키마 파일은 해당 디렉터리 외부의 디렉터리에 저장해야 합니다. `lookup_tables` 예를 들어, 다른 사용자 지정 로그 스키마와 함께 저장할 수 있으며, 예: `/schemas` panther-analysis 저장소 루트의 디렉터리입니다.
* 테이블에 로드할 데이터를 포함하는 JSON 또는 CSV 파일(선택 사항, 자세한 내용은 계속 읽어보세요).

**스키마 및 구성 파일 작성**

테이블 구성에서 해당 값 중 일부를 참조하므로, 일반적으로 먼저 데이터 스키마를 작성하는 것이 좋습니다.

1. YAML 데이터 스키마 파일을 만드세요. 이 스키마는 테이블에 데이터를 업로드하는 데 사용할 파일을 읽는 방법을 정의합니다. 데이터를 CSV 파일로 사용하는 경우 스키마는 CSV를 구문 분석할 수 있어야 합니다.
   * 테이블 스키마는 로그 스키마와 동일한 형식입니다. 스키마 작성에 대한 자세한 내용은 다음에 대한 문서를 참조하세요. [로그 스키마 관리.](https://docs.panther.com/data-onboarding/custom-log-types#uploading-log-schemas-with-the-panther-analysis-tool)
2. 테이블 구성을 위한 YAML 파일을 생성합니다. GCS의 파일에 저장된 데이터로 사용자 정의 보강을 하려면 아래 예시 파일을 참조하세요.
   * 다음 사항에 유의하세요 `Refresh` 필드에는 다음이 포함됩니다 `GCSCredentials`, `StorageProvider`, `ObjectPath`, 그리고 `PeriodMinutes` 필드.
   * 필수 및 허용 값의 전체 목록은 다음에서 확인하세요 [Custom Enrichment Specification Reference](/ko/enrichment/custom/lookup-table-specification-reference.md).

     ```yaml
     AnalysisType: lookup_table
     LookupName: my_lookup_table # 고유한 표시 이름
     Schema: Custom.MyTableSchema # 이전 단계에서 정의한 스키마
     Refresh:
       ObjectPath: gs://path/to/my_lookup_table_data.csv
       GCSCredentials: '{"universe_domain":"googleapis.com","type":"external_account","audience":"//iam.googleapis.com/projects/123456789012/locations/global/workloadIdentityPools/mypool/providers/myprovider","subject_token_type":"urn:ietf:params:aws:token-type:aws4_request","token_url":"https://sts.googleapis.com/v1/token","credential_source":{"environment_id":"aws1","region_url":"http://169.254.169.254/latest/meta-data/placement/availability-zone","url":"http://169.254.169.254/latest/meta-data/iam/security-credentials","regional_cred_verification_url":"https://sts.{region}.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15"},"token_info_url":"https://sts.googleapis.com/v1/introspect"}'
       StorageProvider: GCS
       PeriodMinutes: 120 # 2시간마다 GCS에서 동기화
     Description: >
       이 테이블에 어떤 정보가 포함되어 있는지에 대한 유용한 설명입니다.
       예를 들어, 이 테이블은 IP 주소를 호스트 이름으로 변환할 수 있습니다
     Reference: >
       이 테이블과 관련된 추가 문서의 URL
     Enabled: true # 테이블 사용을 중지하려면 false로 설정
     LogTypeMap:
       PrimaryKey: ip                # 테이블의 기본 키
       AssociatedLogTypes:           # 이 테이블과 매칭할 로그 유형 목록
         - LogType: AWS.CloudTrail
           Selectors:
             - "sourceIPAddress"     # CloudTrail 로그의 필드
             - "p_any_ip_addresses"  # Panther가 생성한 필드도 사용할 수 있습니다
         - LogType: Okta.SystemLog
           Selectors:
             - "$.client.ipAddress"  # JSON 값에 대한 경로도 허용됩니다
     ```
3. 저장소 루트에서 다음을 실행하여 스키마 파일을 업로드하세요 [`panther_analysis_tool update-custom-schemas`](/ko/panther/detections-repo/pat/pat-commands.md#update-custom-schemas-creating-or-updating-custom-schemas) `--path ./schemas`.
4. 저장소 루트에서 다음을 사용하여 사용자 지정 enrichment를 업로드하세요\
   [`panther_analysis_tool upload`](/ko/panther/detections-repo/pat/pat-commands.md#upload-uploading-packages-to-panther-directly).

**사전 요구 사항**

GGS 버킷과 동기화되도록 사용자 정의 보강을 구성하기 전에 다음을 준비해야 합니다:

* Panther가 Google Cloud Storage 객체에 액세스하는 데 사용할 수 있는 워크로드 아이덴티티 풀의 JSON 자격 증명 구성입니다. Panther용 Workload Identity Federation 설정에 대한 자세한 내용은 **아이덴티티 설정** 섹션의 **Panther Console** 위 지침을 참조하세요.
* 데이터를 저장하려는 파일의 경로입니다. 경로 형식은 다음과 같아야 합니다: `gs://bucket-name/path_to_file/file.csv`

</details>

## 사용자 정의 보강 데이터를 사용하여 디택션 작성

사용자 정의 보강을 구성한 후에는 추가 컨텍스트를 기반으로 디택션을 작성할 수 있습니다.

예를 들어, AWS CloudTrail 로그에서 개발자 계정과 프로덕션 계정을 구분하도록 사용자 정의 보강을 구성했다면, 다음 조건이 모두 참일 때만 알러트를 받도록 하고 싶을 수 있습니다:

* MFA가 활성화되지 않은 상태로 로그인한 사용자.
* AWS 계정이 프로덕션(개발자 아님) 계정입니다.

아래에서 보강 데이터를 사용하여 디택션을 만드는 방법을 확인하세요:

{% tabs %}
{% tab title="Python" %}
**이벤트가 자동으로 보강된 보강 데이터에 액세스하기**

Python에서 다음을 사용할 수 있습니다. [`deep_get()` 헬퍼 함수](/ko/detections/rules/python/globals.md#deep_get) 조회된 필드를 가져오려면 `p_enrichment` 로그의 foreign key field를 사용합니다. 패턴은 다음과 같습니다:

```python
deep_get(event, 'p_enrichment', <Enrichment name>, <foreign key in log>, <field in Enrichment>)
```

{% hint style="info" %}
사용자 정의 enrichment 이름, foreign key, field name은 모두 선택적 매개변수입니다. 지정하지 않으면, `deep_get()` 사용 가능한 모든 enrichment 데이터를 포함한 계층형 딕셔너리를 반환합니다. 매개변수를 지정하면 관심 있는 데이터만 반환되도록 할 수 있습니다.
{% endhint %}

룰은 다음과 같이 됩니다:

```python
from panther_base_helpers import deep_get
 def 룰(event):
   is_production = deep_get(event, 'p_enrichment', 'account_metadata',
'recipientAccountId', 'isProduction') # 접근하는 필드가 리스트 안에 저장되어 있다면 대신 deep_walk()를 사용하세요
   return not event.get('mfaEnabled') and is_production
```

***

**enrichment 데이터를 동적으로 액세스하기**

다음도 사용할 수 있습니다. [event 객체의 `lookup()` 함수를](/ko/detections/rules/python.md#lookup) 를 사용하여 디택션에서 enrichment 데이터를 동적으로 액세스할 수 있습니다. 이는 이벤트에 enrichment의 primary key column에 있는 값과 정확히 일치하는 값이 없을 때 유용할 수 있습니다.
{% endtab %}

{% tab title="간단한 디택션" %}
다음과 같은 [간단한 디택션](/ko/detections/rules/writing-simple-detections.md)에서는 다음을 만들 수 있습니다. [Enrichment match expression](/ko/detections/rules/writing-simple-detections/match-expression.md#enrichment-match-expressions).

```yaml
디택션:
  - Enrichment:
      Table: account_metadata
      Selector: recipientAccountId
      FieldPath: isProduction
    Condition: Equals
    Value: true
  - KeyPath: mfaEnabled
    Condition: Equals
    Value: false
```

{% endtab %}
{% endtabs %}

Panther 룰 엔진은 조회된 일치 항목을 가져와 key를 사용해 해당 데이터를 이벤트에 추가합니다. `p_enrichment` 다음 JSON 구조에서:

```json
{ 
    "p_enrichment": {
        <enrichment table 이름>: { 
            <로그에서 일치한 key>: <조회된 일치 행>,
            ...
	    <로그에서 일치한 key>: <조회된 일치 행>,
	}    
    }
} 
```

예시:

```json
 {
  "p_enrichment": {
      "account_metadata": {
          "recipientAccountId": {
              "accountID": "90123456", 
              "isProduction": false, 
              "email": "dev.account@example.com",
              "p_match": "90123456"
              }
          }
      }
}

```

일치하는 로그 key의 값이 배열인 경우(예: `p_any_aws_accout_ids`), 조회 데이터는 일치하는 레코드를 포함하는 배열입니다.

```json
{ 
    "p_enrichment": {
        <enrichment table 이름>: { 
            <일치한 로그 key가 배열인 경우>: [
                <조회된 일치 행>,
                <조회된 일치 행>,
                <조회된 일치 행>
            ]
	}
     }
} 
```

예시:

```json
 {
  "p_enrichment": {
      "account_metadata": {
          "p_any_aws_account_ids": [
             {
              "accountID": "90123456", 
              "isProduction": false, 
              "email": "dev.account@example.com",
              "p_match": "90123456"
              },
              {
              "accountID": "12345678", 
              "isProduction": true, 
              "email": "prod.account@example.com",
              "p_match": "12345678"
              }
          ]
      }
  }
}
```

### 보강(enrichment)을 사용하는 탐지를 테스트하기

다음을 사용하는 규칙의 경우 `p_enrichment`, 클릭 **테스트 데이터 보강** JSON 코드 편집기의 오른쪽 상단에서 이를 클릭하여 보강 데이터로 채우세요. 그러면 다음을 포함하는 이벤트로 Python 함수를 테스트할 수 있습니다 `p_enrichment`.

{% hint style="info" %}
단위 테스트가 제대로 보강되려면 이벤트에 다음 두 필드가 지정되어 있어야 합니다:

* `p_log_type`: 이는 사용할 보강(enrichment)을 결정합니다
* 선택자 필드: 이는 비교할 값을 제공합니다
  {% endhint %}

<figure><img src="/files/f392fd86eadd5ce9df8cf0dfdbbe286b85d1b88d" alt="A &#x22;Unit Test&#x22; header is above a code block with JSON. The JSON includes various key/value pairs—for example, &#x22;p_log_type&#x22;: &#x22;My.Log.Type&#x22;"><figcaption></figcaption></figure>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.panther.com/ko/enrichment/custom.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
