# 정책

## 개요

정책은 잘못 구성된 클라우드 인프라를 식별하고 팀에 알러트를 생성하는 데 사용됩니다. Panther는 이미 작성되어 지속적으로 업데이트되는 여러 [Panther-관리 정책](https://docs.panther.com/ko/detections/panther-managed).

정책은 [Python 디텍션](https://docs.panther.com/ko/detections/rules/python)로 작성될 수 있으며, 로는 작성할 수 없습니다 [심플 디텍션](https://docs.panther.com/ko/detections/rules/writing-simple-detections).

정책에서의 일치(match)는 컴플라이언스 실패를 생성하지만, [신호](https://docs.panther.com/ko/detections/signals)는 아닙니다. 컴플라이언스 실패는 다음에서 확인할 수 있습니다:

* 안에 [panther\_monitor](https://docs.panther.com/ko/search/data-explorer)에서, `panther_cloudsecurity.public` 데이터베이스의 `compliance_history` 테이블
* 안에 [로그 소스가 구성된 후에는 수집된 데이터를 사용하여 검색할 수 있습니다](https://docs.panther.com/ko/search/search-tool)에서, **Could Security** 데이터베이스의 **컴플라이언스 히스토리** 테이블

## 정책 작성 방법

새 정책을 작성하기 전에 기존에 귀하의 요구를 충족하는 [Panther-관리 정책](https://docs.panther.com/ko/detections/panther-managed) 이 있는지 확인하는 것을 잊지 마십시오.

{% hint style="warning" %}
일반적으로 Panther의 디텍션 내에서 외부 API 요청을 하는 것은 강력히 권장되지 않습니다. 디텍션은 매우 큰 규모로 처리되며, API 요청은 수신 시스템에 과부하를 일으키고 귀하의 룰이 [15초 실행 시간 제한](https://docs.panther.com/ko/rules#rule-errors-and-scheduled-rule-errors).
{% endhint %}

### 정책 본문

정책 본문은 다음을 만족해야 합니다:

* 유효한 Python3이어야 합니다.
* 를 정의하십시오 `policy()` 하나의 `resource` 인수를 받는 함수.
  * 각 정책은 `resource` 지원되는 리소스 [에서 주어진 리소스 유형의 입력을 받습니다.](https://docs.panther.com/ko/cloud-scanning/cloud-resource-attributes) 페이지를 참조하세요.
* 을 반환하십시오 `bool` 정책 함수에서.

```python
def policy(resource):
  return True
```

Python 본문은 의 인수 이름을 명명해야 하며 `policy()` function `resource` 다음과 같은 작업을 수행할 수도 있습니다:

* 표준 Python3 라이브러리 임포트
* 사용자 정의에서 임포트 `aws_globals` 모듈
* Panther가 정의한 곳에서 임포트 `panther` 모듈
* 필요에 따라 추가 헬퍼 함수를 정의
* 룰 함수 범위 밖에서 변수 및 클래스 정의

의 스키마를 사용하면 [에서 주어진 리소스 유형의 입력을 받습니다.](https://docs.panther.com/ko/cloud-scanning/cloud-resource-attributes) 리소스에서 사용 가능한 모든 필드에 대한 세부 정보를 제공합니다. 최상위 키는 항상 존재하지만, `NoneType` 값을 포함할 수 있습니다.

### 로컬 및 Panther 콘솔에서 정책 작성하기

Panther 콘솔에서 정책을 작성하고 배포할 수 있으며, 로컬에서 작성한 후 [Panther 분석 도구(PAT)](https://docs.panther.com/ko/panther/detections-repo/pat) CLI 워크플로우:

{% tabs %}
{% tab title="콘솔" %}
**Panther 콘솔에서 정책 작성 방법**

1. Panther 콘솔의 왼쪽 탐색 창에서 **디텍션**.
2. 오른쪽 상단에서 **새로 만들기**.
3. 일반 구성 **정책** 타일에서 **에 대해 자세히 알아보세요**.
4. 생성 페이지에서 정책을 구성하세요:
   * **이름**: 정책에 대한 설명적인 이름을 입력하세요.
   * **ID** (선택 사항)**:** 펜 아이콘을 클릭하고 정책의 고유 ID를 입력하세요.
   * 오른쪽 상단 모서리에서 **사용** 토글은 기본적으로 `켜기` 로 설정됩니다. 정책을 비활성화하려면 토글을 `OFF`.
   * 일반 구성 **다음 리소스 유형에 대해** 이벤트 이름
     * **리소스 유형**: 이 정책이 적용되어야 하는 하나 이상의 리소스 유형을 선택하세요. 모두에 적용하려면 비워 두세요.
   * 일반 구성 **디텍트** 이벤트 이름
     * 일반 구성 **정책 함수** 텍스트 에디터에서 Python `정책` 함수를 작성하여 디텍션을 정의하세요.
       * 디텍션 템플릿과 예시는 [panther\_analysis GitHub 리포지토리](https://github.com/panther-labs/panther-analysis/tree/master/templates)
   * 일반 구성 **알러트 필드 설정** 이벤트 이름
     * **심각도**: 선택하세요 [심각도 수준](https://docs.panther.com/ko/rules#alert-severity) 이 디텍션으로 생성된 알러트에 대해.
     * 일반 구성 **선택적 필드** 섹션에서 선택적으로 다음 필드의 값을 제공하세요:
       * **설명**: 정책에 대한 추가 컨텍스트를 입력하세요.
       * **런북**: 이 정책과 관련된 절차 및 운영을 입력하세요.
         * 자세한 내용은 [알러트 런북](https://docs.panther.com/ko/alerts/alert-runbooks).
         * Panther AI 알러트 분류가 이를 고려하므로 설명적인 런북을 제공하는 것이 권장됩니다. [Panther AI 알러트 분류](https://docs.panther.com/ko/alerts#panther-ai-alert-triage) 이 고려에 반영됩니다.
       * **참조**: 이 룰과 관련된 자세한 정보로 연결되는 외부 링크를 입력하세요.
       * **대상 재정의:** 심각도와 관계없이 이 디텍션에 대한 알러트를 수신할 대상을 선택하세요. 대상은 룰 함수에서 동적으로 설정할 수도 있습니다. 라우팅 우선순위에 대해 자세히 알아보려면 [라우팅 순서 우선순위](https://docs.panther.com/ko/alerts/destinations#routing-order-precedence) 를 참조하세요.
       * **무시 패턴**: 무시할 패턴을 입력하세요.
       * **커스텀 태그**: 룰을 한눈에 이해하는 데 도움이 되는 커스텀 태그를 입력하세요(예: `HIPAA`.)
       * 일반 구성 **프레임워크 매핑** 이벤트 이름
         1. 를 선택하고 Panther가 설치된 계정 ID를 입력하십시오. **새로 추가** 리포트를 입력하려면를 클릭하세요.
         2. 다음 필드에 대한 값을 제공하세요:
            * **리포트 키**: 리포트와 관련된 키를 입력하세요.
            * **리포트 값**: 해당 리포트의 값을 입력하세요.
   * 일반 구성 **테스트** 이벤트 이름
     * 일반 구성 **유닛 테스트** 섹션에서, 클릭하여 **새로 추가** 에서 [테스트 생성](https://docs.panther.com/ko/detections/testing) 이전 단계에서 정의한 정책에 대한 테스트를 생성하세요.
5. 오른쪽 상단에서 **"Resource": "\<secret ARN>"**.
   {% endtab %}

{% tab title="CLI" %}
로컬 디텍션 파일을 GitHub 또는 GitLab 같은 버전 관리 시스템에서 관리하는 것을 권장합니다.

{% hint style="info" %}
Panther의 [오픈 소스 분석 리포지토리](https://github.com/panther-labs/panther-analysis)를 포크하는 것이 모범 사례이지만, 직접 새 리포지토리를 만들어도 됩니다.
{% endhint %}

**파일 설정**

각 디텍션은 다음으로 구성됩니다:

* Python 파일(확장자가 `.py` 인 파일)로, 디텍션/감사 로직을 포함합니다
* 메타데이터 속성을 포함하는 YAML 또는 JSON 명세 파일(확장자가 `업로더 명령은 기본 경로를 인수로 받아 확장자가 있는 모든 파일을 재귀적으로 검색합니다` 이전에 생성한 Snowflake 사용자 이름, 예를 들면 `.json` 인 파일).
  * 관례상 이 파일은 Python 파일과 같은 이름을 부여합니다.

**폴더 설정**

정책을 폴더로 그룹화하는 경우, 각 폴더 이름에는 업로드(콘솔의 PAT 또는 대량 업로더 사용) 중에 찾을 수 있도록 `정책` 을 포함해야 합니다.

정책을 로그/리소스 유형별로 폴더에 그룹화하는 것을 권장합니다. 예: `suricata_rules` 이전에 생성한 Snowflake 사용자 이름, 예를 들면 `aws_s3_policies`. 오픈 소스 [Panther Analysis](https://github.com/panther-labs/panther-analysis) 레포를 참조로 사용할 수 있습니다.

**로컬에서 정책 작성하기**

1. 정책을 작성하고 원하는 폴더에 다음 이름으로 저장하세요: `my_new_policy.py`:\
   def polcy(resource):

   ```
   def policy(resource):  
     return resource['Region'] != 'us-east-1'
   ```
2. 아래 템플릿을 사용하여 명세 파일을 생성하세요:

   ```
   AnalysisType: policy
   Enabled: true
   Filename: my_new_policy.py
   PolicyID: Category.Type.MoreInfo
   ResourceType:
     - Resource.Type.Here
   Severity: Info|Low|Medium|High|Critical
   DisplayName: 스펙 형식을 확인하는 예시 정책
   Tags:
     - Tags
     - Go
     - Here
   Runbook: 스펙 형식을 변경한 사람을 찾아보세요.
   Reference: https://www.link-to-info.io
   ```

전체 [Python 정책 명세 참조는 Writing Python Detections에서](https://docs.panther.com/ko/rules/python#python-policy-specification-reference) 필수 및 선택 필드의 전체 목록을 확인하세요.
{% endtab %}
{% endtabs %}

## 연관된 알러트의 제목

정책의 알러트 제목 설정 우선순위는 룰 및 스케줄된 룰과 동일합니다—자세한 내용은 [알러트 제목이 설정되는 방법](https://docs.panther.com/ko/rules#how-the-alert-title-is-set) 섹션의 명령을 실행하세요.

## 특정 클라우드 리소스 무시하기

정책을 구성하여 특정 클라우드 리소스를 예외로 만들 수 있으며, 이는 해당 리소스에 대해 정책이 실행되지 않고 알러트가 생성되지 않음을 의미합니다. 이를 "정책 억제(policy suppression)"라고 부르기도 합니다.

정책 억제를 구성하는 방법은 세 가지가 있습니다:

{% tabs %}
{% tab title="콘솔: 리소스 페이지" %}
{% hint style="warning" %}
정책 억제를 구성하는 경우, 이는 되돌릴 수 없습니다. [Panther 관리](https://docs.panther.com/ko/detections/panther-managed) 콘솔에서 리소스 페이지에서 정책 억제를
{% endhint %}

{% hint style="info" %}
추가할 수는 있지만, 나중에 제거해야 하는 경우에는 다른 두 가지 방법 중 하나로 정책을 편집해야 합니다. *추가* 리소스 페이지에서 정책 억제를 추가할 수 있지만, 나중에 제거하려면 다른 방법으로 정책을 편집해야 합니다.
{% endhint %}

Panther 콘솔의 리소스 페이지에서 리소스를 무시하도록 정책을 구성하려면:

1. Panther 콘솔의 왼쪽 탐색 창에서 **클라우드 리소스**.
2. 무시하려는 클라우드 리소스의 이름을 클릭하세요.
3. 일반 구성 **정책** 섹션에서 이 리소스에 적용되는 모든 정책을 포함하는 섹션에서, 리소스를 무시하도록 구성하려는 정책을 찾으세요.
4. 해당 행의 오른쪽에 있는 점 세 개 아이콘을 클릭한 다음, **무시**.
   * 이를 통해 정책이 편집되어 그 **무시 패턴** 필드에 붙여넣으세요.

<figure><img src="https://2400888838-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2Fgit-blob-0ef5b62541fd5ea724ed7707d27f6fe8a9af4f0c%2FScreenshot%202023-12-12%20at%201.20.06%E2%80%AFPM.png?alt=media" alt="A &#x22;Policies&#x22; section shows three policies in a table. Each policy has a status, severity, and a three dots icon."><figcaption></figcaption></figure>
{% endtab %}

{% tab title="콘솔: 정책 페이지" %}
Panther 콘솔의 정책 페이지에서 리소스를 무시하도록 정책을 구성하려면:

1. Panther 콘솔의 왼쪽 탐색 창에서 **빌드** > **디텍션**.
2. 억제를 구성하려는 정책의 이름을 클릭하세요.
3. 일반 구성 **알러트 필드 설정** 섹션에서, **선택적 필드** 드롭다운을 확장하세요.
4. 일반 구성 **무시 패턴** 필드에 무시하려는 리소스의 ARN을 입력하세요.
   * 와일드카드 패턴을 사용하여 유사한 ARN을 가진 여러 리소스를 무시할 수 있습니다. 예를 들어 제목이 로 시작하는 모든 S3 버킷을 제외하려면, `panther` 다음과 같이 입력할 수 있습니다 `arn:aws:s3:::panther*`.

<figure><img src="https://2400888838-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2Fgit-blob-e1078da32fad2ae5648a644c2aca7a956861e9b2%2FScreenshot%202023-12-12%20at%201.28.52%E2%80%AFPM.png?alt=media" alt="An &#x22;Ignore Patterns&#x22; field has a value of &#x22;arn:aws:s3:::panther*&#x22;"><figcaption></figcaption></figure>
{% endtab %}

{% tab title="CLI: 정책 구성" %}
로컬 파일 구성에서 정책이 특정 리소스를 무시하도록 구성하려면:

1. 정책의 YAML 파일을 여세요.
2. Suppressions라는 새 필드를 추가하세요, `Suppressions` 타입을 사용하여 `타임스탬프 값`.
   * 이 필드에 대해 자세히 알아보려면 [Python 정책 명세 참조](https://docs.panther.com/ko/rules/python#python-policy-specification-reference).
3. 에서 `Suppressions`를 참조하세요, 무시하려는 리소스 ARN을 목록으로 추가하세요.
   * 와일드카드 패턴을 사용하여 유사한 ARN을 가진 여러 리소스를 무시할 수 있습니다. 예를 들어 제목이 로 시작하는 모든 S3 버킷을 제외하려면, `panther` 다음과 같이 입력할 수 있습니다 `arn:aws:s3:::panther*`.

예:

```yaml
AnalysisType: policy
PolicyID: AWS.S3.CustomPolicy.Example
...
Suppressions:
  - "arn:aws:s3:::test-bucket"
  - "arn:aws:s3:::panther*"
```

{% endtab %}
{% endtabs %}

## 정책 작성 모범 사례

### 테스트 리소스 구성

수동으로 테스트 케이스를 구축하면 사람의 실수가 발생하기 쉽습니다. 다음 방법 중 하나를 권장합니다:

* 옵션 1: Panther 콘솔에서 다음으로 이동하세요, **탐색 > 클라우드 리소스**테스트에서 에뮬레이트하려는 리소스 유형의 필터를 적용하세요. 환경에서 리소스를 선택하고, `속성` 카드에서 단어 옆의 복사 버튼을 선택하여 해당 리소스의 전체 JSON 표현을 복사할 수 있습니다: `root`.
* 옵션 2: Panther의 [리소스 문서](https://docs.panther.com/ko/cloud-scanning/cloud-resource-attributes)를 열고 에뮬레이트하려는 리소스 섹션으로 이동하세요. 제공된 예시 리소스를 복사하세요. 웹 UI에서 작업 중이라면 리소스 편집기에 붙여넣고, 로컬에서 작업 중이라면 `리소스` 필드에 붙여넣으세요. 이제 정책 및 특정 테스트 케이스와 관련된 필드를 수동으로 수정할 수 있습니다.

실용적일 때는 옵션 1이 가장 좋습니다. 이는 정책에 대한 실제 테스트 데이터를 제공할 수 있기 때문입니다. 또한 일반적으로 문제가 되는 리소스 때문에 정책을 작성/수정하는 경우가 많습니다. 해당 리소스의 정확한 JSON 표현을 테스트 케이스로 사용하면 향후 유사한 리소스가 정책에 의해 포착되는 것을 보장할 수 있습니다.

### 예외 디버깅

정책을 실행하는 Python 환경에 직접 접근할 수 없기 때문에 예외 디버깅은 어려울 수 있습니다.

특정 리소스에서 정책이 `오류` 상태를 표시하는 경우, 이는 정책이 예외를 발생시켰음을 의미합니다. 이러한 오류를 해결하는 가장 좋은 방법은 위의 [**테스트 리소스 구성**](#constructing-test-resources) 섹션의 옵션 1을 사용하여 예외를 발생시키는 리소스에서 테스트 케이스를 생성하는 것입니다.

이 테스트 케이스를 로컬 또는 Panther 콘솔에서 실행하면 문제에 대한 더 많은 컨텍스트를 제공하고, 환경의 모든 리소스에 대해 정책을 실행하지 않고도 예외를 디버그하도록 정책을 수정할 수 있습니다.

{% hint style="warning" %}
참고: Python 코드에서 `stdout` 이전에 생성한 Snowflake 사용자 이름, 예를 들면 `stderr` 로 출력된 모든 내용은 CloudWatch에 기록됩니다. SaaS/CPaaS 고객의 경우 Panther 엔지니어는 정기적인 애플리케이션 모니터링 중에 이러한 CloudWatch 로그를 확인할 수 있습니다.
{% endhint %}

## 정책 예시

### S3 공개 읽기 접근

아래 예시에서 정책은 S3 버킷이 공개 읽기 접근을 허용하는지 확인합니다:

```python
# 공개 접근을 나타내는 그랜티들의 목록
GRANTEES = {
    'http://acs.amazonaws.com/groups/global/AuthenticatedUsers',
    'http://acs.amazonaws.com/groups/global/AllUsers'
}
PERMISSIONS = {'READ'}


def policy(resource):
    for grant in resource['Grants']:
        if grant['Grantee']['URI'] in GRANTEES and grant[
                'Permission'] in PERMISSIONS:
            return False

    return True
```

### IAM 비밀번호 정책

이 예시 정책은 비밀번호 정책이 최대 비밀번호 유효 기간을 강제하지 않을 때 알러트를 생성합니다:

```python
def policy(resource):
    if resource['MaxPasswordAge'] is None:
        return False
    return resource['MaxPasswordAge'] <= 90
```

일반 구성 `policy()` 본문에서, `True` 를 반환하면 리소스가 규정 준수 상태이며 알러트를 보내지 않아야 함을 나타냅니다. `False` 를 반환하면 리소스가 비준수 상태임을 나타냅니다.

이 정책은 다음과 같은 [IAM 비밀번호 정책](https://docs.panther.com/ko/cloud-scanning/cloud-resource-attributes/aws/password-policy) 리소스에 기반합니다:

```javascript
{
    "AccountId": "123456789012",
    "AllowUsersToChangePassword": true,
    "AnyExist": true,
    "ExpirePasswords": true,
    "HardExpiry": null,
    "MaxPasswordAge": 90,
    "MinimumPasswordLength": 14,
    "Name": "AWS.PasswordPolicy",
    "PasswordReusePrevention": 24,
    "Region": "global",
    "RequireLowercaseCharacters": true,
    "RequireNumbers": true,
    "RequireSymbols": true,
    "RequireUppercaseCharacters": true,
    "ResourceId": "123456789012::AWS.PasswordPolicy",
    "ResourceType": "AWS.PasswordPolicy",
    "Tags": null,
    "TimeCreated": null
}
```

## 참조

* 전체 [Python 정책 명세 참조는 Writing Python Detections에서](https://docs.panther.com/ko/rules/python#python-policy-specification-reference).
