> 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).

# 상관관계 룰(베타)

## **개요**

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

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

Panther에서 상관 룰을 사용하면 로그 유형 전반에 걸친 여러 동작을 추적할 수 있습니다. 상관 룰에서는 다음을 지정합니다 [그룹](#group-correlation-rules) 또는 특정 [시퀀스](#sequence-correlation-rules) 의 [시그널](/ko/detections/signals.md) 가 일치로 간주되려면 특정 시간 창 내에 발생해야 합니다. 그런 다음 시그널을 생성하고, 선택적으로 다음을 생성합니다 [알러트](/ko/alerts.md).

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

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

* 어떤 Okta 사용자가 최소 100번의 로그인 실패 후 성공적으로 로그인한 다음, 루트 사용자로 AWS에 로그인함 ([아래 전체 예시 참조](#brute-force-okta-login-to-aws-root-login))
* GitHub 저장소에서 고급 보안 설정이 비활성화되었고, 그 결과 보관되지 않음 ([아래 전체 예시 참조](#github-repository-security-policy-disabled-without-subsequent-archival))

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

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

## 상관 룰이 작동하는 방식

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

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

* 어떤 룰에 대해 발견되어야 하는 시그널의 최소 개수, 또는 최대
* 한 룰에서 다른 룰로 특정 이벤트 값이 일치하도록 요구하는 것(예: 모든 개별 룰의 시그널에 동일한 IP 주소가 포함되도록 요구)
* 다음 단계가 포함된 [시퀀스](#sequence-correlation-rules) 가 일정 시간 내에 발생하도록 요구하는 것

### 상관 룰에서 일치가 발생하면 어떻게 되나요

상관 룰에서의 일치는 [시그널](/ko/detections/signals.md). 상관 룰에 알러트 생성이 활성화되어 있으면 룰 일치가 생성되며, 이는 상관 룰의 [중복 제거 구성](#deduplication-of-events). [시그널, 룰 일치, 알러트의 차이에 대해 자세히 알아보세요](https://docs.panther.com/ko/detections/pages/28a2f0a91092222209c65334fa10beb60037d689#signals-vs.-rule-matches-vs.-alerts).

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

* 각 개별 룰, 예약 룰, 상관 룰에 알러트 생성이 활성화되어 있는지 여부
* 다음 `Threshold` 개별 룰 또는 예약 룰의 `MinMatchCount` 값과 상관 룰의 값. 상관 룰은 알러트를 생성하지만 구성하는 룰들은 생성하지 않는 예외 상황은 개별 룰의 이벤트 임계값(다음으로 설정한)이 `Threshold` Threshold `MinMatchCount` 보다 높고, 실제 룰 일치 수가 그 중간쯤인 경우입니다.

### 그룹 vs. 시퀀스

상관 룰에는 두 가지 유형이 있습니다 [그룹](#group-correlation-rules) 및 [시퀀스](#sequence-correlation-rules). 그룹 및 시퀀스 상관 룰은 시그널이 발견되어야 하는 룰들의 집합을 정의합니다(또는 *아닌* 발견되거나(다음을 설정하여 `부재: true`).

그룹 상관 룰은 모든 룰이 시그널(또는 부재)을 생성했다면, 시그널이 발견된 순서와 상관없이 알러트를 생성합니다. 반면 시퀀스 룰은 알러트를 생성하려면 시그널(또는 부재)이 발견되어야 하는 특정 순서를 정의합니다.

### 일정과 룩백 창 설정

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

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

다음 값들을 설정할 때 `Schedule` 및 `LookbackWindowMinutes`, 다음 몇 가지 요소를 고려하는 것이 좋습니다:

* 이 상관 룰의 일치에 대해 적시에 알러트를 받는 것이 얼마나 중요한지
  * 예를 들어 우선순위가 낮은 상관 룰은 24시간마다 실행해도 충분할 수 있으며, 반대로 우선순위가 높은 상관 룰은 15분마다 실행하고 싶을 수 있습니다.
* 상관 룰이 찾는 첫 번째 시그널과 마지막 시그널 사이의 시간 간격이 어느 정도여야 일치를 생성해야 하는 동일한 발생으로 간주될 수 있는지
  * 참고 [시그널이 룩백 창 사이에서 분리되지 않도록 보장하기](#ensuring-signals-arent-split-between-lookback-windows)
* 상관 룰과 연결된 룰이 평가하는 데이터 소스에서 예상되는 최대 지연 시간
  * 참고 [로그 소스 지연 시간을 다음에 반영하기 `LookbackWindowMinutes`](#accounting-for-log-source-latency-in-lookbackwindowminutes)

`Schedule` 및 `LookbackWindowMinutes` 값은 Snowflake 컴퓨팅 비용에 영향을 줄 수 있습니다. 다음을 참조하세요 [상관 룰을 더 효율적으로 만드는 방법](#making-correlation-rules-more-efficient) 자세한 정보를 보려면.

#### 시그널이 룩백 창 사이에서 분리되지 않도록 보장하기

필요한 시그널이 여러 상관 룰 실행의 룩백 창에 걸쳐 분산되어 검색 중인 대상의 발생을 놓치지 않도록 룩백 창을 설정하는 것이 좋습니다.

<details>

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

피하려는 이 상황을 설명하기 위해 다음의 단순화된 상관 룰 구성을 살펴보세요

```yaml
 # 나쁜 예시; 복제하지 마세요
 - 그룹:
    - 룰ID: First.룰
    - 룰ID: Second.룰
    - 룰ID: Third.룰
   Schedule:
     RateMinutes: 60
   LookbackWindowMinutes: 90
```

이 시나리오에서, 매시간 상관 룰은 이전 90분을 되돌아보며 다음에 포함된 세 룰의 시그널을 찾습니다 `그룹`. 각 룰이 아래 시간에 일치/생성된 시그널을 만들었다고 가정해 봅시다:

* 다음의 시그널 `First.룰` 오후 12:58에 생성됨
* 다음의 시그널 `Second.룰` 오후 1:05에 생성됨
* 다음의 시그널 `Third.룰` 오후 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), 이는 통과하기 위해 시퀀스의 두 단계가 발생해야 하는 시간 범위입니다. "최대 시그널 시간 범위 분"과 `WithinTimeFrameMinutes` 은 상관 룰이 시퀀스이고 두 단계만 지정하는 경우 같을 수 있습니다.)

룩백 창 `LookbackWindowMinutes` 값을 "최대 시그널 시간 범위 분" 길이의 모든 가능한 창이 상관 룰의 최소 한 번 실행에 포함되도록 설정하는 것입니다. 일반적으로 다음 공식으로 이를 수행할 수 있습니다:

* If `RateMinutes` <= "최대 시그널 시간 범위 분":
  * `LookbackWindowMinutes` = 2 x "최대 시그널 시간 범위 분" + 로그 수집 지연 시간
* If `RateMinutes` > "최대 시그널 시간 범위 분":
  * `LookbackWindowMinutes` = "최대 시그널 시간 범위 분" + `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`. `오전 9:01` 는 지연 시간을 `p_event_time` 다음만큼 이른 `오전 6:01`. `오전 10:00`, 최소한 다음 시각까지 되돌아봐야 합니다 `오전 6:01`.

### 이벤트 중복 제거

상관 룰의 중복 제거 기간은 [`LookbackWindowMinutes`](/ko/detections/correlation-rules/correlation-rule-reference.md#detection-fields) 해당 필드의 값입니다 `LookbackWindowMinutes` 시간 범위 내에서 겹치는 상관 룰이 해당 상관 룰을 일치시키는 데 사용된 고유한 이벤트만 포함한다는 뜻입니다.

상관 룰에서 참조하는 개별 룰과 예약 룰에 대해 설정된 중복 제거(다음을 사용해 `dedup()`, `DedupPeriodMinutes`, `Threshold`, 또는 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` 에서 [상관 룰 참조](/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
    일치 기준:
      ip:
        - 그룹ID: *failed_login
          매치: p_알러트_context.ip
        - 그룹ID: *successful_login
          매치: p_알러트_context.ip
        - 그룹ID: *root_access
          매치: p_알러트_context.sourceIPAddress
        - 그룹ID: *missing_crowdstrike
          매치: p_any_ip_addresses
    이벤트 평가 순서: 시간 순
    조회 기간(분): 60
    Schedule:
      간격(분): 30
      타임아웃(분): 7
```

{% endtab %}

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

```yaml
디택션:
  - 그룹:
      - 룰ID: Standard.BruteForceByIP
        MinMatchCount: 7
      - 룰ID: Okta.Login.Success
      - 룰ID: AWS.Console.RootLogin
      - 룰ID: Crowdstrike.디택션.passthrough
        부재: true
    조회 기간(분): 60
    Schedule:
      간격(분): 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
    Schedule:
      간격(분): 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` 및/또는 `매치` 상관 룰의 구체성이 높아집니다.

전이가 정의된 경우, 다음에 포함된 룰 수보다 전이 수가 1개 적어야 합니다: `시퀀스`. 또한 다음 안의 항목들은 `전이` 다음과 같은 순서여야 합니다: `시퀀스` 목록.

현재 각 상관 룰에서는 일치하는 필드 유형을 하나만 사용할 수 있습니다(예: *모든* IP 주소 필드 또는 *모든* 이메일 주소 필드). 여러 로그 유형, 예약 룰 또는 상관 룰과 연결된 룰의 경우, 오직 [`p_` 필드](/ko/search/panther-fields.md) 에서 일치시킬 수 있습니다. (하나의 로그 유형에만 연결된 룰의 경우 어떤 필드든 일치시킬 수 있습니다.)

다음에서 전이에 대해 자세히 알아보세요: [상관 룰 참조](/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
    이벤트 평가 순서: 시간 순
    Schedule:
      간격(분): 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
    Schedule:
      간격(분): 30
      타임아웃(분): 3
```

{% endtab %}

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

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

{% endtab %}
{% endtabs %}

## 상관 룰 테스트

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

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

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

상관 룰의 각 단위 테스트에는 다음이 포함되어야 합니다 `이름`, `ExpectedResult`, 및 `RuleOutputs` 필드입니다. 단위 테스트의 YAML 구조와, 다음을 구성하는 방법을 포함하여 자세히 알아보세요 `RuleOutputs` 값 [여기, 상관 룰 참조에서](/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
  
  Schedule:
    RateMinutes: 15
    TimeoutMinutes: 2
  
  조회 기간(분): 60
```

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

{% hint style="info" %}
아래 테스트가 룰의 YAML 파일에 포함되어 있다면(CLI 워크플로에서 디택션을 관리할 때 필요함), 해당 테스트는 다음 아래에 배치됩니다 `Tests` 키.
{% endhint %}

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

{% code overflow="wrap" %}

```yaml
이름: 타임스탬프가 있는 성공적인 로그인
ExpectedResult: 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
이름: 상대 분 단위의 성공적인 로그인
ExpectedResult: 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` 왜냐하면 단지 *아홉* 개의 로그인 시도 뒤에 성공적인 로그인이 있기 때문이며, 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 키에 대한 설명은 다음을 참조하세요 [상관 룰 참조](/ko/detections/correlation-rules/correlation-rule-reference.md).

사용자 지정 상관 룰을 만드는 것 외에도 다음을 활용할 수 있습니다 [Panther에서 관리하는 상관 룰](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 Console의 왼쪽 탐색 모음에서 **탐지**.
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).
       * Sets [`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).
       * Sets [`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`.
       * Sets [`LookbackWindowMinutes`](/ko/detections/correlation-rules/correlation-rule-reference.md#detection-fields) 에서 `60`.
     * 상관 디택션 YAML 구문에 대한 자세한 정보는 다음에서 찾을 수 있습니다 [상관 룰 참조](/ko/detections/correlation-rules/correlation-rule-reference.md), 필수 및 선택 필드의 전체 목록을 포함하여.
   * 다음의 **알러트 설정** 탭:
     * 다음의 **기본** 탭에서 다음 필드를 구성합니다:

       * **알러트 생성**: 이 `ON/OFF` 토글은 다음이 [알러트](/ko/alerts.md) 일치가 있을 때 생성되어야 하는지, 아니면 only a [신호](/ko/detections/signals.md).
       * (다음의 경우에만 적용됨 **알러트 생성** 가 다음으로 설정된 경우 `켜기`) **심각도:** 다음을 선택하세요 [심각도 수준](#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).
       * **태그**: 룰을 한눈에 이해하는 데 도움이 되는 사용자 지정 태그를 입력합니다(예: `HIPAA`.)
       * 다음 **프레임워크 매핑** 섹션:
         1. 클릭합니다 **새로 추가** 보고서를 입력합니다.
         2. 다음 필드의 값을 입력합니다:
            * **보고서 키**: 보고서와 관련된 키를 입력합니다.
            * **보고서 값**: 해당 보고서의 값을 입력합니다.
   * 다음의 **Unit Tests** 탭에서 필요에 따라 테스트를 추가합니다:
     1. 클릭합니다 **+ 새 단위 테스트 추가**.
        * 이 상관 룰에 대한 테스트의 기본 코드가 채워집니다.
     2. 채워진 텍스트를 필요한 대로 조정하고, 다음의 내용을 포함하여 테스트의 나머지 부분을 채웁니다 `일치함`.
     3. 코드 편집기 아래에서 다음을 클릭합니다 **테스트 실행** 테스트를 평가합니다.\
        ![](/files/7590050a1fb7d9227a1572a9954b61773be1f7e7)
5. 오른쪽 상단에서 다음을 클릭하세요: **배포**.
   {% endtab %}

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

1. Panther Console의 왼쪽 탐색 모음에서 **탐지**.
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 구문에 대한 자세한 정보는 다음에서 찾을 수 있습니다 [상관 룰 참조](/ko/detections/correlation-rules/correlation-rule-reference.md), 필수 및 선택 필드의 전체 목록을 포함하여.
   * 다음의 **알러트 설정** 탭:
     * 다음의 **기본** 탭에서 다음 필드를 구성합니다:

       * **알러트 생성**: 이 `ON/OFF` 토글은 다음이 [알러트](/ko/alerts.md) 일치가 있을 때 생성되어야 하는지, 아니면 only a [신호](/ko/detections/signals.md).
       * (다음의 경우에만 적용됨 **알러트 생성** 가 다음으로 설정된 경우 `켜기`) **심각도:** 다음을 선택하세요 [심각도 수준](#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).
       * **태그**: 룰을 한눈에 이해하는 데 도움이 되는 사용자 지정 태그를 입력합니다(예: `HIPAA`.)
       * 다음 **프레임워크 매핑** 섹션:
         1. 클릭합니다 **새로 추가** 보고서를 입력합니다.
         2. 다음 필드의 값을 입력합니다:
            * **보고서 키**: 보고서와 관련된 키를 입력합니다.
            * **보고서 값**: 해당 보고서의 값을 입력합니다.
   * 다음의 **Unit Tests** 탭에서 필요에 따라 테스트를 추가합니다:
     1. 클릭합니다 **+ 새 단위 테스트 추가**.
        * 이 상관 룰에 대한 테스트의 기본 코드가 채워집니다.
     2. 채워진 텍스트를 필요한 대로 조정하고, 다음의 내용을 포함하여 테스트의 나머지 부분을 채웁니다 `일치함`.
     3. 코드 편집기 아래에서 다음을 클릭합니다 **테스트 실행** 테스트를 평가합니다.\
        ![](/files/7590050a1fb7d9227a1572a9954b61773be1f7e7)
5. 오른쪽 상단에서 다음을 클릭하세요: **배포**.
   {% endtab %}
   {% endtabs %}

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

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

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

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

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

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

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

<details>

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

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

**폴더 설정**

상관 룰을 폴더로 그룹화하는 경우, 각 폴더 이름에는 다음이 포함되어야 합니다 `룰` 업로드 중에 찾을 수 있도록 하기 위해서입니다(PAT 또는 Console의 대량 업로더를 사용하여).

**파일 설정**

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

* YAML 사양 파일(다음과 같은 `.yml` 확장자를 가진 파일)로, 디택션 로직과 디택션의 메타데이터 속성을 포함합니다.

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

* YAML 파일을 생성합니다(예: `my_new_correlation_룰.yml`) 아래 템플릿을 사용합니다(최상위 `디택션` 키를 포함):

  ```yaml
  AnalysisType: correlation_룰
  DisplayName: 사양 형식을 확인하기 위한 예시 상관관계 룰
  활성화됨: true
  RuleID: Correlation.Type.Behavior.MoreContext
  Severity: 높음
  보고서:
    보고서 이름(예: CIS, MITRE ATT&CK):
      - 이 상관관계 룰과 관련된 특정 보고서 섹션
  태그:
    - 태그
    - Go
    - Here
  Description: >
    이 상관관계 룰은 Panther CLI의 CLI 워크플로를 검증하기 위해 존재합니다
  런북: >
    먼저 이 사양 형식을 누가 작성했는지 알아낸 다음, 피드백과 함께 그들에게 알립니다.
  참조: https://www.a-clickable-link-to-more-info.com
  디택션:
    - 시퀀스:
        - ID: 로그인 실패
          RuleID: Okta.Login.Fail
          MinMatchCount: 7
        - ID: 로그인 성공
          룰ID: Okta.Login.Success
          최소 일치 수: 1
      LookbackWindowMinutes: 15
      Schedule:
        RateMinutes: 5
        타임아웃(분): 3
  테스트:
    - 이름: 일치 항목이 없으면 룰은 false를 반환해야 합니다
      ExpectedResult: false
      RuleOutputs:
        - ID: 로그인 실패
          Matches: {} # 빈 매핑은 일치 항목이 없음을 의미
  ```

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

</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'
활성화됨: true
Severity: 높음
Description: >
  IaaS 활동 일치 항목이 최소 하나 있었고 그 뒤에 
  10분 이내에 CI/CD 활동이 이어지지 않았습니다. 
디택션:
  - 시퀀스:
      - ID: IaaS 활동
        RuleID: AWS.CloudTrail.IaaS
      - ID: CI/CD 활동
        RuleID: Github.CICD
        부재: true
    전이: 
      - From: IaaS 활동
        - To: CI/CD 활동
        시간 범위(분): 10
    Schedule:
      RateMinutes: 10
      타임아웃(분): 3
테스트:
  - Name: CI/CD 활동이 없는 IaaS 활동
    ExpectedResult: true
    RuleOutputs:
      - ID: IaaS 활동
        Matches:
          username: 
            my_username: [1]
  - Name: CI/CD 활동이 있는 IaaS 활동
    ExpectedResult: false
    RuleOutputs:
      - ID: IaaS 활동
        Matches:
          username: 
            my_username: [1]
      - ID: CI/CD 활동
        Matches:
          username: 
            my_username: [2]
```

{% endtab %}

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

```yaml
분석 유형: 룰
RuleID: 'AWS.CloudTrail.IaaS'
DisplayName: 'AWS CloudTrail IaaS'
활성화됨: true
LogTypes:
  - AWS.CloudTrail
Severity: 정보
알러트 생성: false
디택션:
  - KeyPath: userIdentity.arn
    Condition: IsIn
    값:
      - DeploymentUpdateGitHubRole
  - KeyPath: eventName
    Condition: IsIn
    값:
      - StartSession
      - ListResources
      - UpdateResource
      - DescribeResource
      - WriteLog
```

{% endtab %}

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

```yaml
분석 유형: 룰
RuleID: 'GitHub.CICD'
DisplayName: 'GitHub CICD'
활성화됨: true
LogTypes:
  - GitHub.Audit
Severity: 정보
알러트 생성: false
디택션:
  - KeyPath: repository
    조건: 같음
    Value: panther-labs/example-repo
  - KeyPath: action
    조건: 같음
    Value: workflows.created_workflow_run
  - KeyPath: name
    조건: 같음
    Value: CI
```

{% endtab %}
{% endtabs %}

### AWS 루트 로그인으로 이어지는 Okta 무차별 대입 로그인

이 `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_룰
RuleID: 'Brute.Force.Login'
DisplayName: 'Brute.Force.Login'
활성화됨: true
Severity: 높음
Description: >
  실패한 로그인 100회 이상 뒤에 성공한 로그인
  마지막 실패한 로그인 후 10분 이내에 발생한
  그 후 AWS 콘솔에서 루트 로그인이 이어졌습니다. 
디택션:
  - 시퀀스:
      - ID: 로그인 실패
        룰ID: Standard.BruteForceByIP
        MinMatchCount: 100
      - ID: 로그인 성공
        룰ID: Okta.Login.Success
        최소 일치 수: 1
      - ID: 루트 로그인
        룰ID: AWS.Console.RootLogin
        최소 일치 수: 1
    전이:
      - ID: 무차별 대입 로그인 성공
        출발: 로그인 실패
        도착: 로그인 성공
        시간 범위(분): 10
        매치:
          - From: p_알러트_context.ip
            - To: client.ipAddress
      - ID: 루트 접근 획득
        출발: 로그인 성공
        도착: 루트 로그인
        매치:
          - 출발: client.ipAddress
            도착: p_알러트_context.sourceIPAddress
    조회 기간(분): 60
    이벤트 평가 순서: 시간 순
    Schedule:
      간격(분): 30
      타임아웃(분): 3
테스트:
# 위의 이 상관관계 룰에 대한 추가 테스트는 "단위 테스트 예시"를 참조하세요
  - Name: 상대 분 단위 성공 로그인
    ExpectedResult: 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
분석 유형: 룰
룰ID: 'Okta.Login.Success'
표시 이름: 'Okta 로그인 성공'
활성화됨: true
LogTypes:
  - Okta.SystemLog
Severity: 정보
알러트 생성: false
디택션:
  - DeepKey:
      - 결과
      - 결과값
    조건: 같음
    값: SUCCESS
  - 키: eventType
    조건: 같음
    값: 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 저장소 보안 정책이 보관 없이 비활성화됨'
활성화됨: true
태그:
  - Github
  - 보관됨
Severity: 높음
디택션:
  - 시퀀스:
      - 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
    Schedule:
      RateMinutes: 10
      타임아웃(분): 3
테스트:
  - 이름: Github Repo Security Policy Disabled Without Archival
    ExpectedResult: 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
분석 유형: 룰
룰 ID: 'GitHub.Repo.Archived'
표시 이름: 'GitHub Repo Archived'
활성화됨: true
LogTypes:
  - GitHub.Audit
Severity: 정보
알러트 생성: false
알러트 컨텍스트:
  - 키 이름: repo
    키 값:
      KeyPath: repo
디택션:
  - KeyPath: action
    조건: 같음
    값: repo.archived
```

{% endtab %}
{% endtabs %}

## 상관 룰을 더 효율적으로 만드는 방법

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

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

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

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

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

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

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

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

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

일치 필드의 카디널리티는 다음과 같은 몇 가지 요인의 영향을 받을 수 있습니다:

* 필드가 가질 수 있는 가능한 값의 수—가능한 값이 많을수록 카디널리티가 높아집니다.
  * 예를 들어, `field_a` 는 세 가지 가능한 값 중 하나를 가질 수 있습니다(예: `"yellow"`, `"red"`, 또는 `"blue"`), 하지만 `field_b` 는 오직 두 값 중 하나만 가질 수 있습니다(예: `"purple"` 또는 `"green"`), `field_b` 보다 카디널리티가 더 낮습니다 `field_a`.
* 필드의 데이터 유형—일반적으로 비스칼라 데이터 유형(즉, 다음과 같은)인 필드는 `배열` 또는 `객체`)는 스칼라 데이터 유형(즉, `문자열`, `불리언`, 또는 `숫자`).
  * 예를 들어, 로그 스키마가 하나의 `이메일` 및 `사용자 이름` 필드를 `사용자 이름` [지표](/ko/search/panther-fields.md#indicator-fields), 즉, 귀하의 `p_any_usernames` 필드는 둘 다 하나의 `배열` (예: `p_any_usernames: ["Bob Smith", "bob.smith@example.com"]`이면, 그 `p_any_usernames` 필드는 다음 필드보다 더 높은 카디널리티를 갖게 됩니다 `이메일` 필드로, 이는 `문자열` 단일 값을 가진 유형입니다.


---

# 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.
