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

# Panther 분석 도구 명령

## 개요

Panther 디택션 콘텐츠를 Panther Analysis Tool (PAT)을 사용하여 관리할 수 있습니다. PAT를 사용하면 [업로드](#upload-uploading-packages-to-panther-directly), [test](#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                    analysis 사양을 검증하고 정책 및 룰 테스트를 실행합니다.                                             │
│ 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 Item과 같은 ID를 가지며 BaseVersion 필드가 있는 항목은      │
│                         최신 Panther Analysis Item과 병합됩니다. 병합 충돌이 있는 항목은 건너뛰고         │
│                         수동으로 `merge` 명령으로 해결해야 합니다. 모든 병합 충돌을         │
│                         건너뛰지 않고 각 파일에 기록하려면 --write-merge-conflicts 플래그를 사용하세요.                                               │
│ install                 Panther Analysis의 analysis item을 로컬 저장소에 설치하고 활성화합니다.                         │
│ explore                 최신 Panther Analysis 콘텐츠를 살펴봅니다                                                                 │
│ merge                   analysis item을 최신 Panther Analysis 콘텐츠와 병합합니다                                      │
│ migrate                 BaseVersion 필드를 추가하고 최신 상태로 맞춰 Panther Analysis 콘텐츠를 기반으로 한 모든 analysis item을 마이그레이션합니다.    │
│                         최신 상태로 맞춰 Panther Analysis 콘텐츠를 기반으로 한 모든 analysis item을 마이그레이션합니다.                                                                                    │
│ fmt                     현재 디렉터리의 코드를 서식 지정하고 표준화하여 다른          │
│                         명령에서 변경 사항을 줄이는 데 도움을 줍니다.                                                                                                   │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
```

### `init`: Panther 디렉터리를 준비하는 중

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

작업은 다음과 같습니다:

* 다음을 생성합니다: `.gitignore` 필요한 경우 파일을 만들고 그 안에 추가합니다:
* 활성화합니다: `git rerere`
* 다음을 생성합니다: `.cache` 디렉터리. 이 디렉터리는 다음의 콘텐츠를 로컬에 저장합니다: `panther-analysis` 빠르게 로드하기 위해
  * 다음에서 최신 콘텐츠를 가져옵니다: `panther-analysis`

### `migrate`: 기존 관리 흐름에서 콘텐츠를 전환하는 중

`migrate` PAT가 기존 analysis item을 향후 업데이트를 위해 추적하기 시작하도록 합니다.

실행하면 `pat migrate` PAT가 저장소를 확인하고 다음을 수행합니다:

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

      <div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><p>참고: <code>pat migrate &#x3C;ID></code> 는 아직 마이그레이션 중일 때 병합 충돌을 해결하는 데 사용됩니다. 다음 중 병합 충돌이 발생한 항목은 <code>pat migrate</code> 아직 마이그레이션되지 않았습니다. 이는 다음과 매우 유사합니다: <code>pat merge &#x3C;ID></code>, 다음을 실행한 후 병합 충돌을 해결하는 데 사용됩니다: <code>pat update</code>. <code>merge</code> 명령은 마이그레이션 단계에서 사용해서는 안 됩니다.</p></div>
* ID가 다음의 ID와 일치하지 않는 각 analysis item에 대해 `panther-analysis`일치하지 않으면 사용자 지정으로 간주되므로 해당 항목에는 변경이 없습니다.

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

### `update`: 최신 panther-analysis 콘텐츠를 가져와 병합하는 중

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

이 명령은 최신 `panther-analysis` 콘텐츠를 가져와 자신의 콘텐츠에 병합합니다. PAT는 analysis item의 ID가 다음의 항목 ID와 같고 `panther-analysis` 그리고 다음이 `BaseVersion` 이 `panther-analysis`가 다음의 항목 최신 버전보다 낮은지 확인하여 항목을 업데이트해야 하는지 판단합니다. 항목이 다음의 항목과 같은 ID를 가지지만 `panther-analysis` 없다면 `BaseVersion` 필드가 있으면 업데이트를 받지 않습니다. 마찬가지로 항목에 다음에서 일치하는 ID가 없고 `panther-analysis` 하지만 `BaseVersion` 필드가 있으면 업데이트를 받지 않습니다.

병합 충돌이 있는 항목은 다음의 일부로 업데이트되지 않습니다: `pat update`이며, 다음을 사용해 수동으로 해결해야 합니다: `merge` 명령. 병합 충돌이 있었던 모든 항목의 목록은 다음 명령의 출력에 표시됩니다: `update` 명령.

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

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

다음 `--preview` 플래그를 사용하면 업데이트를 드라이런으로 실행합니다. 이 플래그는 어떤 파일도 업데이트하지 않고, 업데이트될 항목과 병합 충돌이 있는 항목의 ID를 출력합니다.

### `explore`: 사용 가능한 `panther-analysis` 콘텐츠 보기

다음을 실행하세요: `pat explore` 다음의 `panther-analysis` 콘텐츠를 `.cache` 디렉터리에서 확인합니다. (이 명령은 p-a 콘텐츠가 최신 p-a 릴리스보다 오래되었으면 새 p-a 콘텐츠를 가져옵니다.) 콘텐츠 ID, 유형 또는 설명으로 검색할 수 있습니다.

다음에 액세스할 수 있습니다: **Analysis Content** 트리를 다음을 사용하여 `탭`. 다음을 누르세요: `enter` 를 아무 analysis type에서나 눌러 해당 유형으로 필터링하세요. 다음을 누르세요: `enter` 를 단일 analysis ID에서 눌러 해당 ID로 필터링하세요.

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

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

다음을 누르면 `enter` 특정 항목에서 누르면 해당 소스 코드를 엽니다. YAML 및 Python 파일이 있는 analysis type의 경우 두 파일이 나란히 표시됩니다.

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

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

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

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

### `install`: 다음의 항목을 복사하고 활성화합니다: `panther-analysis` item

다음을 실행하세요: `pat install` 다음에서 항목을 복사합니다: `panther-analysis` 자신의 저장소로. (무엇을 설치할지 이해하려면 다음을 실행하는 것이 좋습니다: `pat explore`.)

종속성(예: 글로벌 헬퍼 또는 데이터 모델)이 있는 analysis item을 설치하면 해당 종속성도 함께 설치(자신의 저장소에 복제)됩니다.

### `fmt`: 코드를 서식 지정하고 표준화합니다

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

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

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

### `merge`: analysis item을 해당 항목의 최신 Panther Analysis 버전과 병합합니다

{% hint style="info" %}
`pat merge <ID>` 는 다음 이후의 병합 충돌을 해결하는 데 사용됩니다: `pat update`. 아직 코드를 마이그레이션 중이라면 다음을 사용하세요: `pat migrate <ID>` 병합 충돌이 있는 항목을 마이그레이션합니다.
{% endhint %}

다음을 실행한 후 `pat update`, analysis item이 깔끔하게 업데이트되지 않도록 하는 병합 충돌이 발생할 수 있습니다. 항목을 Panther Analysis의 최신 버전과 병합하고 병합 충돌을 해결하려면 다음을 실행하세요: `pat merge <ID>`, 다음과 같이: `ID` 는 병합 충돌을 해결하려는 analysis item의 ID입니다.

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

YAML 충돌을 해결한 뒤에는 이 명령이 Python 병합 충돌을 해결하도록 합니다. 기본적으로 이는 다음에서 수행됩니다: `vi`. 다음을 제공하여 사용할 다른 편집기를 지정할 수 있습니다: `--editor` 플래그를 사용하거나 다음을 설정하여 `EDITOR` 환경 변수를 설정하세요. 편집기는 사용하려면 CLI 명령으로 사용할 수 있어야 합니다. 일부 편집기는 기본적으로 CLI 명령이 설치되지 않으므로, 선호하는 편집기를 CLI에서 사용할 수 있는지 확인하세요.

병합 충돌을 성공적으로 해결한 후, 이 명령은 다음을 업데이트합니다: `BaseVersion` YAML의 필드를 자동으로.

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

* `--auto-accept`: 다른 명령과 동일하게 작동합니다. 다음 값을 허용합니다: `yours` 또는 `panthers` 를 값으로 허용합니다. 병합의 한쪽을 자동으로 선택해 병합 충돌을 피합니다.
* `--write-merge-conflicts`: 해결되지 않은 모든 병합 충돌을 해당 파일에 기록합니다. 이렇게 해도 어떤 충돌도 해결되지 않으며 공백 YAML 충돌도 피할 수 없습니다. `BaseVersion` 가 업데이트됩니다.

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

정의된 사양 파일을 로드하고 로컬에서 단위 테스트를 평가하려면 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 test` 에 대해 [상관 관계 규칙](/ko/detections/correlation-rules.md) 및 [Simple 디택션](/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"
```

print 문을 확인하세요:

```bash
INFO: /panther-analysis/rules/debug의 분석 항목을 테스트하는 중
Debug.RuleThatPrints
안녕하세요, 세상!
```

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

```bash
INFO: /panther-analysis/rules/debug의 분석 항목을 테스트하는 중
Debug.RuleWithError
ERROR: 디버그 추적용 테스트 예외
  파일 "/panther-analysis/룰들/debug/룰_with_error.py", 4번째 줄, 룰에서
    sub_func()
  파일 "/panther-analysis/룰들/debug/룰_with_error.py", 7번째 줄, sub_func에서
    raise ValueError('디버그 추적용 테스트 예외')
```

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

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

이 명령과 함께 사용하는 API 토큰에는 "개요 보기"(다른 이름으로는 `요약읽기`) 및 "룰 관리"(다른 이름으로는 `룰수정`) 권한. 왜냐하면 `벤치마크` 의 확장입니다 [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`: Enrichment 콘텐츠로 테스트 데이터 보강

사용 `enrich-test-data` 연결된 [풍부화 제공자](/ko/enrichment.md) 및 사용자 지정 [Lookup Tables](/ko/enrichment/custom.md). 이를 통해 풍부화 콘텐츠에 의존하는 디택션을 위한 더 정교한 테스트 사례를 만들 수 있습니다.

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

* 룰 또는 예약 룰에 테스트 사례가 없으면 YAML 파일은 수정되지 않습니다.
* 로그 유형이 풍부화를 지원하지 않으면 YAML 파일은 수정되지 않습니다.
* 로그 유형이 풍부화를 지원하고 테스트 사례가 있으면:
  * 인라인 JSON 콘텐츠로 표시된 테스트 사례는 YAML로 다시 형식이 지정됩니다.
  * YAML 파일은 일반적인 YAML 규칙에 따라 들여쓰기에 두 개의 공백을 사용하여 형식이 지정됩니다.

다른 명령과 마찬가지로, `enrich-test-data` 현재 디렉터리에서 재귀적으로 동작합니다. 여러분의 `panther-analysis` 복사본의 루트 디렉터리에서 명령을 실행하면 모든 룰 및 예약 룰의 풍부화를 시도합니다. 단일 디렉터리의 콘텐츠를 풍부화하려면 명령을 실행하기 전에 해당 디렉터리로 이동하세요.

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

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

명령의 출력은 표준 출력(stdout)에 기록되며, 풍부화된 룰 또는 예약 룰의 목록을 포함합니다.

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

해당 `검증` 명령은 업로드 과정에서 수행되는 것과 동일한 검사를 실행하여 여러분의 디택션 콘텐츠가 Panther 인스턴스에 업로드될 준비가 되었는지 확인합니다. 이러한 검사 중 일부는 Panther 인스턴스의 구성 정보를 필요로 하므로, `검증` 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) 다른 방식으로, 즉 환경 변수나 구성 파일을 사용하는 경우.

### `압축`: Panther Console에 업로드할 패키지 생성

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

```
$ panther_analysis_tool zip --path tests/fixtures/valid_policies/ --out tmp
[INFO]: tests/fixtures/valid_policies/에서 분석 팩을 테스트하는 중

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

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

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

1. Panther Console의 왼쪽에서 다음을 클릭하세요: **디택션**.
2. 다음 **업로드** 오른쪽 상단 모서리의 버튼.
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 Table이 덮어써집니다. 로컬에서 삭제된 디택션은 업로드 시 Panther 인스턴스에서 자동으로 삭제되지 않습니다. 해당 항목은 다음 명령으로 제거해야 합니다. [`삭제`](#delete-deleting-rules-policies-or-saved-queries) 명령(또는 Panther Console에서 수동으로 삭제). CLI 워크플로를 사용할 때는 디택션의 `사용` 속성을 다음으로 `false`설정하는 것이 좋습니다.

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

#### 해당 `작성자` 디택션 필드

기본적으로 CLI 워크플로에서 업로드된 디택션(즉, 다음을 사용한 경우 [PAT](#upload-uploading-packages-to-panther-directly) 또는 다음 [REST API](/ko/panther/api/rest.md)을 통해) 는 다음에 표시됩니다. **디택션** Panther Console의 목록 페이지에 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>

다음을 사용자 지정하고 싶다면 **작성자** 값을 사용자 지정하려면 다음을 추가할 수 있습니다. `작성자` 키를 디택션의 YAML 파일에 추가할 수 있습니다. 다음 값은 `작성자` 다음 중 하나일 수 있습니다:

* Panther 사용자의 이메일 주소: Console에서 Created By 필드에 연결된 사용자가 표시됩니다.
* Panther 사용자의 고유 ID: Console에서 Created By 필드에 연결된 사용자가 표시됩니다.
  * 이 값은 다음을 사용해 조회할 수 있습니다. [list users 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>

해당 `작성자` 키는 Python 룰, 예약된 룰, 상관 룰, 단순 디택션, 그리고 정책 정의에 사용할 수 있습니다.

Panther Console에서 디택션을 다운로드하면:

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

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

동안 `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 %}

## 명령별로 필요한 권한

다음은 각 명령에 필요한 권한 매핑입니다. 다음을 참조하세요. [Console과 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>test</code> (다음을 사용하는 디택션을 테스트할 때 <a href="https://docs.panther.com/detections/rules/inline-filters">인라인 필터</a>)</td><td><code>BulkUpload</code> OR <code>BulkUploadValidate</code> OR <code>ViewRules</code></td></tr><tr><td><code>벤치마크</code></td><td><code>요약읽기</code>, <code>RuleRead</code>, <code>룰수정</code></td></tr><tr><td><code>검증</code></td><td><code>BulkUpload</code> OR <code>BulkUploadValidate</code> (추가로 <code>ManageScheduledPrompts</code>, 그리고 <code>AIRunAsModify</code> 교차 ID run-as의 경우, 콘텐츠에 다음이 포함되면 <a href="/pages/663a8dd4afe4187f29591ec5c2a06af6e3efb1fc">예약된 프롬프트</a>)</td></tr><tr><td><code>업로드</code></td><td><code>BulkUpload</code> (추가로 <code>ManageScheduledPrompts</code>, 그리고 <code>AIRunAsModify</code> 교차 ID run-as의 경우, 콘텐츠에 다음이 포함되면 <a href="/pages/663a8dd4afe4187f29591ec5c2a06af6e3efb1fc">예약된 프롬프트</a>)</td></tr><tr><td><code>삭제</code></td><td><code>PolicyModify</code>, <code>룰수정</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>룰수정</code></td></tr><tr><td><code>압축</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   
usage: 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 함수가 반환할 수 있는 destination 이름입니다. 하나 이상의 이름을 정의하려면 인수를 반복합니다.
  --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 명령 필터링

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

예를 들어, 다음 명령은 다음을 가진 항목만 테스트합니다. `분석 유형` policy와 다음을 모두 `심각도` High인 항목:

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

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

다음 명령은 다음을 가진 항목을 테스트합니다. `분석 유형` policy 또는 룰, 그리고 다음을 `심각도` High인 항목:

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

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

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

다음에 참조하는 policy나 룰을 작성할 때 `global` 분석 유형을 필터에 반드시 포함하세요. 필터 값으로 빈 문자열을 넣을 수도 있으며, 이 경우 필드가 존재할 때만 필터가 적용된다는 뜻입니다.

문제의 policy는 global을 가져오지만 그 global에는 severity가 없으므로 필터에서 제외되어, 다음 명령은 오류를 반환합니다:

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

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의 analysis pack을 테스트하는 중

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

필터는 다음에도 적용됩니다 `압축`, `업로드`, 그리고 `릴리스` 명령에서도 동일하게 작동합니다. `test` 명령.

### `--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의 analysis pack을 테스트하는 중

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>upstream에서 디택션을 업데이트한 후, PAT가 내 변경 사항을 인식하도록 별도로 해야 할 일이 있나요?</summary>

아니요. 다음이 있는 한 변경 사항은 유지됩니다. `BaseVersion` 이 디택션에 있습니다. PAT는 다음을 사용합니다. `BaseVersion` 사용자 지정이 기반으로 하는 upstream 버전을 추적하므로, 수동으로 업데이트할 필요가 없습니다. 다음을 참조하세요. [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/` 폴더를 repo에. 이 폴더에는 각 로그 유형에 어떤 Panther가 관리하는 디택션이 있는지와 무엇을 디택션하는지 나열한 사람이 읽을 수 있는 참고 문서가 들어 있습니다. 언제든지 다음에서 확인할 수 있습니다. [공개 panther-analysis repo](https://github.com/panther-labs/panther-analysis/tree/main/indexes).

</details>

<details>

<summary>저장된 쿼리는 PAT를 통해 업로드할 때 이름이 같으면 자신을 덮어쓰나요?</summary>

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

</details>


---

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