> For the complete documentation index, see [llms.txt](https://docs.panther.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.panther.com/ko/detections/correlation-rules.md).

# 상관 룰 (Beta)

## **개요**

{% hint style="info" %}
상관 룰은 Panther 버전 1.108부터 오픈 베타이며, 모든 고객이 이용할 수 있습니다. 버그 보고와 기능 요청은 Panther 지원팀과 공유해 주세요.
{% endhint %}

{% hint style="warning" %}
이 기능은 현재 다음과 호환되지 않습니다 [Databricks 백엔드.](/ko/search/backend/databricks.md)
{% endhint %}

Panther에서 correlation 룰을 사용하면 다양한 로그 유형에 걸쳐 여러 작업을 추적할 수 있습니다. correlation 룰에서 지정하는 것은 [그룹](#group-correlation-rules) 또는 특정 [순서](#sequence-correlation-rules) 의 [신호](/ko/detections/signals.md) 일치로 간주되기 위해 특정 시간 창 내에 발생해야 하는 — 그런 다음 신호를 생성하고, 선택적으로, 알러트 [알러트](/ko/alerts.md).

다음도 포함할 수 있습니다: *부재* correlation 룰 기준에 신호의 부재를 포함할 수도 있습니다. correlation 룰의 일치는 룰 일치나 알러트가 아니라 신호에 의해 결정되므로, 다음을 포함하는 룰, 예약 룰 및 correlation 룰을 포함할 수 있습니다: [알러트가 비활성화되어 있는](/ko/detections/signals.md#how-to-create-a-rule-that-only-produces-signals).

예를 들어 다음과 같은 경우 알러트를 생성하고 싶다면 correlation 룰이 특히 유용할 수 있습니다:

* 특정 Okta 사용자가 100회 이상의 로그인 실패 후 성공적으로 로그인한 다음, 루트 사용자로 AWS에 로그인하는 경우([아래의 전체 예시 참조](#brute-force-okta-login-to-aws-root-login))
* GitHub 저장소의 고급 보안 설정이 비활성화된 뒤, 그 저장소가 아카이브되지 않은 경우([아래의 전체 예시 참조](#github-repository-security-policy-disabled-without-subsequent-archival))

[사용자 지정 correlation 룰을 만드는 방법은 아래에서 알아보세요](#how-to-create-a-correlation-rule), 그리고 correlation 룰을 구성하는 YAML 키에 대한 자세한 내용은 [Correlation 룰 참조](/ko/detections/correlation-rules/correlation-rule-reference.md). 또한 다음을 활용할 수도 있습니다: [Panther에서 관리하는 correlation 룰](https://github.com/panther-labs/panther-analysis/tree/main/correlation_rules).

{% hint style="warning" %}
correlation 룰을 사용하면 Snowflake 컴퓨팅 비용이 증가할 수 있습니다. correlation 룰을 더 비용 효율적으로 만드는 방법은 다음의 지침을 참조하세요: [correlation 룰을 더 효율적으로 만들기](#making-correlation-rules-more-efficient), 아래에서.
{% endhint %}

## correlation 룰 작동 방식

correlation 룰은 YAML로 작성되며 이전에 생성된 [룰](/ko/detections/rules.md), [예약 룰](/ko/detections/rules.md), 및/또는 correlation 룰을 참조합니다. 각 correlation 룰은 [정해진 일정에 따라 실행됩니다](#setting-schedule), 그리고 ["룩백 윈도우"를 정의합니다,](#setting-lookbackwindowminutes) 즉, 룰이 찾아야 하는 과거의 시간 범위입니다 [신호](/ko/detections/signals.md) (또는 신호의 부재).

correlation 룰에 다음과 같은 추가 기준을 적용할 수 있습니다:

* 특정 룰에서 찾아야 하는 신호의 최소 개수 또는 최대
* 하나의 룰에서 다른 룰로 특정 이벤트 값이 일치하도록 요구하는 것(예: 모든 개별 룰의 신호에 동일한 IP 주소가 포함되도록 요구)
* 의 후속 단계가 [순서](#sequence-correlation-rules) 특정 시간 내에 발생했음을 요구

### correlation 룰에서 일치가 발생하면 어떻게 되는지

correlation 룰의 일치는 [신호](/ko/detections/signals.md). correlation 룰에서 알러트 기능이 활성화되어 있으면 룰 일치가 생성되며, 이는 correlation 룰의 [중복 제거 설정에 따라 알러트를 생성할 수 있습니다](#deduplication-of-events). [여기에서 신호, 룰 일치 및 알러트의 차이에 대해 자세히 알아보세요](https://docs.panther.com/ko/detections/pages/28a2f0a91092222209c65334fa10beb60037d689#signals-vs.-rule-matches-vs.-alerts).

correlation 룰에 대해 알러트가 생성되면, 해당 correlation 룰에서 참조하는 개별 룰, 예약 룰 및 correlation 룰도 자체 알러트를 생성할 수도 있고, 생성하지 않을 수도 있습니다. 이는 다음에 따라 달라집니다:

* 각 개별 룰, 예약 룰 및 correlation 룰에 알러트 기능이 활성화되어 있는지 여부
* 해당 `임계값` 개별 룰 또는 예약 룰의 값과 `MinMatchCount` correlation 룰의 값. correlation 룰은 알러트를 생성하지만 이를 구성하는 룰은 생성하지 않는 예외적인 경우는 개별 룰의 이벤트 임계값(다음을 사용하여 설정됨) `임계값` 키)이 `MinMatchCount` correlation 룰의 값보다 높고 실제 룰 일치 수가 그 중간쯤에 있는 경우입니다.

### 그룹 vs. 순서

correlation 룰에는 두 가지 유형이 있습니다: [그룹](#group-correlation-rules) 그리고 [순서](#sequence-correlation-rules). 그룹 및 시퀀스 상관 룰은 신호가 발견되어야 하는 룰의 집합을 정의합니다(또는 *이 아니라* 발견되며, 다음을 설정함으로써 `부재: true`).

그룹 상관 룰은 모든 룰이 신호(또는 부재)를 생성한 경우, 신호가 발견된 순서와 상관없이 알러트를 생성합니다. 반면, 시퀀스 룰은 알러트를 생성하기 위해 신호(또는 부재)가 발견되어야 하는 특정 순서를 정의합니다.

### 스케줄과 룩백 윈도우 설정

각 상관 룰은 다음 두 가지를 모두 정의합니다:

* 스케줄: 다음에 의해 정의됩니다. [`일정`](/ko/detections/correlation-rules/correlation-rule-reference.md#schedule-fields) 필드(다음 중 하나를 사용하는 `RateMinutes` 또는 `CronExpression`), 스케줄은 상관 룰이 얼마나 자주 실행되어야 하는지를 나타냅니다.
* 룩백 윈도우: 다음에 의해 정의됨 `LookbackWindowMinutes` 필드에 의해, 룩백 윈도우는 상관 룰이 찾아야 할 과거의 분 수를 지정합니다 [신호](/ko/detections/signals.md) (또는 신호의 부재)를 해당 그룹 또는 시퀀스에 포함된 룰, 예약된 룰 또는 상관 룰에 대해.

의 값을 설정할 때 `일정` 그리고 `LookbackWindowMinutes`, 몇 가지 요소를 고려하는 것이 좋습니다:

* 이 상관 룰에서 일치가 발생했을 때 적시에 알림을 받는 것이 얼마나 중요한지
  * 예를 들어, 우선순위가 낮은 상관 룰은 24시간마다 한 번만 실행해도 충분할 수 있습니다. 또는 우선순위가 높은 상관 룰은 15분마다 실행하고 싶을 수도 있습니다.
* 상관 룰이 찾는 첫 번째와 마지막 신호가 일치가 생성되어야 하는 동일한 발생의 일부로 간주되기까지 시간적으로 얼마나 떨어져 있을 수 있는지
  * 참조 [신호가 룩백 윈도우 사이에서 분할되지 않도록 보장](#ensuring-signals-arent-split-between-lookback-windows)
* 상관 관계 룰과 연관된 룰에 의해 평가된 데이터 소스(들)에서 예상되는 최대 지연 시간
  * 참조 [로그 소스 지연 시간을 고려하여 `LookbackWindowMinutes`](#accounting-for-log-source-latency-in-lookbackwindowminutes)

`일정` 그리고 `LookbackWindowMinutes` 값은 Snowflake 컴퓨팅 비용에 영향을 미칠 수 있습니다. 참고 [correlation 룰을 더 효율적으로 만들기](#making-correlation-rules-more-efficient) 자세한 내용은

#### 신호가 룩백 윈도우 사이에서 분할되지 않도록 보장

필요한 신호가 여러 상관관계 룰 실행의 룩백 윈도우에 걸쳐 나뉘어 있어, 찾고 있는 대상의 발생을 놓치지 않도록 룩백 윈도우를 설정하는 것이 좋습니다.

<details>

<summary>피해야 할 상황의 예</summary>

우리가 피하려는 이 상황을 설명하기 위해, 다음의 단순화된 상관관계 룰 구성을 보세요:

```yaml
 # 나쁜 예시; 복제하지 마세요
 - 그룹:
    - 룰ID: First.룰
    - 룰ID: Second.룰
    - 룰ID: Third.룰
   스케줄:
     요금 분: 60
   조회 기간(분): 90
```

이 시나리오에서는 매시간 상관 룰이 이전 90분을 되돌아보며, 포함된 세 개의 룰에 대한 신호를 찾습니다. `그룹`. 다음 각 규칙이 아래 시간에 신호를 일치/생성했다고 해봅시다:

* 신호용 `첫 번째.룰` 오후 12:58에 생성됨
* 신호용 `두 번째.룰` 오후 1:05에 생성됨
* 신호용 `세 번째.룰` 오후 1:40에 생성됨

상관 룰은 매 시 30분에 실행되도록 예약되어 있습니다. 다음 시간에 실행됩니다:

* 오후 1:30(오후 12:00까지 되돌아봄): 첫 번째와 두 번째 신호(오후 12:58 및 1:05)만 보므로, 일치를 생성하지 않습니다.
* 오후 2:30(오후 1:00까지 되돌아봄): 두 번째와 세 번째 신호(오후 1:05 및 1:40)만 보므로, 역시 일치를 생성하지 않습니다.

이 상관 룰의 작성자는 세 개의 모든 룰에 대한 신호가 42분 이내(오후 12:58부터 1:40까지)에 생성되었다면 상관 룰이 일치했을 것이라고 예상했을 가능성이 높습니다. 그러나 상관 룰의 단일 실행에 대한 되돌아보기 창 내에서 필요한 세 신호가 모두 발견되지 않았기 때문에 일치는 생성되지 않았습니다.

</details>

상관 룰이 일치하는 데 필요한 신호가 서로 다른 실행에 걸쳐 분리되지 않도록(즉, 동일한 되돌아보기 창에 포함되도록) 하려면, 먼저 첫 번째 신호와 마지막 신호가 시간상 얼마나 떨어져 있어야 같은 발생으로 간주되어 알림 대상이 되는지 확인하세요. 편의상 이 값을 "최대 신호 시간 범위(분)"이라고 부르겠습니다.

(이는 혼동해서는 안 됩니다 [`WithinTimeFrameMinutes`](https://docs.panther.com/detections/correlation-rules/correlation-rule-reference#transitions-fields), 이는 시퀀스의 두 단계가 통과하려면 발생해야 하는 시간 범위입니다. "Maximum signal timespan minutes"와 `WithinTimeFrameMinutes` 상관 룰이 시퀀스이고 두 단계만 지정하는 경우에는 같을 수 있습니다.)

다음을 구성하도록 권장합니다 `LookbackWindowMinutes` 값을 설정하여 길이가 "maximum signal timespan minutes"인 모든 가능한 창이 상관 룰의 최소 한 번 실행 내에 포함되도록 하세요. 일반적으로 다음 공식으로 이를 수행할 수 있습니다:

* 만약 `RateMinutes` <= "maximum signal timespan minutes":
  * `LookbackWindowMinutes` = 2 x "maximum signal timespan minutes" + 로그 수집 지연
* 만약 `RateMinutes` > "maximum signal timespan minutes":
  * `LookbackWindowMinutes` = "maximum signal timespan minutes" + `RateMinutes` + 로그 수집 지연

로그 수집 지연의 포함을 이해하려면 다음을 참조하세요 [로그 소스 지연 시간을 고려하여 `LookbackWindowMinutes`](#accounting-for-log-source-latency-in-lookbackwindowminutes)

#### 로그 소스 지연 시간을 고려하여 `LookbackWindowMinutes`

로그 수집 지연은 상관 룰과 연결된 룰이 평가하는 데이터 소스에서 예상되는 최대 지연입니다.

신호는 관련 이벤트가 발생한 시간(`p_event_time`), *이 아니라* 이벤트가 Panther에 수집된 시간(`p_parse_time`) 수집 지연을 고려해야 하므로 `LookbackWindowMinutes` 마지막으로 상관 룰이 실행된 이후의 모든 "새로운" 데이터를 처리하고 있음을 보장하기 위해.

예를 들어, 상관 룰이 매시간 실행되도록 구성되어 있다면(예: 다음을 설정하여 `RateMinutes` 에서 `60`) 그리고 상관 룰과 연결된 룰의 로그 소스가 Panther로 로그 전달을 최대 3시간까지 지연할 수 있다고 명시하는 경우, 다음을 설정할 수 있습니다 `LookbackWindowMinutes` 에서 `60 + 3*60`, 또는 `240`. 추가로 설명하면, 3시간의 수집 지연 때문에 Panther가 `오전 9:01에` 는 `p_event_time` 빠르면 `오전 6:01`. `오전 10:00에`, 최소한 `오전 6:01`.

### 이벤트 중복 제거

상관 룰의 중복 제거 기간은 [`LookbackWindowMinutes`](/ko/detections/correlation-rules/correlation-rule-reference.md#detection-fields) 필드의 값입니다. 이는 동일한 `LookbackWindowMinutes` 시간 범위 내의 중첩된 상관 룰에는 해당 상관 룰과 일치하게 만든 고유 이벤트만 포함됩니다.

개별 룰 및 상관 룰에서 참조되는 예약 룰에 설정된 중복 제거( `dedup()`, `중복 제거 기간(분)`, `임계값` 또는 Console에서 설정한)는 상관 룰에는 적용되지 않습니다.

### 상관 룰 오류

상관 룰을 다루는 동안 다음 오류 중 하나를 받을 수 있습니다:

* [Simple 디택션 오류 코드](/ko/detections/rules/writing-simple-detections/simple-detection-error-codes.md): 상관 룰을 구성하는 데 잘못된 구문을 사용했습니다
* [디택션 오류](/ko/alerts.md#overview): 상관 룰의 실행이 실패했습니다
* [시스템 오류](/ko/system-configuration/notifications/system-errors.md): 상관 룰이 시간 초과되었습니다(아마도 너무 큰 `LookbackWindowMinutes` 값 때문일 수 있음)

## 그룹 상관 룰

그룹 상관 룰은 다음에 대해 룰들의 모음을 정의합니다 [신호](/ko/detections/signals.md) (또는 신호가 없는 경우)가 주어진 룩백 윈도우 내에서 발생해야 합니다. 신호는 어떤 순서로든 발생할 수 있습니다.

이벤트들의 모음이 특정 순서로 발생하길 원한다면, [시퀀스 상관 룰](#sequence-correlation-rules) 대신.

### MatchCriteria

그룹 상관 룰에서, `MatchCriteria` 키는 각 룰, 예약 룰, 상관 룰별로 상관 룰이 통과하려면 일치하는 값을 가져야 하는 필드를 정의합니다.

여러 로그 유형, 스케줄된 룰 또는 상관 룰과 연결된 경우, 다음만 [`p_` 필드](/ko/search/panther-fields.md) 매치될 수 있습니다. (하나의 로그 유형에만 연결된 룰의 경우, 모든 필드가 매치될 수 있습니다.)

매치 기준이 정의되지 않은 경우, 특정 이벤트 필드 값이 일치해야 한다는 요구사항이 없으므로 상관 룰은 덜 구체적입니다.

자세한 내용은 `MatchCriteria` 에서 [Correlation 룰 참조](/ko/detections/correlation-rules/correlation-rule-reference.md#matchcriteria-fields).

### MinMatchCount

그룹 상관 룰에서, `MinMatchCount` 은 개별 룰, 스케줄된 룰 또는 상관 룰(정의된 `그룹`)의 최소 개수를 지정하는 선택적 필드로, 이 상관 룰이 매치되려면 해당 개수가 일치해야 합니다.

예를 들어, 다음 안에 다섯 개의 룰을 나열하고 `그룹` 그리고 `MinMatchCount: 2`를 추가하면, 다섯 개의 룰 중 아무 두 개가 시그널을 생성할 때 상관 룰이 매치됩니다.

`MinMatchCount` 은 다음에 정의된 개별 룰에서도 사용할 수 있는 필드입니다 `그룹`. 두 필드가 함께 사용되는 예는 다음의 [MinMatchCount가 있는 그룹 예시](#group-with-minmatchcount), 아래에서.

### 그룹 예시

아래 예시는 다음 JSON 이벤트를 참조합니다:

<details>

<summary>예시 이벤트</summary>

이 샘플 이벤트에는 가독성을 위해 일부 필드만 포함되어 있습니다.

```json
[
  {
    "p_룰_id": "Standard.BruteForceByIP",
    "event_type": "failed_login",
    "p_event_time": "2023-12-08 10:27:03.496000000",
    "p_알러트_context": {
      "ip": "136.24.229.58",
      "geolocation": "미국 캘리포니아주 샌프란시스코"
    }
  },
  {
    "p_룰_id": "Standard.BruteForceByIP",
    "event_type": "failed_login",
    "p_event_time": "2023-12-08 10:27:03.623000000",
    "p_알러트_context": {
      "ip": "136.24.229.58",
      "geolocation": "미국 캘리포니아주 샌프란시스코"
    }
  },
  {
    "p_룰_id": "Standard.BruteForceByIP",
    "event_type": "failed_login",
    "p_event_time": "2023-12-08 10:27:03.861000000",
    "p_알러트_context": {
      "ip": "136.24.229.58",
      "geolocation": "미국 캘리포니아주 샌프란시스코"
    }
  },
  {
    "p_룰_id": "Okta.Login.Success",
    "event_type": "successful_login",
    "p_event_time": "2023-12-08 10:27:54.317000000",
    "p_알러트_context": {
      "ip": "136.24.229.58",
      "geolocation": "미국 캘리포니아주 샌프란시스코"
    }
  },
  {
    "p_룰_id": "AWS.Console.RootLogin",
    "eventType": "AwsApiCall",
    "p_event_time": "2023-12-08 10:30:13.274000000",
    "p_알러트_context": {
      "sourceIPAddress": "136.24.229.58"
    }
  }
]
```

</details>

{% tabs %}
{% tab title="MatchCriteria가 있는 그룹" %}
이 예에서는, `MatchCriteria` 는 `IP` 필드가 네 개의 룰 모두에서 동일한 값을 포함해야 함을 지정합니다.

```yaml
디택션:
  - 그룹:
      - ID: &failed_login 로그인 실패
        룰ID: Standard.BruteForceByIP
        MinMatchCount: 7
      - ID: &successful_login 로그인 성공
        룰ID: Okta.Login.Success
      - ID: &root_access 루트 접근
        룰ID: AWS.Console.RootLogin
      - ID: &missing_crowdstrike Crowdstrike 누락 
        룰ID: Crowdstrike.디택션.passthrough
        부재: true
    MatchCriteria:
      ip:
        - GroupID: *failed_login
          매치: p_알러트_context.ip
        - GroupID: *successful_login
          매치: p_알러트_context.ip
        - 그룹 ID: *root_access
          매치: p_알러트_context.sourceIPAddress
        - 그룹 ID: *missing_crowdstrike
          매치: p_any_ip_addresses
    이벤트 평가 순서: 시간순
    조회 기간(분): 60
    스케줄:
      빈도(분): 30
      타임아웃(분): 7
```

{% endtab %}

{% tab title="매치 기준이 없는 그룹" %}
이 예시에서는 처음 세 개의 룰에 대해 신호가 발견되지만 *이 아니라* 네 번째 룰에는 신호가 없더라도 상관 룰은 통과합니다.

```yaml
디택션:
  - 그룹:
      - 룰 ID: Standard.BruteForceByIP
        MinMatchCount: 7
      - 룰 ID: Okta.Login.Success
      - 룰 ID: AWS.Console.RootLogin
      - 룰 ID: Crowdstrike.디택션.passthrough
        부재: true
    조회 기간(분): 60
    스케줄:
      빈도(분): 30
      타임아웃(분): 3
```

{% endtab %}

{% tab title="최소 매치 개수가 있는 그룹" %}
이 예시에서는 `MinMatchCount` 아래의 값은 `디택션` 세 개의 룰 중 임의의 두 개에 대해 신호가 발견되면 `그룹`, 상관 룰이 일치합니다. 또한 `MinMatchCount` 내의 룰에 정의된 `그룹`, 이는 상위 수준의 `MinMatchCount`. 이 상관 룰이 통과하는 경우의 예시는 아래 목록을 참조하세요.

```yaml
디택션:
  - 그룹:
      - 룰 ID: Standard.BruteForceByIP
        MinMatchCount: 7
      - 룰 ID: Okta.Login.Success
      - 룰 ID: AWS.Console.RootLogin
    MinMatchCount: 2
    조회 기간(분): 60
    스케줄:
      빈도(분): 30
      타임아웃(분): 3
```

위 상관 룰은 다음 시나리오 중 하나라도 해당하면 통과합니다:

* 다음으로부터 최소 하나의 신호가 있을 때 `Okta.Login.Success` 그리고 다음으로부터 최소 하나의 신호가 있을 때 `AWS.Console.RootLogin`
* 다음으로부터 최소 7개의 신호가 있을 때 `Standard.BruteForceByIP` 그리고 다음으로부터 최소 하나의 신호가 있을 때 `Okta.Login.Success`
* 다음으로부터 최소 7개의 신호가 있을 때 `Standard.BruteForceByIP` 그리고 다음으로부터 최소 하나의 신호가 있을 때 `AWS.Console.RootLogin`
* 세 개의 룰 모두에서 신호가 있을 때(다음으로부터 최소 7개의 신호가 있는 경우 `Standard.BruteForceByIP`)
  {% endtab %}
  {% endtabs %}

## 시퀀스 상관 룰

시퀀스 상관 룰은 다음이 발생해야 하는 룰 모음을 정의합니다 [신호](/ko/detections/signals.md) (또는 신호의 부재)이 지정된 조회 기간 내에서 특정 순서로 발생해야 합니다.

시퀀스의 순서는 내부에 정의된 룰의 순서로 결정됩니다 `시퀀스` 키.

모든 룰에 신호(또는 부재)가 있기만 하고 특정 순서를 요구하지 않으려면, 다음을 사용하세요 [그룹 상관 룰](#group-correlation-rules) 대신.

### 전이

시퀀스 내에서 선택적으로 전이를 정의할 수 있습니다. 전이는 시퀀스의 한 단계가 다음 단계로 넘어가는 방식에 대한 추가 기준을 정의하며, 단계 사이에 경과할 수 있는 시간과 일치해야 하는 이벤트 필드를 포함합니다. 다음을 사용하면 `전이` 와 함께 `WithinTimeFrameMinutes` 및/또는 `매치` 는 상관 룰의 구체성을 높입니다.

전이가 정의되어 있다면, 에 포함된 룰 수보다 전이가 하나 적어야 합니다 `시퀀스`. 또한, 내부의 항목들은 `전이` 다음과 동일한 순서여야 합니다 `시퀀스` 목록입니다.

현재 상관 룰당 일치할 수 있는 필드 유형은 하나만 가능합니다(예: *모든* IP 주소 필드 또는 *모든* 이메일 주소 필드). 여러 로그 유형, 예약 룰 또는 상관 룰과 연결된 룰의 경우, 오직 [`p_` 필드](/ko/search/panther-fields.md) 매치될 수 있습니다. (하나의 로그 유형에만 연결된 룰의 경우, 모든 필드가 매치될 수 있습니다.)

전이에 대해 자세히 알아보기: [Correlation 룰 참조](/ko/detections/correlation-rules/correlation-rule-reference.md#transitions-fields).

### 시퀀스 예시

아래 예시는 다음 JSON 이벤트를 참조합니다:

<details>

<summary>예시 이벤트</summary>

이 샘플 이벤트에는 가독성을 위해 일부 필드만 포함되어 있습니다.

```json
[
  {
    "p_룰_id": "Standard.BruteForceByIP",
    "event_type": "failed_login",
    "p_event_time": "2023-12-08 10:27:03.496000000",
    "p_알러트_context": {
      "ip": "136.24.229.58",
      "geolocation": "미국 캘리포니아주 샌프란시스코"
    }
  },
  {
    "p_룰_id": "Standard.BruteForceByIP",
    "event_type": "failed_login",
    "p_event_time": "2023-12-08 10:27:03.623000000",
    "p_알러트_context": {
      "ip": "136.24.229.58",
      "geolocation": "미국 캘리포니아주 샌프란시스코"
    }
  },
  {
    "p_룰_id": "Standard.BruteForceByIP",
    "event_type": "failed_login",
    "p_event_time": "2023-12-08 10:27:03.861000000",
    "p_알러트_context": {
      "ip": "136.24.229.58",
      "geolocation": "미국 캘리포니아주 샌프란시스코"
    }
  },
  {
    "p_룰_id": "Okta.Login.Success",
    "event_type": "successful_login",
    "p_event_time": "2023-12-08 10:27:54.317000000",
    "p_알러트_context": {
      "ip": "136.24.229.58",
      "geolocation": "미국 캘리포니아주 샌프란시스코"
    }
  },
  {
    "p_룰_id": "AWS.Console.RootLogin",
    "eventType": "AwsApiCall",
    "p_event_time": "2023-12-08 10:30:13.274000000",
    "p_알러트_context": {
      "sourceIPAddress": "136.24.229.58"
    }
  }
]
```

</details>

{% tabs %}
{% tab title="전이 및 매치가 있는 시퀀스 " %}
사용 시 `전이` 와 함께 `매치` 내의 `시퀀스` 는 값이 일치해야 하는 이벤트 필드를 정의하고 싶을 때 유용합니다.

```yaml
디택션:
  - 시퀀스:
      - ID: 로그인 실패
        룰ID: Standard.BruteForceByIP
        MinMatchCount: 7
      - ID: 로그인 성공
        룰ID: Okta.Login.Success
        최소 매치 개수: 1
      - ID: 루트 로그인
        룰ID: AWS.Console.RootLogin
        최소 매치 개수: 1
      - ID: Crowdstrike 누락 
        룰ID: Crowdstrike.디택션.passthrough
        부재: true
    전이:
      - ID: 무차별 대입 로그인 성공
        시작: 로그인 실패
        종료: 로그인 성공
        시간 범위(분): 10
        매치:
          - 기준: client.ipAddress
      - ID: 루트 권한 획득
        시작: 로그인 성공
        종료: 루트 로그인
        매치:
          - 시작: client.ipAddress
            종료: p_알러트_context.sourceIPAddress
      - ID: Crowdstrike 부재
        시작: 루트 로그인
        종료: Crowdstrike 누락
        매치:
          - 시작: p_알러트_context.sourceIPAddress
            종료: p_any_ip_addresses
    조회 기간(분): 60
    이벤트 평가 순서: 시간순
    스케줄:
      빈도(분): 30
      타임아웃(분): 3
```

{% endtab %}

{% tab title="매치 없는 전이가 있는 시퀀스" %}
사용 시 `전이` 내의 `시퀀스` 없이 `매치` 는 시퀀스의 두 단계가 발생해야 하는 시간 범위만 지정하고 싶을 때 유용합니다. 다음을 사용하여 `WithinTimeFrameMinutes`.

```yaml
디택션:
  - 시퀀스:
      - ID: 로그인 실패
        룰ID: Standard.BruteForceByIP
        MinMatchCount: 7
      - ID: 로그인 성공
        룰ID: Okta.Login.Success
      - ID: 루트 로그인
        룰ID: AWS.Console.RootLogin
      - ID: Crowdstrike 누락 
        룰ID: Crowdstrike.디택션.passthrough
        부재: true
    전이:
      - ID: 무차별 대입 로그인 성공
        시작: 로그인 실패
        종료: 로그인 성공
        시간 범위(분): 10 # 시간 범위 정의
      - ID: 루트 권한 획득
        시작: 로그인 성공
        종료: 루트 로그인
      - ID: Crowdstrike 부재
        시작: 루트 로그인
        종료: Crowdstrike 누락
    조회 기간(분): 60
    스케줄:
      빈도(분): 30
      타임아웃(분): 3
```

{% endtab %}

{% tab title="전이 없는 시퀀스" %}
생략할 수 있습니다 `전이` 내의 `시퀀스` 매치할 이벤트 필드나 단계가 발생해야 하는 시간 범위를 지정하고 싶지 않다면.

```yaml
디택션:
  - 시퀀스:
      - 룰 ID: Standard.BruteForceByIP
        MinMatchCount: 7
      - 룰 ID: Okta.Login.Success
      - 룰 ID: AWS.Console.RootLogin
      - 룰 ID: Crowdstrike.디택션.passthrough
        부재: true
    조회 기간(분): 60
    스케줄:
      빈도(분): 30
      타임아웃(분): 3
```

{% endtab %}
{% endtabs %}

## 상관 룰 테스트

특정 조건에서 상관 룰에 대한 매치가 생성되는지 평가하기 위해 상관 룰에 단위 테스트를 추가할 수 있습니다(이로 인해 알러트가 생성될 수 있음—참조 [correlation 룰에서 일치가 발생하면 어떻게 되는지](#what-happens-when-there-is-a-match-on-a-correlation-rule)).

{% hint style="info" %}
상관 룰 테스트는 상관 로직만 테스트하기 위한 것입니다. 상관 룰을 구성하는 개별 룰의 룰 로직을 테스트하려면 개별 룰 자체의 단위 테스트를 사용하세요.
{% endhint %}

단위 테스트는 다음 내의 상관 룰에 정의됩니다 **단위 테스트** 탭( Panther Console에서) 또는 최상위 `테스트` 필드(CLI 워크플로우에서)에 정의되며, 다음과 유사한 구조를 가집니다 [룰 또는 정책에 대한 단위 테스트](/ko/detections/testing.md).

상관 룰의 각 단위 테스트에는 다음이 포함되어야 합니다 `이름`, `ExpectedResult`, 그리고 `룰 출력` 필드가 있어야 합니다. 다음을 구성하는 방법을 포함하여 단위 테스트의 YAML 구조에 대해 자세히 알아보세요: `룰 출력` 값 [여기, 상관 룰 참고 문서에서](/ko/detections/correlation-rules/correlation-rule-reference.md#tests-fields).

{% hint style="info" %}
상관 룰에 대한 테스트를 작성한 후 다음을 사용하여 실행할 수 있습니다: [Panther Analysis Tool `test` 명령](/ko/panther/detections-repo/pat/pat-commands.md#test-running-unit-tests). 실행 중 `pat test` 상관관계 룰에는 API 토큰이 필요합니다—참조 [API 토큰으로 인증하기](/ko/panther/detections-repo/pat/install-configure-and-authenticate-with-pat.md#authenticating-with-an-api-token) 자세한 내용은
{% endhint %}

### 단위 테스트 예시

다음 상관관계 룰을 사용합니다:

```yaml
- 시퀀스:
    - ID: OktaLoginFailure
      RuleID: Okta.Login.Failure
      MinMatchCount: 10
    - ID: OktaLoginSuccess
      룰ID: Okta.Login.Success
      최소 매치 개수: 1
    - ID: RootLogin
      룰ID: AWS.Console.RootLogin
      최소 매치 개수: 1
  
  전이:
    - ID: Okta Brute Force Login
      From: OktaLoginFailure
      To: OktaLoginSuccess
      시간 범위(분): 10
      매치:
        - 기준: client.ipAddress
    - ID: AWS Root Login
      From: OktaLoginSuccess
      To: RootLogin
      매치:
        - 시작: client.ipAddress
          To: srcIpAddress7
  
  스케줄:
    RateMinutes: 15
    TimeoutMinutes: 2
  
  조회 기간(분): 60
```

다음 테스트를 작성할 수 있습니다:

{% hint style="info" %}
아래 테스트가 룰의 YAML 파일에 포함되어 있었다면(CLI 워크플로에서 탐지를 관리할 때 요구되는 방식), 이는 a 아래에 배치될 것입니다 `테스트` 키.
{% endhint %}

{% tabs %}
{% tab title="절대 타임스탬프를 사용하는 테스트" %}
로그인 시도가 10번 있고 그 뒤에 성공적인 로그인이 이어진 다음 루트 로그인이 발생하면, 상관관계 룰이 반환할 것으로 예상합니다 `true`. 이 테스트는 절대 타임스탬프를 사용합니다—절대 타임스탬프 사용 방법에 대해 자세히 알아보세요 [여기, 상관 룰 참고 문서에서](/ko/detections/correlation-rules/correlation-rule-reference.md#matchvalue-fields).

{% code overflow="wrap" %}

```yaml
이름: 타임스탬프가 있는 성공적인 로그인
기대 결과: true
RuleOutputs:
  - ID: OktaLoginFailure
    Matches:
      client.ipAddress:
      # 원래 룰의 MinMatchCount가 10이므로, 최소 10개의 타임스탬프가 필요합니다
        123.123.123.123: ["2006-01-02T15:04:05Z", "2006-01-02T15:04:06Z","2006-01-02T15:04:07Z", "2006-01-02T15:04:08Z", "2006-01-02T15:04:09Z", "2006-01-02T15:04:10Z", "2006-01-02T15:04:11Z", "2006-01-02T15:04:12Z", "2006-01-02T15:04:13Z", "2006-01-02T15:04:14Z"]
  - ID: OktaLoginSuccess
    Matches:
      client.ipAddress:
        123.123.123.123: ["2006-01-02T15:04:15Z"]
  - ID: RootLogin
    Matches:
      srcIpAddress7:
        123.123.123.123: ["2006-01-02T15:04:16Z"]
```

{% endcode %}
{% endtab %}

{% tab title="상대 타임스탬프를 사용하는 테스트" %}
로그인 시도가 10번 있고 그 뒤에 성공적인 로그인이 이어진 다음 루트 로그인이 발생하면, 상관관계 룰이 반환할 것으로 예상합니다 `true`. 이 테스트는 상대 타임스탬프를 사용합니다—상대 타임스탬프 사용 방법에 대해 자세히 알아보세요 [여기, 상관 룰 참고 문서에서](/ko/detections/correlation-rules/correlation-rule-reference.md#matchvalue-fields).

{% code overflow="wrap" %}

```yaml
이름: 상대 분을 사용한 성공적인 로그인
기대 결과: true
RuleOutputs:
  - ID: OktaLoginFailure
    Matches:
      client.ipAddress:
      # 원래 룰의 MinMatchCount가 10이므로, 최소 10개의 타임스탬프가 필요합니다
        123.123.123.123: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  - ID: OktaLoginSuccess
    Matches:
      client.ipAddress:
        123.123.123.123: [11]
  - ID: RootLogin
    Matches:
      srcIpAddress7:
        123.123.123.123: [12]
```

{% endcode %}
{% endtab %}

{% tab title="ExpectedResult가 false인 테스트" %}
이 테스트는 룰이 다음으로 평가되기를 기대합니다 `false` 왜냐하면 *9* 번의 로그인 시도 뒤에 성공적인 로그인이 있기 때문이며, 10번은 아닙니다.

```yaml
이름: 성공 전 9번의 로그인 실패
ExpectedResult: false
RuleOutputs:
  - ID: OktaLoginFailure
    Matches:
      client.ipAddress:
        123.123.123.123: [1, 2, 3, 4, 5, 6, 7, 8, 9]
  - ID: OktaLoginSuccess
    Matches:
      client.ipAddress:
        123.123.123.123: [10]
  - ID: RootLogin
    Matches:
      srcIpAddress7:
        123.123.123.123: [11]
```

{% endtab %}
{% endtabs %}

## 상관관계 룰의 제한 사항

* 시퀀스가 전환을 사용하는 경우:
  * 허용되는 전환 수는 시퀀스 컬렉션에 포함된 룰 수보다 하나 적습니다.
  * 의 항목 순서는 `전이` 목록이 의 룰 순서와 일치해야 합니다. `시퀀스` 필드에 붙여넣습니다.
* 이벤트 필드 매칭을 사용하는 경우:
  * 이전의 값 `Match.On`/`Match.From` 다음과 일치해야 합니다 `Match.On`/`Match.To` 값도 복사하세요.
  * 하나 이상의 로그 유형, 예약 룰, 또는 상관 룰과 연결된 룰의 경우, `Match.On`/`Match.From`/`Match.To` 또는 `MatchCriteria.Match` 다음 중 하나여야 합니다 `p_` 에 나열된 필드 [표준 필드](/ko/search/panther-fields.md).
  * 상관 룰 전체에서 일치시킬 수 있는 필드 유형은 하나만 가능합니다. 예를 들어, IP 주소만 일치시킬 수 있거나, 이메일 주소만 일치시킬 수 있습니다.
  * 일치하지 않는 값에 대해 이벤트 필드 매칭을 사용하는 것은 불가능합니다. 예를 들어, 상관 룰의 한 단계에 있는 IP 주소가 다음 단계의 IP 주소와 일치하지 않을 때 상관 룰이 통과하는 것은 불가능합니다.

## 상관 룰을 만드는 방법

Panther Console 또는 로컬에서 상관 룰을 작성할 수 있습니다. 상관 룰을 구성하는 데 사용되는 YAML 키에 대한 설명은 다음을 참조하세요. [Correlation 룰 참조](/ko/detections/correlation-rules/correlation-rule-reference.md).

사용자 지정 상관 룰을 만드는 것 외에도, 다음도 활용할 수 있습니다 [Panther에서 관리하는 correlation 룰](https://github.com/panther-labs/panther-analysis/tree/main/correlation_rules), 다음에서 사용할 수 있는 `correlation_rules` 의 디렉터리 `panther-analysis` 리포지토리.

### Console에서 순서도 시각화 도구 사용하기

Panther Console에서 상관 룰을 작업하는 동안 순서도 시각화 도구를 사용할 수 있습니다. 이는 YAML로 상관 룰을 구성하는 동안 이를 시각적으로 렌더링하며, UI는 룰에 대한 즉각적인 검증 피드백을 제공합니다.

<figure><img src="/files/ed8253e81dda2aee4ef272cf2cb776d3505af5d1" alt="To the left of the YAML representation of a Correlation Rule called &#x22;Okta Brute Force Login into AWS Root Login,&#x22; is the graphical, visual builder representation. Each of the three rules in the Sequence has its own rectangle in the builder."><figcaption></figcaption></figure>

### Console에서 YAML로 상관 룰 만들기

Panther Console에서 상관 룰을 만들려면 목록 보기에서 디택션을 선택하여 YAML을 생성하거나, 직접 YAML을 구성할 수 있습니다.

{% tabs %}
{% tab title="룰을 선택하고 YAML 생성하기" %}

1. Panther 콘솔의 왼쪽 탐색 표시줄에서 다음을 클릭합니다: **디택션**.
2. 디택션 목록에서 상관 룰에 포함할 각 디택션의 왼쪽에 있는 체크박스를 클릭하세요.
   * 디택션을 클릭한 순서가 생성되는 [순서](#sequence-correlation-rules) 상관 룰의 순서가 됩니다.
3. 다음을 클릭합니다: **상관**.\
   ![Four buttons are shown: Download, Delete, Enable, Disable, and Correlate.](/files/c756accb12ac1de7fb6d127fc0a94cbdc0c83567)
4. 디택션 생성 페이지에서 상관 룰 구성을 완료하세요:
   * **이름**: 상관 룰에 대한 설명적인 이름을 입력하세요.
   * **ID** (선택 사항)**:** 펜 아이콘을 클릭하고 상관 룰의 고유 ID를 입력하세요.
   * 오른쪽 상단의 **활성화** 토글은 다음으로 설정됩니다 `켬` 기본값입니다. 룰을 비활성화하려면 토글을 다음으로 전환하세요 `끔`.
   * 다음의 **YAML 편집기** 탭:
     * 원하는 경우 생성된 상관 룰을 수정할 수 있습니다. 기본적으로 룰은 다음과 같습니다:
       * 다음입니다 [`시퀀스`](/ko/detections/correlation-rules/correlation-rule-reference.md#detection-fields) 상관 룰의 순서가 됩니다.
         * 이것을 다음으로 변경할 수 있습니다 [`그룹`](/ko/detections/correlation-rules/correlation-rule-reference.md#detection-fields) 다음을 클릭하여 **룰을 그룹으로 구성**.\
           ![A "YAML Editor" is selected, and an "Organize Rules as Group" button is circled.](/files/b82400beffa8bbd8412b75b3a624377ecaea76ad)\
           자세한 내용은 다음에서 확인하세요 [Console에서 시퀀스와 그룹 전환](#switching-between-sequence-and-group-in-the-console).
       * 설정합니다 [`MinMatchCount`](/ko/detections/correlation-rules/correlation-rule-reference.md#group-and-sequence-fields-rule-references) 에서 `1` 상관 룰에 포함된 모든 룰과 예약 룰에 대해.
       * 내부에서 [`전이`](/ko/detections/correlation-rules/correlation-rule-reference.md#transitions-fields), 설정합니다 [`Match.On`](/ko/detections/correlation-rules/correlation-rule-reference.md#match-fields) 각 전환마다 `p_any_usernames`.
         * 다음을 업데이트할 수 있습니다 `Match.On` 값을, 또는 대신 다음을 사용하세요 [`Match.To`](/ko/detections/correlation-rules/correlation-rule-reference.md#match-fields) 그리고 [`Match.From`](/ko/detections/correlation-rules/correlation-rule-reference.md#match-fields).
       * 설정합니다 [`Schedule.RateMinutes`](/ko/detections/correlation-rules/correlation-rule-reference.md#schedule-fields) 에서 `15` 그리고 [`Schedule.TimeoutMinutes`](/ko/detections/correlation-rules/correlation-rule-reference.md#schedule-fields) 에서 `2`.
       * 설정합니다 [`LookbackWindowMinutes`](/ko/detections/correlation-rules/correlation-rule-reference.md#detection-fields) 에서 `60`.
     * 상관 디택션 YAML 구문에 대한 자세한 내용은 다음에서 찾을 수 있습니다 [Correlation 룰 참조](/ko/detections/correlation-rules/correlation-rule-reference.md), 필수 및 선택 필드의 전체 목록을 포함합니다.
   * 다음의 **알러트 설정** 탭:
     * 다음 안에서 **기본** 탭에서 다음 필드를 구성하세요:

       * **알러트 생성**: 이것은 `ON/OFF` 토글은 다음이 있는지 여부를 나타냅니다 [알러트](/ko/alerts.md) 일치 항목이 있을 때 생성할지, 아니면 단지 [신호](/ko/detections/signals.md).
       * (다음에만 적용됨 **알러트 생성** 가 다음으로 설정되면 `켬`) **Severity:** 다음을 선택하세요 [심각도 수준](#alert-severity) 이 디택션으로 트리거된 알러트에 대해
       * (다음에만 적용됨 **알러트 생성** 가 다음으로 설정되면 `켬`) **대상 재정의:** 선택적으로 이 디택션에 대한 경고를 심각도와 관계없이 수신할 대상 위치를 선택합니다.

       <figure><img src="/files/a768e6e94410e7c60d072749631f325f4f98390f" alt=""><figcaption></figcaption></figure>
     * (다음에만 적용됨 **알러트 생성** 가 다음으로 설정되면 `켬`) 다음 안에서 **컨텍스트** 하위 탭에서 다음 필드의 값을 선택적으로 제공합니다:
       * **설명**: 룰에 대한 추가 컨텍스트를 입력하세요.
       * **런북**: 이 룰과 관련된 절차 및 작업을 입력하세요.
         * 자세한 내용은 [알러트 런북](/ko/alerts/alert-runbooks.md).
         * 설명적인 런북을 제공하는 것이 권장됩니다, 왜냐하면 [Panther AI 알러트 분류](/ko/alerts.md#ai-alert-triage) 그것을 고려할 것입니다.
       * **참조**: 이 룰과 관련된 추가 정보로 연결되는 외부 링크를 입력하세요.
       * **요약 속성**: 이 디택션에 의해 트리거되는 알러트에서 강조 표시할 속성을 입력하세요.
         * 중첩 필드를 요약 속성으로 사용하려면, Summary Attribute 필드에서 Snowflake 점 표기법을 사용하여 JSON 객체의 경로를 탐색하세요:

           `<column>:<level1_element>.<level2_element>.<level3_element>`

           그러면 알러트의 참조된 객체에 대한 알러트 요약이 생성됩니다. [Snowflake에서 반구조화된 데이터를 탐색하는 방법을 여기에서 자세히 알아보세요.](https://docs.snowflake.com/en/user-guide/querying-semistructured.html#label-traversing-semistructured-data)
         * 알러트 요약에 대한 자세한 내용은 다음을 참조하세요 [알러트 할당 및 관리](/ko/alerts/alert-management.md).
       * **Tags**: 룰을 한눈에 이해하는 데 도움이 되는 사용자 지정 태그를 입력하세요(예, `HIPAA`.)
       * 다음의 **프레임워크 매핑** 섹션:
         1. 다음을 클릭합니다: **새로 추가** 보고서를 입력하려면.
         2. 다음 필드에 값을 입력합니다:
            * **보고서 키**: 보고서와 관련된 키를 입력하세요.
            * **보고서 값**: 해당 보고서의 값을 입력하세요.
   * 다음의 **단위 테스트** 탭에서 선택적으로 테스트를 추가합니다:
     1. 다음을 클릭합니다: **+ 새 단위 테스트 추가**.
        * 이 상관관계 룰에 대한 테스트용 보일러플레이트 코드가 채워집니다.
     2. 채워진 텍스트를 필요한 만큼 조정하고, 다음의 내용을 포함하여 테스트의 나머지 부분을 채우세요: `일치`.
     3. 코드 편집기 아래에서 클릭합니다 **테스트 실행** 테스트를 평가하려면\
        ![](/files/7590050a1fb7d9227a1572a9954b61773be1f7e7)
5. 오른쪽 상단에서 다음을 클릭합니다: **배포**.
   {% endtab %}

{% tab title="YAML을 처음부터 작성" %}

1. Panther 콘솔의 왼쪽 탐색 표시줄에서 다음을 클릭합니다: **빌드** > **디택션**.
2. 다음을 클릭합니다: **새로 만들기**.
3. 다음에서 **상관관계 룰** 타일에서 다음을 클릭합니다: **시작**.
4. 디택션 생성 페이지에서 다음 필드를 채우세요:
   * **이름**: 상관 룰에 대한 설명적인 이름을 입력하세요.
   * **ID** (선택 사항)**:** 펜 아이콘을 클릭하고 상관 룰의 고유 ID를 입력하세요.
   * 오른쪽 상단의 **활성화** 토글은 다음으로 설정됩니다 `켬` 기본값입니다. 룰을 비활성화하려면 토글을 다음으로 전환하세요 `끔`.
   * 다음의 **YAML 편집기** 탭에서 상관관계 룰을 정의합니다.
     * 기본적으로 상관관계 룰은 다음과 같이 구성됩니다 [`시퀀스`](/ko/detections/correlation-rules/correlation-rule-reference.md#detection-fields). 이는 다음으로 변경할 수 있습니다 [`그룹`](/ko/detections/correlation-rules/correlation-rule-reference.md#detection-fields) 다음을 클릭하여 **룰을 그룹으로 구성**.\
       ![A "YAML Editor" is selected, and an "Organize Rules as Group" button is circled.](/files/b82400beffa8bbd8412b75b3a624377ecaea76ad)\
       자세한 내용은 다음에서 확인하세요 [Console에서 시퀀스와 그룹 전환](#switching-between-sequence-and-group-in-the-console).
     * 상관 디택션 YAML 구문에 대한 자세한 내용은 다음에서 찾을 수 있습니다 [Correlation 룰 참조](/ko/detections/correlation-rules/correlation-rule-reference.md), 필수 및 선택 필드의 전체 목록을 포함합니다.
   * 다음의 **알러트 설정** 탭:
     * 다음 안에서 **기본** 탭에서 다음 필드를 구성하세요:

       * **알러트 생성**: 이것은 `ON/OFF` 토글은 다음이 있는지 여부를 나타냅니다 [알러트](/ko/alerts.md) 일치 항목이 있을 때 생성할지, 아니면 단지 [신호](/ko/detections/signals.md).
       * (다음에만 적용됨 **알러트 생성** 가 다음으로 설정되면 `켬`) **Severity:** 다음을 선택하세요 [심각도 수준](#alert-severity) 이 디택션으로 트리거된 알러트에 대해
       * (다음에만 적용됨 **알러트 생성** 가 다음으로 설정되면 `켬`) **대상 재정의:** 선택적으로 이 디택션에 대한 경고를 심각도와 관계없이 수신할 대상 위치를 선택합니다.

       <figure><img src="/files/a768e6e94410e7c60d072749631f325f4f98390f" alt=""><figcaption></figcaption></figure>
     * (다음에만 적용됨 **알러트 생성** 가 다음으로 설정되면 `켬`) 다음 안에서 **컨텍스트** 하위 탭에서 다음 필드의 값을 선택적으로 제공합니다:
       * **설명**: 룰에 대한 추가 컨텍스트를 입력하세요.
       * **런북**: 이 룰과 관련된 절차 및 작업을 입력하세요.
         * 자세한 내용은 [알러트 런북](/ko/alerts/alert-runbooks.md).
         * 설명적인 런북을 제공하는 것이 권장됩니다, 왜냐하면 [Panther AI 알러트 분류](/ko/alerts.md#ai-alert-triage) 그것을 고려할 것입니다.
       * **참조**: 이 룰과 관련된 추가 정보로 연결되는 외부 링크를 입력하세요.
       * **요약 속성**: 이 디택션에 의해 트리거되는 알러트에서 강조 표시할 속성을 입력하세요.
         * 중첩 필드를 요약 속성으로 사용하려면, Summary Attribute 필드에서 Snowflake 점 표기법을 사용하여 JSON 객체의 경로를 탐색하세요:

           `<column>:<level1_element>.<level2_element>.<level3_element>`

           그러면 알러트의 참조된 객체에 대한 알러트 요약이 생성됩니다. [Snowflake에서 반구조화된 데이터를 탐색하는 방법을 여기에서 자세히 알아보세요.](https://docs.snowflake.com/en/user-guide/querying-semistructured.html#label-traversing-semistructured-data)
         * 알러트 요약에 대한 자세한 내용은 다음을 참조하세요 [알러트 할당 및 관리](/ko/alerts/alert-management.md).
       * **Tags**: 룰을 한눈에 이해하는 데 도움이 되는 사용자 지정 태그를 입력하세요(예, `HIPAA`.)
       * 다음의 **프레임워크 매핑** 섹션:
         1. 다음을 클릭합니다: **새로 추가** 보고서를 입력하려면.
         2. 다음 필드에 값을 입력합니다:
            * **보고서 키**: 보고서와 관련된 키를 입력하세요.
            * **보고서 값**: 해당 보고서의 값을 입력하세요.
   * 다음의 **단위 테스트** 탭에서 선택적으로 테스트를 추가합니다:
     1. 다음을 클릭합니다: **+ 새 단위 테스트 추가**.
        * 이 상관관계 룰에 대한 테스트용 보일러플레이트 코드가 채워집니다.
     2. 채워진 텍스트를 필요한 만큼 조정하고, 다음의 내용을 포함하여 테스트의 나머지 부분을 채우세요: `일치`.
     3. 코드 편집기 아래에서 클릭합니다 **테스트 실행** 테스트를 평가하려면\
        ![](/files/7590050a1fb7d9227a1572a9954b61773be1f7e7)
5. 오른쪽 상단에서 다음을 클릭합니다: **배포**.
   {% endtab %}
   {% endtabs %}

#### Console에서 시퀀스와 그룹 전환

다음을 사용하여 상관관계 룰을 시퀀스에서 그룹으로, 또는 그 반대로 전환할 수 있습니다: **룰을 그룹/시퀀스로 구성** 오른쪽 상단의 **YAML 편집기** 패널.

상관관계 룰이 이미 시퀀스이고 다음을 클릭하면 **룰을 그룹으로 구성**:

* 해당 `시퀀스` 키가 다음으로 변경됩니다 `그룹`.
* 해당 `전이` 섹션이 제거됩니다.
* A `MatchCriteria` 섹션이 추가됩니다.
  * 이전에 다음을 편집한 적이 있다면 `MatchCriteria` 섹션이 추가됩니다. 그렇지 않으면 기본 `MatchCriteria` 섹션이 제공됩니다.

상관관계 룰이 이미 그룹이고 다음을 클릭하면 **룰을 시퀀스로 구성**:

* 해당 `그룹` 키가 다음으로 변경됩니다 `시퀀스`.
* 해당 `MatchCriteria` 섹션이 제거됩니다.
* A `전이` 섹션이 추가됩니다.
  * 이전에 다음을 편집한 적이 있다면 `전이` 섹션이 추가됩니다. 그렇지 않으면 기본 `전이` 섹션이 제공됩니다.

### CLI 워크플로에서 YAML로 상관관계 룰 만들기

<details>

<summary>지침 펼치기</summary>

Panther Console 대신 로컬에서 Correlations 디택션을 작성하는 경우, 로컬 디택션 파일을 GitHub나 GitLab 같은 버전 관리 시스템에서 관리하는 것을 권장합니다.

**폴더 설정**

상관관계 룰을 폴더로 그룹화하는 경우, 각 폴더 이름에는 `룰` 업로드 중에 찾을 수 있도록( PAT 또는 콘솔의 대량 업로더를 사용하는 경우 모두 포함).

**파일 설정**

각 상관관계 룰은 다음으로 구성됩니다:

* YAML 명세 파일(다음이 포함된 파일 `.yml` 확장자)을 포함하며, 디택션 로직과 디택션의 메타데이터 속성을 담고 있습니다.

상관 디택션 YAML 구문에 대한 자세한 내용은 다음에서 찾을 수 있습니다 [Correlation 룰 참조](/ko/detections/correlation-rules/correlation-rule-reference.md), 필수 및 선택 필드의 전체 목록을 포함합니다.

* YAML 파일을 만드세요(예: `my_new_correlation_룰.yml`) 아래 템플릿을 사용하여(최상위 `디택션` key 포함):

  ```yaml
  AnalysisType: correlation_룰
  DisplayName: 형식 확인용 상관관계 룰 예시
  Enabled: true
  RuleID: Correlation.Type.Behavior.MoreContext
  Severity: High
  Reports:
    ReportName(CIS, MITRE ATT&CK 등):
      - 이 상관관계 룰과 관련된 특정 보고서 섹션
  Tags:
    - Tags
    - Go
    - Here
  Description: >
    이 상관관계 룰은 Panther CLI의 CLI 워크플로를 검증하기 위해 존재합니다
  Runbook: >
    먼저 이 명세 형식을 작성한 사람이 누구인지 알아낸 다음, 피드백과 함께 알려주세요.
  Reference: https://www.a-clickable-link-to-more-info.com
  디택션:
    - 시퀀스:
        - ID: 로그인 실패
          RuleID: Okta.Login.Fail
          MinMatchCount: 7
        - ID: 로그인 성공
          룰ID: Okta.Login.Success
          최소 매치 개수: 1
      LookbackWindowMinutes: 15
      스케줄:
        RateMinutes: 5
        타임아웃(분): 3
  Tests:
    - 이름: 일치 항목이 없으면 룰은 false를 반환해야 합니다
      ExpectedResult: false
      RuleOutputs:
        - ID: 로그인 실패
          Matches: {} # 빈 매핑은 일치 항목이 없음을 의미합니다
  ```

이 룰을 Panther에 업로드하면 Console에서 볼 수 있습니다.

</details>

## 상관관계 룰 전체 예시

### 유출된 GitHub 자격 증명 탐지

이 `Discovering.Exfiltrated.Credentials` 상관관계 룰은 10분마다 다음이 있었는지 확인합니다 [신호](/ko/detections/signals.md) 다음에 대해 `AWS.CloudTrail.IaaS` 룰(아래 두 번째 탭에 정의됨) *이 아니라* 그 뒤에 다음에 대한 신호가 오는 `GitHub.CICD` 룰(아래 세 번째 탭에 정의됨)이 지난 10분 내에.

<figure><img src="/files/693ee5a0f2868240418d7b5a5a4eba2eb88a7aa7" alt=""><figcaption></figcaption></figure>

{% tabs %}
{% tab title="유출된 자격 증명 탐지" %}

```yaml
AnalysisType: correlation_룰
RuleID: 'Discovering.Exfiltrated.Credentials'
DisplayName: 'Discovering.Exfiltrated.Credentials'
Enabled: true
Severity: High
Description: >
  뒤따르는 항목이 없는 IaaS 활동 일치가 최소 1건 있었습니다 
  10분 이내에 CI/CD 활동이 이어지지 않았습니다. 
디택션:
  - 시퀀스:
      - ID: IaaS 활동
        RuleID: AWS.CloudTrail.IaaS
      - ID: CICD 활동
        RuleID: Github.CICD
        부재: true
    전이: 
      - From: IaaS 활동
        - To: CICD 활동
        시간 범위(분): 10
    스케줄:
      RateMinutes: 10
      타임아웃(분): 3
Tests:
  - Name: IaaS 활동에 대한 CICD 활동 없음
    기대 결과: true
    RuleOutputs:
      - ID: IaaS 활동
        Matches:
          사용자 이름: 
            my_username: [1]
  - Name: IaaS 활동과 CICD 활동
    ExpectedResult: false
    RuleOutputs:
      - ID: IaaS 활동
        Matches:
          사용자 이름: 
            my_username: [1]
      - ID: CICD 활동
        Matches:
          사용자 이름: 
            my_username: [2]
```

{% endtab %}

{% tab title="AWS.CloudTrail.IaaS" %}

```yaml
AnalysisType: 룰
RuleID: 'AWS.CloudTrail.IaaS'
DisplayName: 'AWS CloudTrail IaaS'
Enabled: true
LogTypes:
  - AWS.CloudTrail
심각도: 정보
Create알러트: false
디택션:
  - KeyPath: userIdentity.arn
    조건: IsIn
    값:
      - DeploymentUpdateGitHubRole
  - KeyPath: eventName
    조건: IsIn
    값:
      - StartSession
      - ListResources
      - UpdateResource
      - DescribeResource
      - WriteLog
```

{% endtab %}

{% tab title="GitHub.CICD" %}

```yaml
AnalysisType: 룰
RuleID: 'GitHub.CICD'
DisplayName: 'GitHub CICD'
Enabled: true
LogTypes:
  - GitHub.Audit
심각도: 정보
Create알러트: false
디택션:
  - KeyPath: repository
    Condition: Equals
    Value: panther-labs/example-repo
  - KeyPath: action
    Condition: Equals
    Value: workflows.created_workflow_run
  - KeyPath: name
    Condition: Equals
    Value: CI
```

{% endtab %}
{% endtabs %}

### Okta 무차별 대입 로그인으로 AWS 루트 로그인

이 `Brute.Force.Login` 상관관계 룰은 30분마다 다음이 있었는지 확인합니다 [신호](/ko/detections/signals.md) 다음에 대해 [`Standard.BruteForceByIP`](https://github.com/panther-labs/panther-analysis/blob/main/rules/standard_rules/brute_force_by_ip.py) 룰 뒤에 다음에 대한 신호가 오는 `Okta.Login.Success` 룰 (아래의 두 번째 탭에 정의됨) 다음에 신호가 이어지는 [`AWS.Console.RootLogin`](https://github.com/panther-labs/panther-analysis/blob/main/rules/aws_cloudtrail_rules/aws_console_root_login.py) 룰, 추가적인 시간 범위 및 이벤트 IP 값 일치 요건과 함께.

<figure><img src="/files/9cbcfa3bfbda06e05498f6d11df317f5d21a6718" alt=""><figcaption></figcaption></figure>

{% tabs %}
{% tab title="무차별 대입 로그인" %}

```yaml
AnalysisType: correlation_룰
룰ID: 'Brute.Force.Login'
표시 이름: 'Brute.Force.Login'
Enabled: true
Severity: High
Description: >
  적어도 100회의 실패한 로그인 뒤에 성공한 로그인이 이어지는
  그 마지막 실패한 로그인 후 10분 이내에 발생한
  그리고 이어서 AWS 콘솔에서의 루트 로그인. 
디택션:
  - 시퀀스:
      - ID: 로그인 실패
        룰ID: Standard.BruteForceByIP
        최소 일치 수: 100
      - ID: 로그인 성공
        룰ID: Okta.Login.Success
        최소 매치 개수: 1
      - ID: 루트 로그인
        룰ID: AWS.Console.RootLogin
        최소 매치 개수: 1
    전이:
      - ID: 무차별 대입 로그인 성공
        시작: 로그인 실패
        종료: 로그인 성공
        시간 범위(분): 10
        매치:
          - 출처: p_알러트_context.ip
            - 대상: client.ipAddress
      - ID: 루트 권한 획득
        시작: 로그인 성공
        종료: 루트 로그인
        매치:
          - 시작: client.ipAddress
            종료: p_알러트_context.sourceIPAddress
    조회 기간(분): 60
    이벤트 평가 순서: 시간순
    스케줄:
      빈도(분): 30
      타임아웃(분): 3
Tests:
# 위의 "단위 테스트 예시"에서 이 상관관계 룰에 대한 추가 테스트를 참조하세요
  - 이름: 상대 분 단위 성공한 로그인
    기대 결과: true
    RuleOutputs:
      - ID: 로그인 실패
        Matches:
          client.ipAddress:
          # 원래 룰의 MinMatchCount가 10이므로, 최소 10개의 타임스탬프가 필요합니다
            123.123.123.123: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
      - ID: 로그인 성공
        Matches:
          client.ipAddress:
            123.123.123.123: [11]
      - ID: 루트 로그인
        Matches:
          srcIpAddress7:
            123.123.123.123: [12]
```

{% endtab %}

{% tab title="Okta.Login.Success" %}

```yaml
AnalysisType: 룰
룰ID: 'Okta.Login.Success'
표시 이름: 'Okta 로그인 성공'
Enabled: true
LogTypes:
  - Okta.SystemLog
심각도: 정보
Create알러트: false
디택션:
  - DeepKey:
      - 결과
      - 결과
    Condition: Equals
    값: SUCCESS
  - 키: eventType
    Condition: Equals
    값: user.session.start
```

{% endtab %}
{% endtabs %}

### 후속 보관 없이 GitHub 저장소 보안 정책 비활성화

이 `Github.Repo.Security.Policy.Disabled.Without.Archival` 상관관계 룰은 10분마다 다음이 있었는지 확인합니다 [신호](/ko/detections/signals.md) 다음에 대해 [`GitHub.Advanced.Security.Change` ](https://github.com/panther-labs/panther-analysis/blob/main/rules/github_rules/github_advanced_security_change.py)룰 *이 아니라* 그 뒤에 다음에 대한 신호가 오는 `GitHub.Repo.Archived` 룰 (아래의 두 번째 탭에 정의됨)이며, 또한 다음에 대한 일치하는 값이 있는 `p_알러트_context.repo` 이벤트 필드가 지난 10분 이내에 있는.

<figure><img src="/files/94cc0f5c9edc2d162bf53dd8ce802615a29994b8" alt=""><figcaption></figcaption></figure>

{% tabs %}
{% tab title="Github.Repo.Security.Policy.Disabled.Without.Archival" %}

```yaml
AnalysisType: correlation_룰
룰ID: 'Github.Repo.Security.Policy.Disabled.Without.Archival'
표시 이름: 'Github Repo Security Policy Disabled Without Archival'
Enabled: true
Tags:
  - Github
  - 저장소 보관됨
Severity: High
디택션:
  - 시퀀스:
      - ID: GitHub Advanced Security Change
        룰ID: GitHub.Advanced.Security.Change
      - ID: Github Repo Archived
        룰ID: Github.Repo.Archived
        부재: true
    전이:
      - ID: TR1
        출처: GitHub Advanced Security Change
        대상: Github Repo Archived
        시간 범위(분): 10
        매치:
          - 기준: p_알러트_context.repo
    스케줄:
      RateMinutes: 10
      타임아웃(분): 3
Tests:
  - 이름: Github Repo Security Policy Disabled Without Archival
    기대 결과: true
    RuleOutputs:
      - ID: GitHub Advanced Security Change
        Matches:
          p_알러트_context.repo:
            my_production_repo: [1]
  - 이름: Github Repo Security Policy Disabled With Archival
    ExpectedResult: false
    RuleOutputs:
      - ID: GitHub Advanced Security Change
        Matches:
          p_알러트_context.repo:
            my_production_repo: [1]
      - ID: Github Repo Archived
        Matches:
          p_알러트_context.repo:
            my_production_repo: [2]
```

{% endtab %}

{% tab title="GitHub.Repo.Archived" %}

```yaml
AnalysisType: 룰
룰ID: 'GitHub.Repo.Archived'
표시 이름: 'GitHub Repo Archived'
Enabled: true
LogTypes:
  - GitHub.Audit
심각도: 정보
Create알러트: false
알러트컨텍스트:
  - KeyName: repo
    KeyValue:
      KeyPath: repo
디택션:
  - KeyPath: action
    Condition: Equals
    Value: repo.archived
```

{% endtab %}
{% endtabs %}

## correlation 룰을 더 효율적으로 만들기

상관관계 룰은 복잡한 패턴 인식을 사용하므로, 계산 비용이 많이 들 수 있습니다. 상관관계 룰과 관련된 Snowflake 비용을 줄이려면 다음 지침을 염두에 두세요.

### **상관관계 룰을 가능한 한 드물게 실행하세요**

상관관계 룰이 실행되는 빈도는 해당 `일정` 값에 따라 비용에 큰 영향을 줄 수 있습니다. 따라서 디택션 요구 사항을 충족하면서도 상관관계 룰이 필요 이상으로 자주 실행되지 않도록 하는 것이 좋습니다. see [설정 `일정`위](#setting-schedule)에서 이 필드를 구성할 때의 고려 사항).

상관관계 룰의 실행 빈도와 비용 간의 관계를 생각할 때의 일반적인 지침은 다음과 같습니다. 상관관계 룰이 실행되는 간격을 두 배로 늘릴 때마다(예: 다음을 두 배로 늘려 `RateMinutes`), 생성되는 비용은 절반이 됩니다.

### **설정합니다 `LookbackWindowMinutes` 가능한 한 낮게**

상관관계 룰이 실행되는 데이터 양은 주로 해당 `LookbackWindowMinutes` 값에 의해 정의되며, 이 데이터 양은 상관관계 룰의 처리 시간과 결과 비용에 큰 영향을 미치는 주요 요인입니다. 상관관계 룰이 처리하는 데이터 양을 줄이려면 해당 `LookbackWindowMinutes` 값을 가능한 한 낮게 설정하는 것이 좋습니다(디택션 요구 사항을 충족하면서도—see [설정 `LookbackWindowMinutes`위](#setting-lookbackwindowminutes)에서 이 필드를 구성할 때의 고려 사항).

예를 들어, 두 룰이 서로 10분 이내에 각각 하나의 신호를 생성하는 시점을 식별하고 싶다고 가정해 보겠습니다( `WithinTimeFrameMinutes`). While setting `LookbackWindowMinutes` 정확히 `10` 는 권장되지 않지만, 안전하게 사용할 수 있는 값은 낮게는 `15`.

### **가능한 가장 낮은 카디널리티의 매치 필드를 선택하세요**

매치 필드의 카디널리티는 상관관계 룰 비용과 양의 상관관계가 있습니다. 상관관계 룰이 이벤트 값 일치를 사용하는 경우, 어떤 필드를 일치시킬지 선택할 때는 카디널리티가 더 낮은 필드를 사용하는 것이 좋습니다.

매치 필드의 카디널리티는 몇 가지 요인의 영향을 받을 수 있으며, 그중에는 다음이 포함됩니다:

* 필드가 가질 수 있는 가능한 값의 수—가능한 값이 많을수록 카디널리티가 높아집니다.
  * 예를 들어, `field_a` 가 세 가지 가능한 값 중 하나를 가질 수 있지만(예: `"yellow"`, `"red"`, 또는 `"blue"`), 하지만 `field_b` 는 두 값 중 하나만 가질 수 있다면(예: `"purple"` 또는 `"green"`), `field_b` 는 다음보다 카디널리티가 더 낮습니다. `field_a`.
* 필드의 데이터 유형—일반적으로 비스칼라 데이터 유형(즉, 배열인 `배열` 또는 `객체`)은 스칼라 데이터 유형(즉, `string`, `불리언`, 또는 `number`).
  * 예를 들어, 로그 스키마가 둘 다 `email` 그리고 `username` 필드를 `username` [indicator](/ko/search/panther-fields.md#indicator-fields)로 지정한다는 뜻이라면, 즉 당신의 `p_any_usernames` 필드가 둘 다 다음 항목을 배열에 포함하게 된다면 `배열` (예: `p_any_usernames: ["Bob Smith", "bob.smith@example.com"]`), 그러면 그 `p_any_usernames` 필드는 다음 `email` 필드보다 더 높은 카디널리티를 갖게 되며, 그 `string` 필드는 단일 값 유형을 갖습니다.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## 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, and the optional `goal` query parameter:

```
GET https://docs.panther.com/ko/detections/correlation-rules.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
