# Panther Analysis Tool 명령

## 개요

Panther Analysis Tool(PAT)을 사용하여 Panther 디택션 콘텐츠를 관리할 수 있습니다. PAT를 사용하면 [업로드](#upload-uploading-packages-to-panther-directly), [테스트](#test-running-tests-with-pat), 그리고 [삭제](#delete-deleting-rules-policies-or-saved-queries-with-pat) 자산 등을 수행할 수 있습니다.

PAT 명령 각각은 특정 [옵션을](#pat-command-options-sub-commands)허용합니다. 예를 들어, [--filter](#filtering-pat-commands) 를 여러 명령과 함께 사용하여 작업 범위를 좁힐 수 있습니다.

## PAT 명령

다음 코드 블록에서 사용 가능한 PAT 명령의 전체 목록을 확인하세요. 그 아래에서 여러 명령에 대한 추가 정보를 찾을 수 있습니다.

PAT 명령은 다음을 사용하여 실행할 수 있습니다 `panther_analysis_tool` 또는 `pat`. [이 별칭에 대해 자세히 알아보려면 여기를 참조하세요](/ko/panther/detections-repo/pat/install-configure-and-authenticate-with-pat.md#pat-cli-aliases).

각 PAT 명령을 실행하는 데 필요한 Panther 권한을 이해하려면 다음을 참조하세요 [명령별로 필요한 권한](#permissions-required-per-command).

```
$ pat --help
                                                                                                                                       
사용법: pat [OPTIONS] COMMAND [ARGS]...                                                                                                
                                                                                                                                       
Panther Analysis Tool: Panther 정책 및 룰을 관리하기 위한 명령줄 도구입니다.                                                   
                                                                                                                                       
                                                                                                                                       
╭─ 옵션 ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --version                     버전을 표시하고 종료                                                                             │
│ --debug                       디버그 모드 활성화                                                                                     │
│ --skip-version-check          Panther 버전 확인 건너뛰기                                                                            │
│ --install-completion          현재 셸에 completion을 설치합니다.                                                             │
│ --show-completion             현재 셸의 completion을 표시하여 복사하거나 설치를 사용자 지정할 수 있습니다.                      │
│ --help                        이 메시지를 표시하고 종료합니다.                                                                           │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ 명령 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ release                 panther 디택션이 포함된 저장소용 릴리스 자산을 생성합니다. 다음 이름의 파일을 생성합니다                 │
│                         panther-analysis-all.zip 및 선택적으로 panther-analysis-all.sig를 생성합니다                                  │
│ test                    분석 사양을 검증하고 정책 및 룰 테스트를 실행합니다.                                             │
│ debug                   디버그 환경에서 단일 룰 테스트를 실행합니다. 이를 통해 print 문을 확인하고             │
│                         중단점을 사용할 수 있습니다.                                                                                                │
│ publish                 새 릴리스를 게시하고, 릴리스 자산을 생성한 뒤 업로드합니다. 다음 이름의 파일을 생성합니다            │
│                         panther-analysis-all.zip 및 선택적으로 panther-analysis-all.sig를 생성합니다                                  │
│ upload                  지정된 정책과 룰을 Panther 배포에 업로드합니다.                                                │
│ delete                  Panther 배포에서 정책, 룰 또는 저장된 쿼리를 삭제합니다.                                         │
│ update-custom-schemas   Panther 배포에서 사용자 지정 스키마를 업데이트하거나 생성합니다.                                                    │
│ test-lookup-table       Lookup Table 사양 파일을 검증합니다.                                                                          │
│ validate                Panther 인스턴스에 대한 대량 업로드를 검증합니다.                                                   │
│ zip                     Panther에 업로드하기 위해 로컬 정책과 룰의 아카이브를 생성합니다.                                     │
│ check-connection        Panther API 연결을 확인합니다                                                                           │
│ benchmark               하나의 룰을 해당 로그 유형 중 하나와 비교하여 성능 테스트합니다. 룰은 작업       │
│                         디렉터리에서 유일한 항목이거나 --path, --ignore-files, 및 --filter로 지정되어야 합니다. 이 기능은 Data Replay │
│                         의 확장 기능이며 동일한 제한 사항이 적용됩니다.                                                                     │
│ enrich-test-data        Panther API의 추가 enrichment로 테스트 데이터를 보강합니다.                                          │
│ check-packs             팩에 누락된 탐지가 없는지 확인합니다.                                                            │
│ init                    새로운 panther 프로젝트를 초기화합니다                                                                            │
│ update                  Panther Analysis의 최신 콘텐츠를 가져와 자신의 콘텐츠와 업데이트 및 병합합니다. 콘텐츠를 업데이트하고 싶을 때마다 이 명령을 다시 실행하세요.    │
│                         Panther Analysis 항목과 동일한 ID와 BaseVersion 필드를 가진 항목은 최신 Panther Analysis 항목과 병합됩니다.      │
│                         병합 충돌이 있는 항목은 건너뛰고 `merge` 명령으로 수동 해결해야 합니다. 모든 병합         │
│                         충돌을 건너뛰지 않고 각각의 파일에 쓰려면 --write-merge-conflicts 플래그를 사용하세요.                                               │
│ install                 Panther Analysis의 분석 항목을 로컬 저장소에 설치하고 활성화합니다.                         │
│ explore                 최신 Panther Analysis 콘텐츠를 탐색합니다                                                                 │
│ merge                   분석 항목을 최신 Panther Analysis 콘텐츠와 병합합니다                                      │
│ migrate                 BaseVersion 필드를 추가하고 최신 상태로 맞춤으로써 Panther Analysis 콘텐츠를 기반으로 한 모든 분석 항목을 마이그레이션합니다.    │
│                         getting them up to date.                                                                                    │
│ fmt                     현재 디렉터리의 코드를 형식화하고 표준화하여 다른 명령에서 변경 사항이 덜 발생하도록 돕습니다.          │
│                         commands.                                                                                                   │
init
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
```

### `: Panther 디렉터리 준비 중`이 명령은 Panther 디렉터리를 처음 설정할 때 한 번만 실행해야 합니다.

이 작업은 다음을 수행합니다:

다음을 생성합니다

* .gitignore `파일, 필요한 경우, 그리고 여기에 추가합니다` 활성화합니다
* git rerere `.cache`
* .gitignore `디렉터리, 여기에는 로컬에 콘텐츠를 저장합니다` panther-analysis `빠른 로드를 위해` 최신 콘텐츠를 가져옵니다
  * migrate `빠른 로드를 위해`

### `: 레거시 관리 흐름에서 콘텐츠 전환`PAT가 향후 업데이트를 위해 기존 분석 항목을 추적하기 시작하도록 지시합니다.

`: 레거시 관리 흐름에서 콘텐츠 전환` 실행하면

pat migrate `저장소를 살펴보고 다음을 수행합니다:` ID가 다음의 ID와 일치하는 각 분석 항목에 대해

* 다음을 추가합니다 `빠른 로드를 위해`:
  * BaseVersion `필드를 YAML 파일에 추가합니다.` 항목을 최신 버전과 병합합니다
  * 병합 충돌이 있으면 PAT는 항목을 병합하지 않은 상태로 둡니다. 충돌을 해결하려면 다음을 실행하세요 `빠른 로드를 위해`.
    * pat migrate \<ID> `선택적으로 다음을 사용할 수 있습니다`.
    * \--auto-accept `플래그를 사용하면 병합 충돌을 완전히 피할 수 있습니다.` 참고:<br>

      <div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><p>는 아직 마이그레이션 중인 동안 병합 충돌을 해결하기 위한 것입니다. 다음 중 병합 충돌이 발생한 항목은 <code>선택적으로 다음을 사용할 수 있습니다</code> 아직 마이그레이션되지 않았습니다. 이는 다음과 매우 유사합니다 <code>저장소를 살펴보고 다음을 수행합니다:</code> pat merge &#x3C;ID> <code>이며, 다음을 실행한 후 병합 충돌을 해결하는 데 사용됩니다</code>pat update <code>}</code>. 그 <code>병합</code> 명령은 마이그레이션 단계에서 사용해서는 안 됩니다.</p></div>
* ID가 다음 항목의 ID와 일치하지 않는 각 분석 항목에 대해 `빠른 로드를 위해`, 해당 항목은 사용자 지정 항목으로 간주되므로 변경되지 않습니다.

이 명령의 출력은 다음에 저장됩니다. `./migration_status.md`.

### `업데이트`: 최신 panther-analysis 콘텐츠를 가져와 병합합니다

콘텐츠를 업데이트하려면 이 작업을 원할 때마다 다시 실행하세요.

이 명령은 최신 `빠른 로드를 위해` 콘텐츠를 가져와 자신의 콘텐츠에 병합합니다. PAT는 분석 항목이 다음 항목의 ID와 동일한지 확인하여 항목을 업데이트해야 하는지 판단하며 `빠른 로드를 위해` 그리고 `필드를 YAML 파일에 추가합니다.` 가 다음 항목의 최신 버전보다 작은지 확인합니다 `빠른 로드를 위해`. 항목의 ID가 다음의 항목과 같지만 `빠른 로드를 위해` 필드가 없으면 업데이트되지 않습니다. 마찬가지로, 항목에 다음과 일치하는 ID가 없지만 `필드를 YAML 파일에 추가합니다.` 그리고 `빠른 로드를 위해` 필드가 있으면 업데이트되지 않습니다. `필드를 YAML 파일에 추가합니다.` 병합 충돌이 있는 항목은

의 일부로 업데이트되지 않으며 `}`명령으로 수동으로 해결해야 합니다. 병합 충돌이 있었던 모든 항목의 목록은 다음의 출력에 인쇄됩니다. `병합` 명령의 `업데이트` .

{% hint style="info" %}
다음으로 인해 병합 충돌이 발생한 경우 `}`이를 다음으로 해결할 수 있습니다 `pat merge` (단, 성공적으로 업데이트된 콘텐츠를 테스트하고 업로드하는 데 필수는 아닙니다).
{% endhint %}

다음을 사용하세요 `--write-merge-conflicts` 플래그를 사용하여 모든 병합 충돌을 건너뛰지 않고 각 해당 파일에 기록합니다(충돌 해결에 AI를 사용하는 경우 유용할 수 있습니다). 다음을 사용하세요 `--auto-accept panthers` 또는 `--auto-accept yours` 를 사용하여 병합 충돌을 자동으로 해결합니다(충돌을 해결한 후에도 항목에 문제가 있거나 테스트가 실패할 수 있으므로, 각 항목은 해결 후 검토해야 합니다).

다음을 사용하세요 `--preview` 플래그를 사용하여 업데이트를 드라이 रन으로 실행합니다. 이 플래그를 사용하면 명령이 업데이트될 항목과 병합 충돌이 발생할 항목의 ID를 파일을 업데이트하지 않고 출력합니다.

### `탐색`: 사용 가능한 `빠른 로드를 위해` 콘텐츠 보기

실행 `pat explore` 를 사용하여 `빠른 로드를 위해` 콘텐츠를 다음의 `디렉터리, 여기에는 로컬에 콘텐츠를 저장합니다` 디렉터리에서 확인하세요. (이 명령은 최신 p-a 릴리스와 비교해 구버전인 경우 새 p-a 콘텐츠를 가져옵니다.) 콘텐츠 ID, 유형 또는 설명으로 검색할 수 있습니다.

다음에 접근할 수 있습니다 **분석 콘텐츠** 트리를 다음을 사용하여 `탭`하십시오 `enter` 를 분석 유형에서 누르면 해당 유형으로 필터링됩니다. 누르세요 `enter` 임의의 단일 analysis ID를 기준으로 필터링합니다.

<figure><img src="/files/5482eccd8cb6d2d54adc218000dc9d3124ba380f" alt=""><figcaption></figcaption></figure>

검색창을 사용하여 표의 항목을 필터링할 수 있습니다. 일반 텍스트를 검색하면 YAML 또는 Python 파일에 해당 텍스트가 포함된 항목을 대소문자 구분하여 필터링합니다. 명령줄에서 사용할 수 있는 필터를 사용하여 검색할 수도 있습니다. 예를 들어, `data "prod env" AnalysisType=룰 Severity=Critical,High` 를 검색하면 YAML 또는 Python 파일에 `data` 가 포함되어 있고, `prod env` 가 포함되어 있으며, 분석 유형이 `룰`이고 심각도가 `Critical` 또는 `High`인 모든 항목을 대소문자 구분하여 검색합니다. 검색에서 단어나 구를 함께 묶으려면 작은따옴표 또는 큰따옴표를 사용할 수 있습니다. 모든 따옴표는 검색이 적용되려면 짝이 맞는 닫는 따옴표가 있어야 합니다. 큰따옴표는 백슬래시(`\`)를 사용해 이스케이프할 수 있습니다. 작은따옴표는 이스케이프할 수 없습니다.

를 누르면 `enter` 특정 항목의 소스 코드를 엽니다. YAML 및 Python 파일이 있는 분석 유형의 경우 두 파일이 나란히 표시됩니다.

<figure><img src="/files/4d2b873df31f5efb0412111c9c26381397e9fc51" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
특정 항목을 볼 때 `^v` 를 사용하여 별도의 `pat install` 명령을 사용하지 않고도 설치 및 활성화할 수 있습니다.

<img src="/files/00b288f424bc9e633b60ea6c788a6c7d98715b9a" alt="" data-size="original">
{% endhint %}

다음으로 탐색기 GUI를 종료할 수 있습니다. `ctrl+q` 또는 `ctrl+c`.

### `설치`: 하나의 `빠른 로드를 위해` 항목을 복사하여 활성화

실행 `pat install` 해 `빠른 로드를 위해` 에서 자신의 저장소로 항목을 복사할 수 있습니다. (설치하려는 내용을 이해하려면 다음을 실행하는 것이 좋습니다. `pat explore`.)

종속성(예: 전역 헬퍼 또는 데이터 모델)이 있는 분석 항목을 설치하면 종속성도 함께 설치됩니다(자신의 저장소에 복제됨).

### `fmt`: 코드를 포맷하고 표준화

현재 디렉터리의 코드를 포맷하고 표준화하려면 실행합니다. PAT를 사용하는 데 필요한 포맷 변경 사항이 있습니다. 이 명령을 사용하면 도구가 수행하는 다른 모든 변경 사항과 별도로 포맷 변경 사항을 쉽게 적용할 수 있습니다. PAT와 작업하는 동안 논리 변경과 포맷 변경을 서로 독립적으로 유지하려면 이를 사용하세요.

YAML 파일에 적용하는 변경 사항은 다음과 같습니다:

* 모든 불리언 대문자 사용을 정규화합니다(예: `True` -> `true`)
* 모든 들여쓰기를 2칸으로 표준화합니다
* 명시적인 `null`값을 빈 값으로 바꿉니다(예: `Field: null` -> `Field:` )
* 인라인 스타일 필드를 모두 블록 스타일로, JSON을 블록 스타일로 바꿉니다
* 명시적인 여러 줄 표식이 없는 문자열 내부의 모든 줄바꿈을 제거합니다(예: `|` 및 `>`)

### `병합`: 최신 Panther Analysis 버전의 항목과 분석 항목을 병합

{% hint style="info" %}
`이며, 다음을 실행한 후 병합 충돌을 해결하는 데 사용됩니다` 는 다음 이후의 병합 충돌을 해결하기 위한 것입니다. `}`. 아직 코드를 마이그레이션 중이라면 다음을 사용하세요. `선택적으로 다음을 사용할 수 있습니다` 병합 충돌이 있는 항목을 마이그레이션합니다.
{% endhint %}

실행한 후 `}`, 분석 항목이 깔끔하게 업데이트되지 못하게 하는 병합 충돌이 발생할 수 있습니다. Panther Analysis의 최신 버전과 항목을 병합하고 병합 충돌을 해결하려면 다음을 실행하세요. `이며, 다음을 실행한 후 병합 충돌을 해결하는 데 사용됩니다`, 다음과 같이 `ID` 는 병합 충돌을 해결하려는 분석 항목의 ID입니다.

YAML 병합 충돌은 사용자 지정 YAML 병합 충돌 해결 도구 내에서 해결됩니다. 이를 통해 필드별로 항목을 빠르게 비교하여 충돌을 해결할 때 사용자의 버전 또는 Panther의 버전을 선택할 수 있습니다. 이 도구는 줄 단위가 아니라 필드 단위로 변경 사항을 비교하므로, 서식 변경으로 인해 발생하는 병합 충돌을 피할 수 있습니다. YAML의 최상위 필드만 비교합니다.

YAML 충돌을 모두 처리한 후에는 이 명령으로 Python 병합 충돌을 해결할 수 있습니다. 기본적으로 이는 `vi`. 사용하려는 다른 편집기를 제공하여 지정할 수 있습니다. `--editor` 플래그 또는 설정하는 `EDITOR` 환경 변수입니다. 편집기는 사용 가능한 CLI 명령으로 제공되어야 합니다. 일부 편집기는 기본적으로 CLI 명령을 설치하지 않으므로, 선호하는 편집기를 CLI를 통해 사용할 수 있는지 확인하시기 바랍니다.

병합 충돌을 성공적으로 해결한 후, 명령은 `필드를 YAML 파일에 추가합니다.` 필드를 YAML에서 업데이트해 드립니다.

병합 충돌을 다른 방식으로 해결하고 싶다면 다음 플래그를 사용할 수 있습니다:

* `플래그를 사용하면 병합 충돌을 완전히 피할 수 있습니다.`: 다른 명령에서와 동일하게 작동합니다. 다음을 허용합니다 `당신의 것` 또는 `표범들` 값으로. 병합의 한쪽을 자동으로 해결하여 병합 충돌을 피합니다.
* `--write-merge-conflicts`: 모든 병합 충돌을 해결되지 않은 상태로 해당 파일에 기록합니다. 이렇게 해도 어떤 충돌도 해결되지 않으며, 공백 YAML 충돌도 피할 수 없습니다. `필드를 YAML 파일에 추가합니다.` 업데이트될 것입니다.

### `테스트`: 단위 테스트 실행 중

정의된 사양 파일을 불러오고 로컬에서 단위 테스트를 평가하려면 PAT를 사용하세요:

```bash
panther_analysis_tool test --path <folder-name>
```

특정 속성을 기준으로 규칙 또는 정책을 필터링하려면:

```bash
panther_analysis_tool test --path <folder-name> --filter RuleID=Category.Behavior.MoreInfo
```

{% hint style="info" %}
pat migrate `pat test` 에 대한 [상관 규칙](/ko/detections/correlation-rules.md) 및 [단순 탐지](/ko/detections.md#simple-detections) API 토큰이 필요합니다. 참고하십시오 [API 토큰으로 인증하기](/ko/panther/detections-repo/pat/install-configure-and-authenticate-with-pat.md#authenticating-with-an-api-token) 자세한 내용은.
{% endhint %}

### `디버그`: print 문과 중단점을 사용하여 테스트를 디버그합니다

사용 `디버그` 특정 단위 테스트를 디버그 모드로 실행하려면 다음을 사용하세요:

```bash
panther_analysis_tool debug My.RuleID "My unit test name"
```

인쇄 문장을 참조하세요:

```bash
정보: /panther-analysis/rules/debug에서 분석 항목 테스트 중
Debug.RuleThatPrints
안녕, 세상!
```

트레이스백 정보와 함께 오류를 확인하세요:

```bash
정보: /panther-analysis/rules/debug에서 분석 항목 테스트 중
Debug.RuleWithError
오류: 디버그 추적을 위한 테스트 예외
  파일 "/panther-analysis/rules/debug/rule_with_error.py", 4행, 룰
    sub_func()
  파일 "/panther-analysis/rules/debug/룰_with_error.py", 7번째 줄, sub_func에서
    raise ValueError('디버그 추적용 테스트 예외')
```

### `벤치마크`: 룰 성능 평가

다음을 사용할 수 있습니다 `벤치마크` 기존 룰 또는 초안 룰의 성능을 한 시간 분량의 데이터에 대해, 하나의 로그 유형에 대해 테스트할 수 있습니다. 시간 초과가 발생하는 룰을 반복적으로 개선할 때 특히 유용할 수 있습니다. 이는 장시간 실행되는 명령으로, 정기적인 CI/CD 워크플로가 아니라 필요할 때 수동으로 사용하도록 նախատեսված 것입니다.

이 명령과 함께 사용되는 API 토큰에는 "View Overview"(다음으로도 알려짐 `SummaryRead`) 및 "Manage Rules"(다음으로도 알려짐 `RuleModify`) 권한이 부여되어 있어야 합니다. 왜냐하면 `벤치마크` 은 [Data Replay](/ko/detections/testing/data-replay.md)의 확장이므로 동일한 [제한 사항](/ko/detections/testing/data-replay.md#limitations).

에 대해 단일 룰을 제공해야 합니다 `벤치마크`, 즉 작업 디렉터리에 룰이 하나만 있거나(`./` 또는 `--path`) 또는 `--ignore-files` 또는 `--filter`.

를 사용해야 합니다. 특정 시간의 데이터를 지정하지 않으면 시스템이 데이터 볼륨이 가장 큰 과거의 시간을 선택합니다. 실행할 특정 시간을 지정하려면 `--hour`를 사용하십시오. (가장 일반적인 시간 형식이 지원됩니다. 예: `2023-07-31T09:00:00-7:00`—분, 초 등은 잘립니다). 예를 들면 다음과 같습니다:

```bash
panther_analysis_tool benchmark --hour <datetime>
```

여러 로그 유형을 가진 룰의 경우, 다음을 사용하여 하나를 지정해야 합니다 `--log-type`. 예를 들면 다음과 같습니다:

```bash
panther_analysis_tool benchmark --log-type <log-type>
```

다음의 출력은 `벤치마크` 표준 출력(stdout)과 `--out` 옵션으로 지정된 디렉터리에 모두 기록됩니다.

### `enrich-test-data`: 보강 콘텐츠로 테스트 데이터 보강

사용 `enrich-test-data` 연결된 [Enrichment providers](/ko/enrichment.md) 및 사용자 지정 [Lookup Tables](/ko/enrichment/custom.md)의 데이터로 룰과 Scheduled Rule의 테스트 콘텐츠를 보강하는 데 사용됩니다. 이를 통해 보강 콘텐츠에 의존하는 탐지를 위한 보다 정교한 테스트 사례를 작성할 수 있습니다.

`enrich-test-data` 사용하기는 간단하지만 분석 YAML 파일에 상당한 변경을 초래할 수 있습니다. 이 명령은 다음 기준에 따라 파일을 수정합니다:

* 룰 또는 Scheduled Rule에 테스트 사례가 없으면 YAML 파일은 수정되지 않습니다.
* 로그 유형이 보강을 지원하지 않으면 YAML 파일은 수정되지 않습니다.
* 로그 유형이 보강을 지원하고 테스트 사례가 있는 경우:
  * 인라인 JSON 콘텐츠로 표현된 테스트 사례는 YAML로 다시 형식이 지정됩니다.
  * YAML 파일은 일반적인 YAML 규칙에 따라 들여쓰기에 두 칸을 사용하여 형식이 지정됩니다.

다른 명령과 마찬가지로 `enrich-test-data` 현재 디렉터리에서 재귀적으로 작동합니다. 루트 디렉터리에서 이 명령을 실행하면 `빠른 로드를 위해` 복사본의 모든 룰과 Scheduled Rule을 보강하려고 시도합니다. 단일 디렉터리의 콘텐츠를 보강하려면 명령을 실행하기 전에 해당 디렉터리로 이동하십시오.

다음을 실행할 수 있습니다 `enrich-test-data` PAT 버전 0.26 이상에서 다음 명령을 사용하여:

```bash
panther_analysis_tool enrich-test-data
```

명령의 출력은 stdout에 기록되며, 강화된 모든 Rules 또는 Scheduled Rules의 목록을 포함합니다.

### `validate`: 디택션 콘텐츠가 업로드할 준비가 되었는지 확인

The `validate` 명령은 업로드 프로세스에서 발생하는 것과 동일한 검사를 실행하여 디택션 콘텐츠가 Panther 인스턴스에 업로드할 준비가 되었는지 확인합니다. 이러한 검사 중 일부는 Panther 인스턴스의 구성 정보가 필요하므로, `validate` API 호출을 수행합니다.

PAT를 사용하여 Panther 인스턴스에서 디택션을 검증하려면:

1. 아직 하지 않았다면, [Panther Console에서 API 토큰을 생성하세요](/ko/panther/api.md#how-to-create-a-panther-api-token).
2. 다음 명령을 실행하세요:

   {% code fullWidth="false" %}

   ```bash
   panther_analysis_tool validate --path <path-to-your-detections> --api-token <your-api-token> --api-host https://api.<your-panther-instance-name>.runpanther.net/public/graphql
   ```

   {% endcode %}

   * 다음을 생략할 수 있습니다. `--api-token` 및 `--api-host` 다음을 [구성 값 설정](/ko/panther/detections-repo/pat/install-configure-and-authenticate-with-pat.md#configuring-pat) 환경 변수 또는 구성 파일을 사용하는 등 다른 방법으로 하는 경우.

### `zip`: Panther Console에 업로드할 패키지 만들기

Panther Console에 수동으로 업로드할 패키지를 만들려면 다음 명령을 실행하세요:

```
$ panther_analysis_tool zip --path tests/fixtures/valid_policies/ --out tmp
[INFO]: tests/fixtures/valid_policies/의 analysis packs를 테스트하는 중

AWS.IAM.MFAEnabled
	[PASS] 루트 MFA가 활성화되지 않으면 규정 준수 실패
	[PASS] 사용자 MFA가 활성화되지 않으면 규정 준수 실패

[INFO]: tests/fixtures/valid_policies/의 analysis packs를 tmp로 압축하는 중
[INFO]: <current working directory>/tmp/panther-analysis-2020-03-23T12-48-18.zip
```

#### Panther Console에서 콘텐츠 업로드

1. Panther Console의 왼쪽에서 **Detections**.
2. 을 클릭합니다. **Upload** 버튼을 오른쪽 상단 모서리에서 클릭하세요.
3. .zip 파일을 페이지에 끌어다 놓거나 **파일 선택**.

   <figure><img src="/files/a0e12134a5e3137dfa70095b5371d77b4cd97103" alt=""><figcaption></figcaption></figure>

### `업로드`: Panther에 패키지를 직접 업로드

{% hint style="info" %}
PAT 버전 0.22.0부터는 API 토큰으로 인증한 다음 `업로드` 명령을 실행하면 타임아웃 문제를 방지하기 위해 비동기식 대량 업로드가 자동으로 수행됩니다.

인증에 API 토큰을 사용하지 않았다면, `--batch` 옵션을 사용할 수 있습니다.  `--batch` 옵션은 PAT 0.19.0 이후 버전에서만 사용할 수 있습니다.
{% endhint %}

업로드 명령은 디택션 콘텐츠를 Panther 인스턴스에 업로드합니다.

사용하려면 `업로드`:

1. 아직 하지 않았다면, [Panther Console에서 API 토큰을 생성하세요](/ko/panther/api.md#step-2-create-an-api-token).
2. 실행 `panther_analysis_tool test` 를 사용하여 단위 테스트가 통과하는지 확인하세요.
3. 다음 명령을 실행하세요:\
   `panther_analysis_tool upload --path <path-to-your-detections> --api-token <your-api-token> --api-host https://api.<your-panther-instance-name>.runpanther.net/public/graphql`
   * 다음을 생략할 수 있습니다. `--api-token` 및 `--api-host` 다음을 [구성 값 설정](/ko/panther/detections-repo/pat/install-configure-and-authenticate-with-pat.md#configuring-pat) 환경 변수 또는 구성 파일을 사용하는 등 다른 방법으로 하는 경우.

다음을 사용할 때 `업로드`기존 ID가 있는 디택션과 Lookup Tables는 덮어쓰기됩니다. 로컬에서 삭제된 디택션은 업로드 시 Panther 인스턴스에서 자동으로 삭제되지 않습니다. 이들은 [`삭제`](#delete-deleting-rules-policies-or-saved-queries) 명령으로 제거해야 합니다(또는 Panther Console에서 수동으로 삭제해야 합니다). CLI 워크플로를 사용할 때는 디택션의 `Enabled` 속성을 `false`로 설정하고 삭제하지 않는 것이 권장됩니다.

엔터티의 ID(즉, `RuleId` 또는 `PolicyId`의 값)를 업데이트하고 `업로드`을 사용하지만, 이전 엔터티를 수동으로 제거하기 위해 `삭제` 도 함께 사용하지 않으면 Panther 인스턴스에 두 버전이 모두 존재하게 됩니다. 중복 디택션을 만들지 않고 ID를 업데이트하려면 `삭제` 를 사용하여 이전 ID를 지정하세요.

#### The `CreatedBy` 디택션 필드

기본적으로 CLI 워크플로에서 업로드된 디택션(즉, [PAT](#upload-uploading-packages-to-panther-directly) 또는 [REST API](/ko/panther/api/rest.md)를 통해 업로드된 경우)은 Panther Console의 **Detections** 목록 페이지에 Panther에 의해 생성된 것으로 표시됩니다:

<figure><img src="/files/d00fc8b72fceb936fcc4f8f3b4a64cf59d553e22" alt="A table with headers and one row is shown. A header/row value pair (Created By / Panther) is circled."><figcaption></figcaption></figure>

디택션에 대한 **Created By** 값을 사용자 지정하려면, CLI 워크플로에서 업로드된 디택션에 `CreatedBy` 키를 디택션의 YAML 파일에 추가할 수 있습니다. `CreatedBy` 의 값은 다음과 같을 수 있습니다:

* Panther 사용자의 이메일 주소: Console에서 Created By 필드에 연결된 사용자가 표시됩니다.
* Panther 사용자의 고유 ID: Console에서 Created By 필드에 연결된 사용자가 표시됩니다.
  * 이 값은 다음을 사용하여 조회할 수 있습니다. [사용자 목록 REST API 엔드포인트](/ko/panther/api/rest/users.md#get-users).
* 임의의 텍스트 값: Panther Console에서 제공된 값이 **(External)** 이 추가된 형태로 표시됩니다.

  <div data-full-width="true"><figure><img src="/files/b83c3b53309b3a83b91ca869a3118505a569f01e" alt="A table with headers and four row values is shown. A &#x22;Created By&#x22; column with the values in the first three rows is circled."><figcaption></figcaption></figure></div>

The `CreatedBy` 키는 Python 규칙, 예약 규칙, 상관 규칙, simple detections 및 정책의 정의에 사용할 수 있습니다.

Panther Console에서 디택션을 다운로드하는 경우:

* Panther Console에서 생성된 경우, 다음을 포함하지 않습니다. `CreatedBy`.
* CLI 워크플로에서 업로드된 경우:
  * 다음을 사용하면 `CreatedBy`을 포함합니다. `CreatedBy`.
  * 다음이 없으면 `CreatedBy`을 포함하지 않습니다. `CreatedBy`.

### `삭제`: 규칙, 정책 또는 저장된 쿼리 삭제

동안 `panther_analysis_tool upload --path <directory>` 는 다음의 모든 항목을 업로드하지만 `<directory>`에서 로컬 파일을 단순히 제거한다고 해서 Panther 인스턴스에서 아무것도 삭제되지는 않습니다. `<directory>`. 대신 다음을 사용할 수 있습니다. `panther_analysis_tool delete` Panther 인스턴스에서 디택션을 명시적으로 삭제하는 명령입니다.\
\
특정 디택션을 삭제하려면 다음 명령을 실행할 수 있습니다:

```bash
panther_analysis_tool delete --analysis-id MyRuleId
```

이 명령은 디택션을 삭제하기 전에 확인을 위해 대화형으로 묻습니다. 확인 없이 삭제하려면 다음 명령을 사용할 수 있습니다:

```bash
panther_analysis_tool delete --analysis-id MyRuleId --no-confirm
```

PAT를 사용하면 한 번에 최대 1000개의 디택션을 삭제할 수 있습니다.

### `update-custom-schemas`: 사용자 지정 스키마 생성 또는 업데이트

사용 `update-custom-schemas` 사용자 지정 스키마를 생성하거나 업데이트합니다.

{% hint style="warning" %}
이 명령으로 스키마를 생성한 후에는 최소 15분 동안 기다린 다음 `업로드` 새 스키마를 참조하는 디택션을 업로드하세요.
{% endhint %}

## 명령별로 필요한 권한

아래는 각 명령에 필요한 권한의 매핑입니다. 다음을 참조하세요: [콘솔 및 API의 권한 이름](/ko/system-configuration/rbac.md#permission-names-in-the-console-and-api) 자세한 내용은.

<table><thead><tr><th width="313">명령</th><th>필요한 권한</th></tr></thead><tbody><tr><td><code>check-connection</code></td><td><code>GeneralSettingsRead</code></td></tr><tr><td><code>테스트</code> (다음을 사용하는 디택션을 테스트할 때 <a href="https://docs.panther.com/detections/rules/inline-filters">Inline Filters</a>)</td><td><code>BulkUpload</code> 또는 <code>BulkUploadValidate</code> 또는 <code>ViewRules</code></td></tr><tr><td><code>벤치마크</code></td><td><code>SummaryRead</code>, <code>RuleRead</code>, <code>RuleModify</code></td></tr><tr><td><code>validate</code></td><td><code>BulkUpload</code> 또는 <code>BulkUploadValidate</code></td></tr><tr><td><code>업로드</code></td><td><code>BulkUpload</code></td></tr><tr><td><code>삭제</code></td><td><code>PolicyModify</code>, <code>RuleModify</code>, <code>DataAnalyticsModify</code></td></tr><tr><td><code>update-custom-schemas</code></td><td><code>LogSourceRead</code>, <code>LogSourceModify</code></td></tr><tr><td><code>enrich-test-data</code></td><td><code>PolicyModify</code>, <code>RuleModify</code></td></tr><tr><td><code>zip</code></td><td><code>RuleRead</code>, <code>BulkUpload</code>, <code>BulkUploadValidate</code></td></tr><tr><td><code>디버그</code></td><td><code>RuleRead</code>, <code>BulkUpload</code>, <code>BulkUploadValidate</code></td></tr></tbody></table>

## PAT 명령 옵션

각 PAT 명령에는 옵션(플래그라고도 함)이 있으며, 다음을 실행하여 확인할 수 있습니다 `$ pat <command> -h`.

<details>

<summary>예시 출력: <code>pat test -h</code></summary>

```
$ panther_analysis_tool test -h   
사용법: panther_analysis_tool test [-h] [--filter KEY=VALUE [KEY=VALUE ...]] [--minimum-tests MINIMUM_TESTS] [--path PATH] [--ignore-extra-keys IGNORE_EXTRA_KEYS]
                                  [--ignore-files IGNORE_FILES [IGNORE_FILES ...]] [--skip-disabled-tests] [--available-destination AVAILABLE_DESTINATION]
                                  [--sort-test-results] [--ignore-table-names]

선택적 인수:
  -h, --help            이 도움말 메시지를 표시하고 종료
  --filter KEY=VALUE [KEY=VALUE ...]
  --minimum-tests MINIMUM_TESTS
                        디택션이 통과한 것으로 간주되기 위한 최소 테스트 수입니다. 1보다 큰 수가 지정되면 최소한 하나의 True와
                        하나의 False 테스트가 필요합니다.
  --path PATH           Panther 정책 및 규칙에 대한 상대 경로입니다.
  --ignore-extra-keys IGNORE_EXTRA_KEYS
                        고급 사용자를 위한 옵션입니다. 스키마 검증에서 추가 키를 건너뛸 수 있습니다.
  --ignore-files IGNORE_FILES [IGNORE_FILES ...]
                        이 프로젝트의 파일 중 panther-analysis 도구에서 무시할 상대 경로이며, 공백으로 구분합니다. 예: ./foo.yaml ./bar/baz.yaml
  --skip-disabled-tests
  --available-destination AVAILABLE_DESTINATION
                        destinations 함수가 반환할 수 있는 대상 이름입니다. 둘 이상의 이름을 정의하려면 인수를 반복하세요.
  --sort-test-results   테스트 결과를 테스트 통과 또는 실패 여부로 정렬합니다(통과한 테스트 우선). 그다음 룰 ID로 정렬합니다.
  --ignore-table-names  스키마 검증에서 테이블 이름을 건너뛸 수 있습니다. Panther 또는 Snowflake가 아닌 테이블을 쿼리할 때 유용합니다.
  --valid-table-names   VALID_TABLE_NAMES [VALID_TABLE_NAMES ...]
                        스키마 검증 중 유효한 것으로 간주되어야 하는 정규화된 테이블 이름입니다(표준 Panther/Snowflake 테이블에 추가로). 공백으로
                        구분됩니다. 0개 이상의 문자와 일치하는 와일드카드 문자로 '*'를 허용합니다. 예: foo.bar.baz bar.baz.* foo.*bar.baz baz.* *.foo.*
```

</details>

옵션이 여러 인수를 받는 경우, 각 값을 해당 옵션과 함께 개별적으로 전달해야 합니다. 예를 들어, 다음에 두 개의 인수를 전달하려면 `--valid-table-names`:

* 올바름: `--valid-table-names table1 --valid-table-names table2`
* 잘못됨: `--valid-table-names table1 table2`

다중 인수 옵션이 다음 형식의 값을 허용하는 경우 `KEY=VALUE1,VALUE2` (예: [`--filter`](#filter-filtering-pat-commands))와 같이 각 항목은 플래그에 개별적으로 전달해야 합니다(인수의 값 자체는 여전히 쉼표로 구분된 배열로 표현할 수 있음). 예:

* 올바름: `--filter AnalysisType=policy,룰 --filter Severity=High`
* 잘못됨: `--filter AnalysisType=policy,룰 Severity=High`

### `--filter`: PAT 명령 필터링

The `테스트`, `zip`, `업로드`, 그리고 `릴리스` 명령은 모두 필터링을 지원합니다. 필터링은 `--filter` 형식으로 지정된 필터 목록과 함께 플래그를 전달하여 작동합니다. `KEY=VALUE1,VALUE2`. 키는 policy 또는 룰의 모든 유효한 필드가 될 수 있습니다. 필터를 사용할 때는 지정된 각 필터와 일치하는 분석 유형만 고려됩니다.

예를 들어, 다음 명령은 `AnalysisType` 이 policy이고 `Severity` 가 High인 항목만 테스트합니다:

```
panther_analysis_tool test --path tests/fixtures/valid_policies --filter AnalysisType=policy --filter Severity=High
[INFO]: tests/fixtures/valid_policies의 분석 팩을 테스트하는 중

AWS.IAM.BetaTest
	[PASS] 루트 MFA가 활성화되지 않으면 규정 준수 실패
	[PASS] 사용자 MFA가 활성화되지 않으면 규정 준수 실패
```

다음 명령은 `AnalysisType` policy 또는 룰이고, 그리고 `Severity` High:

```
panther_analysis_tool test --path tests/fixtures/valid_policies --filter AnalysisType=policy,룰 --filter Severity=High
[INFO]: tests/fixtures/valid_policies의 분석 팩을 테스트하는 중

AWS.IAM.BetaTest
	[PASS] 루트 MFA가 활성화되지 않으면 규정 준수 실패
	[PASS] 사용자 MFA가 활성화되지 않으면 규정 준수 실패

AWS.CloudTrail.MFAEnabled
	[PASS] 루트 MFA가 활성화되지 않으면 규정 준수 실패
	[PASS] 사용자 MFA가 활성화되지 않으면 규정 준수 실패
```

다음을 참조하는 정책 또는 룰을 작성할 때 `global` 분석 유형인 경우, 필터에 반드시 포함하세요. 필터의 값으로 빈 문자열을 포함할 수 있으며, 이는 해당 필드가 존재할 때만 필터가 적용됨을 의미합니다.

다음 명령은 오류를 반환합니다. 해당 정책이 global을 import하지만 global에는 severity가 없어서 필터에 의해 제외되기 때문입니다:

```
panther_analysis_tool test --path tests/fixtures/valid_policies --filter AnalysisType=policy,global --filter Severity=Critical
[INFO]: tests/fixtures/valid_policies의 분석 팩을 테스트하는 중

AWS.IAM.MFAEnabled
	[ERROR] 모듈 로드 오류, 건너뛰는 중

유효하지 않음: tests/fixtures/valid_policies/example_policy.yml
	'panther'라는 이름의 모듈이 없습니다

[ERROR]: [('tests/fixtures/valid_policies/example_policy.yml', ModuleNotFoundError("'panther'라는 이름의 모듈이 없습니다"))]
```

이 쿼리가 예상대로 작동하려면 severity 필드가 없을 수 있도록 허용해야 합니다:

```
panther_analysis_tool test --path tests/fixtures/valid_policies --filter AnalysisType=policy,global --filter Severity=Critical,""
[INFO]: tests/fixtures/valid_policies의 분석 팩을 테스트하는 중

AWS.IAM.MFAEnabled
	[PASS] 루트 MFA가 활성화되지 않으면 규정 준수 실패
	[PASS] 사용자 MFA가 활성화되지 않으면 규정 준수 실패
```

필터는 `zip`, `업로드`, 그리고 `릴리스` 명령에서와 동일한 방식으로 `테스트` .

### `--minimum-tests`: 일정 수의 단위 테스트를 요구함

다음 옵션을 사용하여 최소 단위 테스트 수를 설정할 수 있습니다 `--minimum-tests` . 최소 테스트 수를 충족하지 못하는 디택션은 실패한 것으로 간주됩니다. 만약 `--minimum-tests` 이 `2` 이거나 더 큰 값으로 설정되면, 최소한 하나의 테스트는 `True` 를 반환하고 하나는 `False`.

아래 예시에서는 각 룰 테스트가 통과했더라도, 올바른 테스트 커버리지가 없기 때문에 여전히 실패한 것으로 간주됩니다:

```
panther_analysis_tool test --path tests/fixtures/valid_policies --minimum-tests 2
% panther_analysis_tool test --path okta_rules --minimum-tests 2
[INFO]: okta_rules의 분석 팩 테스트 중

Okta.AdminRoleAssigned
	[PASS] 관리자 액세스 할당

Okta.BruteForceLogins
	[PASS] 로그인 실패

Okta.GeographicallyImprobableAccess
	[PASS] 로그인 아님
	[PASS] 로그인 실패

--------------------------
Panther CLI 테스트 요약
	경로: okta_rules
	통과: 0
	실패: 3
	무효: 0

--------------------------
실패한 테스트 요약
	Okta.AdminRoleAssigned
		['테스트 커버리지가 부족합니다. 2개의 테스트가 필요하지만 1개만 발견되었습니다.', '테스트 커버리지가 부족합니다: 최소한 하나의 통과 테스트와 하나의 실패 테스트가 필요합니다.']

	Okta.BruteForceLogins
		['테스트 커버리지가 부족합니다. 2개의 테스트가 필요하지만 1개만 발견되었습니다.', '테스트 커버리지가 부족합니다: 최소한 하나의 통과 테스트와 하나의 실패 테스트가 필요합니다.']

	Okta.GeographicallyImprobableAccess
		['테스트 커버리지가 부족합니다: 최소한 하나의 통과 테스트와 하나의 실패 테스트가 필요합니다.']
```

## 자주 묻는 질문 <a href="#faq" id="faq"></a>

<details>

<summary>저는 <code>versions.yml</code> 파일이 저장소에 필요한가요?</summary>

아니요, 저장소에 `versions.yml` 를 유지하거나 포함할 필요는 없습니다.

</details>

<details>

<summary>상위 소스에서 디택션을 업데이트한 후, PAT가 내 변경 사항을 인식하도록 별도로 해야 할 일이 있나요?</summary>

아니요. 다음이 존재하는 한 변경 사항은 유지됩니다 `필드를 YAML 파일에 추가합니다.` 디택션에 있습니다. PAT는 `필드를 YAML 파일에 추가합니다.` 를 사용해 사용자 지정의 기반이 되는 상위 소스 버전을 추적하므로, 수동으로 업데이트할 필요가 없습니다. 자세한 내용은 [Panther가 관리하는 디택션의 업데이트 받기](https://docs.panther.com/panther-developer-workflows/detections-repo/pat#getting-updates-of-panther-managed-detections) 를 참조하세요.

</details>

<details>

<summary>스키마 업로드와 테스트에 현재 권장되는 도구는 무엇인가요?</summary>

사용 `panther_analysis_tool update-custom-schemas` [를 사용해 커스텀 스키마를 생성하거나 업데이트하세요](https://docs.panther.com/panther-developer-workflows/detections-repo/pat/pat-commands#update-custom-schemas-creating-or-updating-custom-schemas). 로컬 스키마 테스트에는 [pantherlog 도구](https://docs.panther.com/panther-developer-workflows/pantherlog).

</details>

<details>

<summary>저는 <code>indexes/</code> 폴더가 저장소에 필요한가요?</summary>

아니요. 저장소에 `indexes/` 폴더를 포함하거나 유지할 필요는 없습니다. 이 폴더에는 각 로그 유형별로 어떤 Panther가 관리하는 디택션이 존재하는지, 그리고 무엇을 디택션하는지에 대한 사람이 읽을 수 있는 참고 문서가 들어 있습니다. 언제든지 다음에서 찾아볼 수 있습니다 [공개 panther-analysis 저장소](https://github.com/panther-labs/panther-analysis/tree/main/indexes).

</details>

<details>

<summary>PAT를 통해 업로드할 때 저장된 쿼리는 이름 기준으로 서로 덮어쓰나요?</summary>

네. 쿼리 이름은 고유 식별자로 작동합니다. 같은 이름의 쿼리를 업로드하면 업데이트됩니다. 사용하세요 `--query-id` 와 함께 `pat delete` 저장소에서 쿼리를 관리하려면.

</details>


---

# 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/panther/detections-repo/pat/pat-commands.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.
