# 변환

## 개요

변환은 Panther로 수집될 때 데이터의 형태를 수정하기 위해 사용자 지정 로그 소스 스키마에서 사용할 수 있는 함수입니다. 그러면 데이터는 새 형식으로 저장됩니다.

변환은 저장된 데이터를 디택션 및 쿼리 로직의 요구에 맞게 정렬하여, 임시 데이터 조작의 필요성을 없애고 디택션 작성과 검색을 더 빠르게 합니다.

다음 변환을 사용할 수 있습니다:

* [`copy`](#copy)
* [`rename`](#rename)
* [`concat`](#concat)
* [`split`](#split)
* [`mask`](#mask)
* [`isEmbeddedJSON`](#isembeddedjson)

{% hint style="info" %}
수집 시 다음을 사용하여 데이터를 추가로 조작할 수 있습니다. [Script Log Parser](/ko/data-onboarding/custom-log-types/script-parser.md).
{% endhint %}

### 변환 실행 순서

변환은 특정 순서로 수행되며, 이를 통해 변환이 예측 가능한 방식으로 하나씩 적용됩니다. 실행 순서는 다음과 같습니다. [위의 Overview에 있는 변환 목록에 제공된 순서](#overview).

정의된 순서를 따라 데이터를 정확하게 변환하세요. 순서 내 각 변환은 이전 변환 후 남겨진 상태의 데이터에 대해 작동합니다. 이 순서를 알면 일관성을 유지하고 예상치 못한 결과를 방지할 수 있습니다.

#### 변환 결합

개별 변환은 더 복잡한 데이터 변환을 달성하기 위해 쌍 또는 시퀀스로 결합할 수 있습니다. 이를 통해 특정 데이터 요구 사항을 충족하고 효율적인 디택션 생성 및 검색 작업을 용이하게 하기 위해 더 큰 유연성과 사용자 지정이 가능합니다.

개인 식별 번호(PIN)를 포함하는 필드가 있다고 가정해 보겠습니다. 보안상의 이유로 PIN을 마스킹하는 동시에 필드 이름을 덜 드러나는 이름으로 바꾸고 싶습니다.

이를 위해 다음을 사용할 수 있습니다. `rename` 변환을 사용하여 필드 이름을 더 추상적인 이름으로 변경합니다. 예를 들어, 필드 이름을 다음으로 바꿀 수 있습니다. `userId`.

다음으로 다음을 적용합니다. `mask` 변환을 다음에 적용합니다. `userId` 필드에 적용하여 PIN의 숫자를 미리 정의된 수의 별표로 바꿉니다. 이렇게 하면 PIN이 숨겨져 데이터 프라이버시가 보장됩니다.

다음과 같이 다음과 `rename` 그리고 다음을 모두 포함하는 필드 스키마를 정의할 수 있습니다. `mask` 지시문은 다음과 같습니다:

```yaml
- name: userId
  type: string
  rename:
    from: PIN
  mask:
    type: redact
    to: "*****"
```

다음과 같은 페이로드를 변환할 수 있습니다:

```json
{
  "PIN": "1234"
}
```

다음으로:

```json
{
  "userId": "*****"
}
```

## `rename`

다음 `rename` 변환은 필드의 이름을 변경합니다. 이는 데이터 소스 전반에서 필드 이름을 표준화하거나, 데이터 구조의 명확성을 높이거나, 유효하지 않은 문자가 포함되었거나 예약 키워드가 포함된 필드 이름을 조정하려는 경우 유용합니다.

다음이 포함된 필드 스키마를 정의하면 `rename` 지시문은 다음과 같습니다:

```yaml
- name: user
  type: string
  rename: 
    from: "@user"
- name: role
  type: object
  fields:
   - name: level
     type: string
     rename:
       from: type
```

다음과 같은 페이로드를 변환할 수 있습니다:

```json
{
  "@user": "john"
  "role": {
    "type": "admin"
  }
}
```

다음으로:

```json
{
  "user": "john"
  "role": {
    "level": "admin"
  }
}
```

## `copy`

다음 `copy` 변환은 중첩된 필드의 값을 다른 최상위 필드로 복사합니다. 이는 데이터의 JSON 구조를 평면화하려는 경우 유용할 수 있습니다. 원하는 경우, 새로 정의한 필드를 나중에 다음으로 표시할 수 있습니다. [`인디케이터`](/ko/search/panther-fields.md#indicator-fields).

다음이 포함된 필드 스키마를 정의하면 `copy` 지시문은 다음과 같습니다:

```yaml
- name: message
  type: string
  copy:
    from: attributes.message
- name: attributes
  type: json
```

다음과 같은 페이로드를 변환할 수 있습니다:

```json
{
  "attributes": {
      "message": "hello there", 
      "user": "someone"
  }
}
```

다음으로:

```json
{
  "message": "hello there",
  "attributes": {
      "message": "hello there", 
      "user": "someone"
  }
}
```

## `concat`

다음 `concat` 변환을 사용하면 여러 필드의 값을 새 필드의 값으로 연결할 수 있습니다. 결과적으로 생성된 결합 필드는 예를 들어 보강(enrichment)을 위한 키로 사용할 수 있습니다.

다음이 있는 필드는 `type` 은 `타임스탬프` 연결 작업에 사용할 수 없습니다.

다음을 사용하려면 `concat`, 다음을 선언하세요. `문자열` 필드에 연결 결과를 저장합니다. 다음 안에서 `concat`, 다음을 정의하세요. `paths`, 그리고 선택적으로 다음을 정의하세요. `separator`. 다음 안에서 `paths`기존 스키마 필드 중 결합하려는 필드를 지정하려면 절대 경로를 사용해야 합니다. 이 필드들의 순서가 연결 순서를 결정합니다. If `separator` 가 정의되지 않으면 기본 구분자는 빈 문자열입니다(`""`).

다음이 포함된 필드 스키마를 정의하면 `concat` 지시문은 다음과 같습니다:

```yaml
- name: ip
  type: string
- name: ports
  type: object
  fields:
   - name: https
     type: int
- name: socket
  type: string
  concat:
   separator: ":"
   paths: 
    - ip
    - ports.https
```

다음과 같은 페이로드를 변환할 수 있습니다:

```json
{
  "ip": "192.168.0.1"
  "ports": {
    "https": 443
  }
}
```

다음으로:

```json
{
  "ip": "192.168.0.1"
  "ports": {
    "https": 443
  },
  "socket": "192.168.0.1:443"
}
```

## `split`

다음 `split` 변환을 사용하면 구분자를 기준으로 문자열 필드를 분리하여 특정 값을 추출할 수 있습니다. 결과적으로 분리된 필드는 개별 스키마 필드로 취급할 수 있으므로 이를 다음으로 지정할 수 있습니다. [인디케이터](/ko/search/panther-fields.md#indicator-fields). split 변환은 또한 데이터 정규화를 표준화된 필드로 하는 데 도움이 되어 비정형 데이터 형식을 더 쉽게 처리할 수 있게 합니다.

type이 다음인 필드만 `문자열` 다른 필드로 분할할 수 있습니다(즉, `split:from:` 의 값은 다음을 포함하는 필드여야 합니다. `type: string`).

다음을 사용하려면 `split`결과를 저장하려면 object, array, JSON을 제외한 임의의 원시 타입 필드를 선언하세요. 다음 안에 `split` 지시문에는 다음 필수 필드를 포함하세요:

* `from`: 분할할 필드의 절대 경로를 제공합니다.
* `separator`: 분할에 사용할 문자를 제공합니다.
* `index`: split로 생성된 결과 배열에서 값의 위치를 제공합니다.

다음이 포함된 필드 스키마를 정의하면 `split` 지시문은 다음과 같습니다:

```yaml
- name: socket
  type: string
- name: ip
  type: string
  split:
   from: socket
   separator: ":"
   index: 0
- name: port
  type: int
  split:
   from: socket
   separator: ":"
   index: 1  
```

다음과 같은 페이로드를 변환할 수 있습니다:

```json
{
  "socket": "192.168.0.1:443"
}
```

다음으로:

```json
{
  "socket": "192.168.0.1:443",
  "ip": "192.168.0.1",
  "port": 443
}
```

다음도 사용할 수 있습니다. `split` 배열 요소를 분할할 때 사용합니다. 예를 들어 다음 스키마를 사용하면:

```yaml
- name: traffic
  type: array
  element: 
    type: object
    fields:
      - name: socket
        type: string
      - name: ip
        type: string
        indicators: [ip]
        split: 
          from: traffic.socket
          separator: ":"
          index: 0
      - name: port
        type: int
        split: 
          from: traffic.socket
          separator: ":"
          index: 1
       
```

다음과 같은 페이로드를 변환할 수 있습니다:

```json
{
  "traffic": [
   {
     "socket": "192.168.0.1:443"
   },
   {
     "socket": "192.168.0.2:80"
   } 
  ]
}
```

다음으로:

```json
{
  "traffic": [
   {
     "socket": "192.168.0.1:443",
     "ip": "192.168.0.1",
     "port": 443
   },
   {
     "socket": "192.168.0.2:80",
     "ip": "192.168.0.2",
     "port": 80
   } 
  ]
}
```

## `mask`

다음 `mask` 변환을 사용하면 로그의 민감한 정보를 숨길 수 있습니다. 마스킹은 특정 데이터를 보호해야 할 때 유용합니다.

마스킹에는 두 가지 기법이 있습니다:

* [Obfuscation](#obfuscation-hashing) (해싱이라고도 함): 이 기법은 선택적 salt 값을 사용하여 데이터를 해싱합니다. 이 기법을 사용하면 값의 참조 무결성이 유지됩니다.
* [Redaction](#redaction): 이 기법은 민감한 값을 다음으로 대체합니다. `REDACTED`, 또는 사용자가 제공한 다른 문자열로 대체합니다. 이 기법을 사용하면 값의 참조 무결성이 손실됩니다.

특정 필드를 마스킹하면 나중에 Panther의 [검색 도구](/ko/search.md) 를 사용하여 원래 값을 조회할 수 없지만, 해시된 값은 검색할 수 있습니다.

### Obfuscation (hashing)

수신 데이터를 해싱하면 향후에도 사용성을 유지하면서 보안을 강화할 수 있습니다. 해싱이 제공하는 보호를 강화하려면 salt를 포함할 수 있습니다.

난독화를 사용하려면 스키마의 대상 필드에 다음을 포함하세요. `mask`. 다음 아래에 `mask`, 다음을 포함하세요. `type`, 그리고 선택적으로 `salt`.

의 값은 사용하려는 해싱 알고리즘입니다. 지원되는 값은 다음을 포함합니다: `type` sha512

* `sha256`
* `md5`
* `sha1`
* `선택적`

키의 값은 원하는 문자열입니다. 이 값은 해시되기 전에 필드 값에 추가됩니다. `salt` 다음을 사용할 때

, 대상 필드의 값은 다음으로 항상 설정되어야 합니다. `mask`type `type` string `문자열`실제 입력 데이터는 어떤 타입이든 될 수 있지만, 값이 마스킹된 후 데이터 레이크에 문자열로 저장되므로 `type: string` 가 필요합니다.

다음이 포함된 필드 스키마를 정의하면 `mask` 지시문은 다음과 같습니다:

```yaml
- name: username
  type: string # Must be set as string (though all data types allowed)
  mask:
    type: sha256 
    salt: random_salt # Optional
```

다음과 같은 페이로드를 변환할 수 있습니다:

```json
{
  "username": "john"
}
```

다음으로:

```json
{
  "username": "98b4ceb956e9ed4539b0721add25cab0bacce4307cf3140c4430c1513476a3e4"
}
```

### Redaction

수신 데이터를 리댁팅한다는 것은 미리 정의된 값으로 대체하는 것을 의미합니다. 이 기법은 민감한 정보에 대한 접근이나 복구가 불가능하도록 보장하고 싶을 때 유용합니다.

리댁션을 사용하려면 스키마의 대상 필드에 다음을 포함하세요. `mask`. 다음 아래에 `mask`, 다음을 포함하세요. `type: redact`, 그리고 선택적으로 `를`.

선택적 `를` 키는 실제 이벤트 값을 대체할 문자열 값을 사용합니다. If `를` 가 포함되지 않으면 기본값인 `REDACTED`이 사용됩니다.

, 대상 필드의 값은 다음으로 항상 설정되어야 합니다. `mask`type `type` string `문자열`실제 입력 데이터는 어떤 타입이든 될 수 있지만, 값이 마스킹된 후 데이터 레이크에 문자열로 저장되므로 `type: string` 가 필요합니다.

다음이 포함된 필드 스키마를 정의하면 `mask` 지시문은 다음과 같습니다:

```yaml
- name: username
  type: string # Must be set as string (though all data types allowed)
  mask:
    type: redact 
    to: "XXXX" # Optional, default: "REDACTED"
```

다음과 같은 페이로드를 변환할 수 있습니다:

```json
{
  "username": "john"
}
```

다음으로:

```json
{
  "username": "XXXX"
}
```

## `isEmbeddedJSON`

때때로 JSON 값은 문자열 안에 포함되어 전달됩니다.

문자열 내부의 이스케이프된 JSON을 Panther가 파싱하도록 하려면 다음을 사용하세요. `isEmbeddedJSON: true` 플래그를 사용합니다. 이 플래그는 다음 타입의 값에 유효합니다. `객체`, `array` 및 `json`.

다음이 포함된 필드 스키마를 정의하면 `isEmbeddedJSON` 지시문은 다음과 같습니다:

```yaml
- name: message
  type: object
  isEmbeddedJSON: true
  fields:
    - name: foo
      type: string
```

다음과 같은 페이로드를 변환할 수 있습니다:

```json
{
  "timestamp": "2021-03-24T18:15:23Z",
  "message": "{\"foo\":\"bar\"}"
}
```

다음으로:

```json
{
  "timestamp": "2021-03-24T18:15:23Z",
  "message": {
    "foo": "bar"
  }
}
```


---

# 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/data-onboarding/custom-log-types/transformations.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.
