Python 디택션 작성하기

콘솔 또는 CLI 워크플로우에서 Python 디택션 구성하기

개요

Panther 콘솔 또는 로컬에서 다음을 따라 자체 Python 디택션을 작성할 수 있습니다 CLI 워크플로우. Python 디택션을 작성할 때는 이 모범 사례를 참고하고 기억하세요 특정 알러트 필드는 동적으로 설정될 수 있습니다. Python으로 작성된 룰은 디텍션 도출.

대신 노코드 디텍션 빌더 를 사용하여 콘솔에서 룰을 생성하거나 로컬에서 Simple Detections로 작성. 로컬에 Simple Detections로 작성할지 Python 디텍션으로 작성할지 확실하지 않은 경우, Python 대 Simple Detections YAML 사용 섹션을 참조하세요.

circle-info

새 Python 디텍션을 작성하기 전에, Panther 관리 디텍션 이 필요한 항목을 충족하는지(또는 거의 필요를 충족하는지—Panther 관리 룰은 인라인 필터)로 조정할 수 있습니다. Panther 관리 디텍션을 활용하면 직접 작성하는 수고를 덜 수 있을 뿐만 아니라 Panther가 새 버전을 출시할 때 핵심 디텍션 로직에 대한 지속적인 업데이트라는 지속적 이점을 제공합니다.

circle-exclamation

Python에서 디텍션을 생성하는 방법

Python에서 룰을 생성하는 방법

Panther 콘솔과 CLI 워크플로우 모두에서 Python 룰을 작성할 수 있습니다.

chevron-right콘솔에서 Python으로 룰 생성하기hashtag
  1. Panther 콘솔의 왼쪽 탐색 바에서, 디텍션.

  2. 을 클릭하세요 새로 만들기.

  3. 에서 Python 룰 타일에서, 시작.

  4. 생성 페이지에서 룰을 구성하세요:

    • 이름: 룰에 대한 설명적인 이름을 입력하세요.

    • ID (선택 사항): 펜 아이콘을 클릭하고 룰에 대한 고유 ID를 입력하세요.

    • 오른쪽 상단에서, 활성화됨 토글은 켜짐 으로 기본 설정됩니다. 룰을 비활성화하려면 토글을 .

    • 으로 전환하세요. 다음 소스에 대해 섹션:

      • 로그 유형: 이 룰이 적용될 로그 유형들을 선택하세요.

    • 으로 전환하세요. 디텍트 섹션:

    • 으로 전환하세요. 알러트 생성 섹션에서, 알러트 생성 ON/OFF 토글을 설정하세요. 이는 매치가 있을 때 알러트 를 생성할지 아니면 단지 시그널만 생성할지를 나타냅니다. 이 토글을 켜짐:

      • 심각도: 알러트의 심각도 수준 을 선택하세요.

      • 으로 전환하세요. 선택적 필드 섹션에서 선택적으로 다음 필드에 값을 제공하세요:

        • 설명: 룰에 대한 추가 컨텍스트를 입력하세요.

        • 런북: 이 룰과 관련된 절차 및 운영을 입력하세요.

        • 참고: 이 룰과 관련된 추가 정보의 외부 링크를 입력하세요.

        • 대상 재정의: 심각도와 관계없이 이 디텍션에 대한 알러트를 수신할 대상을 선택하세요. 대상은 룰 함수 내에서 동적으로 설정될 수도 있습니다. 라우팅 우선순위에 대해 자세히 알아보려면 라우팅 순서 우선순위 를 참조하세요.

        • 중복 제거 기간이벤트 임계값: 룰 매치에 대한 중복 제거 기간과 임계값을 입력하세요. 중복 제거 작동 방식은 중복 제거.

        • 를 참조하세요.요약 속성

        • 알러트 할당 및 관리사용자 지정 태그 : 룰을 한눈에 이해하는 데 도움이 되는 사용자 지정 태그를 입력하세요(예:.)

        • 으로 전환하세요. HIPAA 섹션:

          1. 을 클릭하세요 프레임워크 매핑 새로 추가

          2. 를 클릭하여 리포트를 입력하세요.

            • 다음 필드에 값을 제공하세요:리포트 키

            • : 리포트와 관련된 키를 입력하세요.리포트 값

    • 으로 전환하세요. : 해당 리포트에 대한 값을 입력하세요. 섹션:

      • 으로 전환하세요. 테스트 단위 테스트 프레임워크 매핑 섹션에서, 을 클릭하여 이전 단계에서 정의한 룰에 대한 테스트를 생성하세요.

  5. 오른쪽 상단에서, 저장.

룰을 생성한 후에는 인라인 필터.

chevron-right룰을 Python으로 CLI 워크플로우에서 생성하기hashtag

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

맞춤 디텍션 콘텐츠는 다음을 생성하여 시작하는 것이 좋습니다: 공개 포크arrow-up-right 또는 비공개 복제된 리포지토리arrow-up-right 를 Panther의 오픈 소스 panther-analysis 리포지토리arrow-up-right.

에서부터 복제하세요.

폴더 설정 규칙을 폴더로 그룹화하는 경우, 각 폴더 이름에는 rules

가 포함되어야 업로드(콘솔의 PAT 또는 대량 업로더 사용 시) 중에 찾아집니다. 로그/리소스 유형을 기반으로 룰을 폴더로 그룹화하는 것이 좋습니다. 예: suricata_rules 또는aws_s3_policies 와 같은. 참조용으로arrow-up-right panther-analysis

리포를 사용할 수 있습니다.

파일 설정

  • 각 룰 및 예약 룰은 다음으로 구성됩니다: Python 파일(확장자가 .py

  • 인 파일)으로 디텍션 로직을 포함합니다. YAML 사양 파일(확장자가 .yml

    • 인 파일)로 디텍션의 메타데이터 속성을 포함합니다.

관례상 이 파일은 Python 파일과 동일한 이름을 부여합니다. 룰은 의심스러운 동작을 탐지하는 Python 함수입니다. True

  1. 를 반환하면 의심스러운 활동을 나타내며 이는 알러트를 트리거합니다. 룰을 작성하고 원하는 폴더에:

    my_new_rule.py  
      로 저장하세요.
  2. def rule(event):

    return 'prod' in event.get('hostName')
    아래 템플릿을 사용하여 메타데이터 파일을 생성하세요:
    AnalysisType: rule
    DedupPeriodMinutes: 60 # 1시간
    DisplayName: 스펙 형식을 확인하는 예제 룰
    Enabled: true
    Filename: my_new_rule.py
    RuleID: Type.Behavior.MoreContext
      Severity: High
    LogTypes:
      - LogType.GoesHere
        Reports:
    ReportName (예: CIS, MITRE ATT&CK):
      - 이 룰과 관련된 특정 보고서 섹션
      Tags:
      - 태그들
    - 여기에
      - 넣으세요
    Description: >
      이 룰은 Panther CLI의 CLI 워크플로우를 검증하기 위해 존재합니다
    Runbook: >

먼저 이 스펙 형식을 누가 작성했는지 확인한 다음 피드백으로 통지하세요. Reference: https://www.a-clickable-link-to-more-info.com 이 룰이 업로드되면, 일반적으로 Panther 콘솔에서 채우는 각 필드가 자동으로 채워집니다. 전체 필수 및 선택 필드 목록은

룰 사양 참조

를 참조하세요.

chevron-rightPython에서 예약 룰을 생성하는 방법hashtag
  1. Panther 콘솔의 왼쪽 탐색 바에서, 디텍션.

  2. 을 클릭하세요 새로 만들기.

  3. 에서 Python으로 된 예약 룰은 Panther 콘솔과 CLI 워크플로우 모두에서 작성할 수 있습니다. 타일에서, 시작.

  4. 콘솔에서 Python으로 예약 룰 생성하기

    • 이름예약 룰

    • ID (선택 사항): 생성 페이지에서 예약 룰을 구성하세요:

    • 오른쪽 상단에서, 활성화됨 토글은 켜짐 : 예약 룰에 대한 설명적인 이름을 입력하세요. .

    • 으로 전환하세요. 펜 아이콘을 클릭하고 예약 룰에 대한 고유 ID를 입력하세요. 섹션:

      • 기본적으로. 예약 룰을 비활성화하려면 토글을다음 예약 쿼리에 대해 예약 쿼리 : 이 예약 룰이 적용될 하나 이상의

    • 으로 전환하세요. 디텍트 섹션:

      • 으로 전환하세요. 룰 함수 텍스트 편집기에 Python 함수를 작성하여 디텍션을 정의하세요.

    • 으로 전환하세요. 알러트 생성 섹션에서, 알러트 생성 ON/OFF 토글을 설정하세요. 이는 매치가 있을 때 알러트 를 생성할지 아니면 단지 시그널만 생성할지를 나타냅니다. 이 토글을 켜짐:

      • 심각도: 알러트의 심각도 수준 을 선택하세요.

      • 으로 전환하세요. 선택적 필드 섹션에서 선택적으로 다음 필드에 값을 제공하세요:

        • 설명: 룰에 대한 추가 컨텍스트를 입력하세요.

        • 런북: 이 룰과 관련된 절차 및 운영을 입력하세요.

        • 참고: 이 룰과 관련된 추가 정보의 외부 링크를 입력하세요.

        • 대상 재정의: 심각도와 관계없이 이 디텍션에 대한 알러트를 수신할 대상을 선택하세요. 대상은 룰 함수 내에서 동적으로 설정될 수도 있습니다. 라우팅 우선순위에 대해 자세히 알아보려면 라우팅 순서 우선순위 를 참조하세요.

        • 중복 제거 기간이벤트 임계값: 룰 매치에 대한 중복 제거 기간과 임계값을 입력하세요. 중복 제거 작동 방식은 중복 제거.

        • 를 참조하세요.요약 속성

        • 알러트 할당 및 관리사용자 지정 태그 : 룰을 한눈에 이해하는 데 도움이 되는 사용자 지정 태그를 입력하세요(예:.)

        • 으로 전환하세요. HIPAA 섹션:

          1. 을 클릭하세요 프레임워크 매핑 새로 추가

          2. 를 클릭하여 리포트를 입력하세요.

            • 다음 필드에 값을 제공하세요:리포트 키

            • : 리포트와 관련된 키를 입력하세요.리포트 값

    • 으로 전환하세요. : 해당 리포트에 대한 값을 입력하세요. 섹션:

      • 으로 전환하세요. 테스트 단위 테스트 프레임워크 매핑 섹션에서, 을 클릭하여 이전 단계에서 정의한 룰에 대한 테스트를 생성하세요.

  5. 오른쪽 상단에서, 저장.

    • 를 반환하도록 할 수 있습니다: 저장return True 을 선택하세요. 을 클릭하면 예약 룰이 활성화됩니다. 연결된

룰을 생성한 후에는 인라인 필터.

chevron-right(쿼리에 정의된 간격에 따라)에서 반환된 SQL이 반환된 행이 있는 경우 예약 룰을 통해 실행됩니다.hashtag

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

맞춤 디텍션 콘텐츠는 다음을 생성하여 시작하는 것이 좋습니다: 공개 포크arrow-up-right 또는 비공개 복제된 리포지토리arrow-up-right 를 Panther의 오픈 소스 panther-analysis 리포지토리arrow-up-right.

에서부터 복제하세요.

CLI 워크플로우에서 Python으로 예약 룰 생성하기 규칙을 폴더로 그룹화하는 경우, 각 폴더 이름에는 rules

가 포함되어야 업로드(콘솔의 PAT 또는 대량 업로더 사용 시) 중에 찾아집니다. 로그/리소스 유형을 기반으로 룰을 폴더로 그룹화하는 것이 좋습니다. 예: suricata_rules 또는aws_s3_policies 와 같은. 참조용으로arrow-up-right panther-analysis

리포를 사용할 수 있습니다.

룰을 폴더로 그룹화하는 경우, 각 폴더 이름에는 문자열

  • 각 룰 및 예약 룰은 다음으로 구성됩니다: Python 파일(확장자가 .py

  • 인 파일)으로 디텍션 로직을 포함합니다. YAML 사양 파일(확장자가 .yml

    • 인 파일)로 디텍션의 메타데이터 속성을 포함합니다.

가 포함되어야 합니다. 각 예약 룰은 다음으로 구성됩니다: 예약 룰을 통해 룰은 의심스러운 동작을 탐지하는 Python 함수입니다. True

  1. 예약 검색 의 출력을 Python으로 분석할 수 있습니다.:

  2. RateMinutes: 1 룰을 작성하고 원하는 폴더에:

  3. def rule(_): # 참고: 여기에 추가 로직을 추가할 수 있습니다:

Log: "JSON": "string" 이 룰이 업로드되면, 일반적으로 Panther 콘솔에서 채우는 각 필드가 자동으로 채워집니다. 전체 필수 및 선택 필드 목록은

이 예약 룰이 업로드되면 각 파일은 예약 쿼리와 룰을 연결하고 일반적으로 Panther 콘솔에서 채우는 필드들을 자동으로 채웁니다. 아래의

Python으로 정책을 생성하는 방법

정책 생성 방법은

정책 작성 방법 지침
을 참조하세요.
  • Python 디텍션 문법

  • Python 파일은 다음을 포함할 수 있습니다:

  • def runbook(event):

  • def description(event):

  • RuleID: # 또는 PolicyId:

OutputIds:

Reference: Runbook: SummaryAttributes: 기본 Python 룰 구조.

오직
rule()

Filename: rule.py RuleID: my.rulearrow-up-right.

- Some.Schema

Severity: INFO - Some.Schema 템플릿이 더 필요하면, GitHub의 panther-analysis 리포.

를 참조하세요.

InlineFilters Python 룰에서.

사용하는 방법에 대해 자세히 알아보세요 인라인 필터로 디텍션 수정하기 Python 디텍션의 알러트 함수 Panther의 디텍션 보조 함수들은 분석 로직, 생성된 알러트 제목, 이벤트 그룹화, 알러트 라우팅 및 메타데이터 재정의를 제어하는 Python 함수입니다. 룰은 사용자 정의 가능하며 표준 Python 라이브러리 또는 글로벌 헬퍼

에서 가져올 수 있습니다. 룰과 정책 모두에 적용되며, 아래 각 함수는event (룰) 또는 resource

(정책)의 단일 인수를 받습니다. 고급 사용자는 아래에 정의된 함수 외부에 함수, 변수 또는 클래스를 정의할 수 있습니다.

만약 당신이
설명
알러트 중복 제거
를 사용 중이라면, 디텍션과 매치되는

이벤트가 이러한 알러트 함수의 매개변수로 사용됩니다.

아래의 각 알러트 함수는 선택 사항이지만, 알러트에 동적 컨텍스트를 추가할 수 있습니다. 심각도 알러트 함수


기본값 심각도 반환 값

severity, 알러트의 긴급도 수준, YAML에서:, ,콘솔에서:필드 INFO

MEDIUM

아래의 각 알러트 함수는 선택 사항이지만, 알러트에 동적 컨텍스트를 추가할 수 있습니다. HIGH > CRITICAL suricata_rules , 또는


기본값 이름 DEFAULT ID 반환 값

title

DisplayName

RuleID PolicyID > HIGH > CRITICAL suricata_rules , 또는


기본값 PolicyID > 이름 DEFAULT ID 반환 값

title

문자열

dedup

title

고유 임계값 탐지를 추적하기 위한 값 권장되는 상세한 런북을 제공하는 것이 좋습니다, 왜냐하면 Panther AI 알러트 분류

아래의 각 알러트 함수는 선택 사항이지만, 알러트에 동적 컨텍스트를 추가할 수 있습니다. 런북 알러트 함수


기본값 런북 반환 값

title

alert_context

아래의 각 알러트 함수는 선택 사항이지만, 알러트에 동적 컨텍스트를 추가할 수 있습니다. 설명 알러트 함수


기본값 설명 반환 값

title

Dict[String: Any]

아래의 각 알러트 함수는 선택 사항이지만, 알러트에 동적 컨텍스트를 추가할 수 있습니다. 참고 알러트 함수


기본값 참고 반환 값

title

알러트가 생성되면 따를 지침 목록입니다. 상세한 런북을 제공하는 것이 권장됩니다, 왜냐하면

아래의 각 알러트 함수는 선택 사항이지만, 알러트에 동적 컨텍스트를 추가할 수 있습니다. description 알러트 함수


기본값 룰이 존재하는 이유에 대한 설명 반환 값

reference

첫 번째

룰에 대한 내부 문서나 온라인 자료의 참조 URL severity, 알러트의 긴급도 수준, YAML에서:, , 콘솔에서:필드 INFOdestinations INFO 알러트를 보낼 대상의 ID들.

OutputIds 대상 재정의 suricata_rules List[대상 이름/ID]일부 시나리오에서는 알러트의 심각도 수준을 업그레이드하거나 다운그레이드해야 할 수도 있습니다. 알러트의 심각도 수준은

에 매핑될 수 있습니다. 기본적으로 정적으로 정의된 룰 심각도로 되돌아가려면 severity 를 반환하세요.

DedupPeriodMinutes: defaultarrow-up-right

와 같이 반환할 수 있습니다, 스타일 선호도에 따라. INFO:

LOW

심각도 알러트가 생성되고—그렇지 않으면 PolicyID 수준 알러트가 생성됩니다:

if event.get('eventType') == 'system.api_token.create':

return "HIGH" return "INFO".

템플릿 룰

DedupPeriodMinutes: defaultarrow-up-right

생성된 알러트 제목

을 참조하세요. 생성된 알러트 제목 예:

# 통합 데이터 모델 필드를 제목에 사용 return "INFO".

템플릿 룰

DedupPeriodMinutes: AWS S3 버킷 삭제 룰arrow-up-right

필드 >

심각도 알러트가 생성되고—그렇지 않으면 unique() function은 고유 값 임계값 디택션을 활성화하여 규칙이 총 이벤트 수가 아닌 고유 값의 개수를 기준으로 알러트하도록 허용합니다. 이는 분산 공격, 데이터 유출 및 관리 남용 시나리오를 탐지하는 데 유용합니다.

예: 여러 사용자를 대상으로 한 로그인 무차별 대입 탐지:

임계값이 5인 경우, 이 룰은 중복 제거 기간 내에 실패한 로그인 시도가 5개 이상의 고유 사용자명을 대상으로 할 때 알러트합니다.

심각도 알러트가 생성되고—그렇지 않으면 unique() function은 항상 문자열을 반환해야 합니다. 다중 필드 고유성을 위해 필드를 연결(concatenate)하세요:

추가 예제를 포함한 고유 값 임계값 디택션에 대해 자세히 알아보려면 고유 값 임계값 디택션.

runbook

심각도 알러트가 생성되고—그렇지 않으면 destinations() function은 룰의 알러트가 전송되어야 하는 알러트 목적지(들)를 지정하는 방법입니다. 이는 다른 모든 알러트 목적지 구성보다 우선합니다(즉, 시나리오 1알러트 라우팅 시나리오).

심각도 알러트가 생성되고—그렇지 않으면 destinations() function은 하나 이상의 알러트 목적지 이름 또는 UUID의 리스트를 반환해야 합니다. 만약 destinations() function이 반환하는 리스트가 비어 있으면 ([]), 알러트는 어떤 목적지로도 라우팅되지 않습니다.

예를 들어, 아래 룰은 여러 로그 유형과 연관되어 있습니다. 만약 로그 유형이 AWS.CloudTrail, destinations() 이면 알러트를 slack-security-alerts 목적지로 라우팅합니다. 만약 로그 유형이 AWS.CloudTrail이 아니면 외부 목적지로 어떤 알러트도 전송되지 않습니다 — 이는 return [].

다른 예제는 panther-analysis example_rulearrow-up-right.

관련 이벤트를 그룹화하는 문자열로, 최대 1000자까지 허용됩니다

이 함수는 사용자 이름, IP 주소 또는 성공/실패와 같은 추가 컨텍스트로 검사 세부정보를 알러트 목적지에 전달할 수 있습니다.

알러트 컨텍스트 딕셔너리에 포함된 값은 JSON 호환이어야 합니다. 불호환 값의 예로는 Python의 nan, inf그리고 -inf.

템플릿 룰

아래 코드는 알러트 컨텍스트에 모든 이벤트 데이터를 반환합니다.

unique

심각도 알러트가 생성되고—그렇지 않으면 unique function 출력은 이 디택션으로 생성된 알러트를 분류(triage)하기 위한 실행 가능한 조사 단계를 제공해야 합니다.

When Panther AI가 알러트를 분류할 때이는 런북을 읽고 자율적으로 실행합니다. 효과적인 런북을 작성하는 방법에 대해 더 알아보려면 알러트 런북.

템플릿 룰

알러트 대상에 전달할 추가 컨텍스트해당 없음 - 표준 이벤트 수 임계값을 사용

심각도 알러트가 생성되고—그렇지 않으면 알러트 대상에 전달할 추가 컨텍스트해당 없음 - 표준 이벤트 수 임계값을 사용 functions는 알러트가 트리거된 이유와 관련 문제를 해결하는 방법에 대한 추가 컨텍스트를 제공할 수 있습니다.

아래 예제는 알러트 내의 알러트 대상에 전달할 추가 컨텍스트 필드에 동적으로 링크를 제공하는 방법을 보여줍니다:

이벤트 객체 함수

Python 디텍션에서 Runbook: function 및 모든 동적 알러트 함수들은 단일 인수인 인라인 필터로 디텍션 수정하기 객체를 인수로 받습니다. 이 이벤트 객체에는 이벤트 값을 간단히 추출할 수 있는 내장 함수들이 있습니다.

get()

상위 수준 이벤트 필드에 접근하려면 get() 를 사용하세요. 키를 찾을 수 없을 경우 반환될 기본값을 제공할 수 있습니다.

상위 수준 필드에 접근하는 다른 방법으로는 deep_get()deep_walk()가 있습니다. 더 알아보려면 아래에서 상위 수준 필드에 안전하게 접근하는 방법을 확인하세요.

템플릿 룰

deep_get()

상위 수준 이벤트 필드에 접근하려면 deep_get() Python 딕셔너리 내에 중첩된 키를 반환하려면 이 함수를 사용하세요.

만약 필요한 값이 리스트 내에 있다면 대신 deep_walk() 를 사용하세요.

circle-info

이 함수는 글로벌 헬퍼로도 제공되지만편의상 이 이벤트 객체 함수를 사용하는 것이 권장됩니다.

템플릿 룰

다음과 같은 구조의 이벤트가 주어졌을 때

deep_walk()

상위 수준 이벤트 필드에 접근하려면 deep_walk() 이 함수는 딕셔너리 내 깊이 중첩된 키들과 연관된 값을 반환합니다. 딕셔너리나 리스트가 여러 개 포함될 수 있습니다. 여러 이벤트 필드와 매치되면 매치들의 배열을 반환하고, 하나만 매치되면 해당 매치의 값을 반환합니다.

circle-info

이 함수는 글로벌 헬퍼로도 제공되지만편의상 이 이벤트 객체 함수를 사용하는 것이 권장됩니다.

템플릿 룰

lookup()

심각도 알러트가 생성되고—그렇지 않으면 lookup() function은 디텍션에서 커스텀 룩업 테이블arrow-up-rightPanther가 관리하는 보강 제공자 에서 데이터를 동적으로 접근할 수 있게 합니다. 만약 수신 로그가 룩업 테이블의 기본 키 열의 값과 정확히 일치하지 않는다면 lookup() function이 유용할 수 있습니다. Python을 사용해 이벤트 값을 수정한 후 lookup() 에 전달하여 보강 데이터를 가져올 수 있습니다.

lookup() 이 함수는 두 개의 인수를 받습니다:

  • 룩업 테이블의 이름

    • lookup_table_name으로 전달된 룩업 테이블 이름은 Panther 콘솔에 표시되는 그대로여야 합니다. lookup() 이 이름은 검색 쿼리에서 보이는 형태와 구문적으로 다를 수 있습니다. 예를 들어, Enrichment Providers suricata_rules Lookup Tables 페이지에 표시되는 이름은 검색 쿼리의 표현과 다를 수 있습니다. 예: My-Custom-LUT 대신 my_custom_lut.

  • 룩업 테이블의 기본 키

제공된 키에 대해 룩업 테이블에서 일치 항목이 발견되면 전체 룩업 테이블 행이 Python 딕셔너리로 반환됩니다. 일치하는 항목이 없으면 None 이 반환됩니다.

circle-info

lookup() 함수는 이벤트 필드의 값이 Selector로 지정되어 룩업 테이블의 기본 키 열 값과 정확히 일치할 때 발생하는 "자동" 이벤트 보강과는 다릅니다. 그 경우 룩업 테이블 데이터는 이벤트의 p_enrichment 필드에 추가됩니다. 자세한 내용은 커스텀 룩업 테이블의 로그와 룩업 테이블 간 데이터 매칭 방법.

을 참조하세요 deep_walk() 를 사용하세요.

와 같이 반환할 수 있습니다, 스타일 선호도에 따라. lookup():

if (lookup_data and lookup_data.get("role") != "admin") or lookup_data is None: lookup()

When 유닛 테스트에서 유닛 테스트 lookup() 가 실행될 때 는 실시간 데이터를 가져오지 않습니다. lookup 기능을 에뮬레이트하려면 각 유닛 테스트의 이벤트 페이로드에 _mocked_lookup_data_ 필드를 추가하여 룩업 테이블 데이터를 모킹하세요. 당신은 enrich test data 버튼이나 CLI 명령을 lookup().

는 실시간 데이터를 가져오지 않습니다. lookup 기능을 에뮬레이트하려면 각 유닛 테스트의 이벤트 페이로드에 와 함께 사용할 수 없습니다.

"[email protected]": {"id": "[email protected]", "role": "guest"} 는 실시간 데이터를 가져오지 않습니다. lookup 기능을 에뮬레이트하려면 각 유닛 테스트의 이벤트 페이로드에 유닛 테스트에 lookup() 필드를 지정하지 않으면, 를 호출하려는 시도는.

None/null

심각도 알러트가 생성되고—그렇지 않으면 None/null udm() def udm(self, *key: str, default: Any = None) -> Any:function은 주로

데이터 모델 None/null 에 접근하기 위해 의도되었지만 이벤트 필드에 접근하는 데에도 사용할 수 있습니다.

  1. 다음은 def udm(self, *key: str, default: Any = None) -> Any: function이 작동하는 방식입니다: None/null함수는 먼저 전달된 값에 대해

    • 키 매핑이 정의되어 있는지 확인합니다. 만약 있다면 데이터 모델의 값이 반환됩니다. def udm(self, *key: str, default: Any = None) -> Any: 만약 전달된 값에 대해 None/null키가 정의되어 있다면 함수는 그 값을 반환하고 아래의 2단계로 진행하지 않습니다. 이는 평가되는 이벤트가 데이터 모델 매핑에 정의된 키 경로를 포함하지 않더라도 적용됩니다 — 이 경우 null 이 반환됩니다.

  2. 만약 전달된 값에 대해 def udm(self, *key: str, default: Any = None) -> Any: 가 정의되어 있지 않다면, 함수는 해당 이름을 가진 이벤트 필드가 있는지 확인합니다. 있다면 그 값을 반환합니다. None/null이 경우,

    • 는 중첩된 필드를 포함한 모든 이벤트 필드를 확인합니다. 그 동작은 None/null 와 유사합니다. deep_get().

circle-info

위에 설명된 동작 때문에 동일한 키로 매핑된 None/null 가 정의되어 있는 경우에는 이벤트 필드 값을 접근하기 위해 def udm(self, *key: str, default: Any = None) -> Any: 만 사용할 수 없습니다.

와 같이 반환할 수 있습니다, 스타일 선호도에 따라. None/null 값: def udm(self, *key: str, default: Any = None) -> Any: 데이터 모델 예시

고유 값 임계값 디택션

서로 다른 IP 주소에서의 다중 로그인 시도

  • 여러 사용자명을 대상으로 한 무차별 대입 공격

  • 여러 외부 도메인으로의 데이터 유출

  • 여러 리소스에 영향을 미치는 관리 작업

  • function

심각도 알러트가 생성되고—그렇지 않으면 unique() 고유 값 임계값 디택션을 활성화하려면, 무엇을 고유로 셀지 나타내는 문자열 값을 반환하는

function을 Python 룰에 정의하세요. unique() def unique(event) -> str:

심각도 알러트가 생성되고—그렇지 않으면 unique() 예: 다중 IP 로그인 탐지

# 이것이 성공적인 로그인 이벤트인지 확인

# 실패한 로그인 시도를 확인

# 클라우드 스토리지에서의 파일 다운로드를 찾기

당신이

function을 정의하면: unique() 값 추출

  1. : 각 매칭된 이벤트에 대해 Panther는 추적할 고유 값을 추출하기 위해 당신의function을 호출합니다 unique() 확률적 카운팅

  2. : Panther는 관찰된 고유 값의 수를 추정하기 위해 메모리 효율적인 확률적 알고리즘을 사용합니다임계값 검사

  3. : 추정된 고유 개수가 구성된 임계값에 도달하면 알러트가 생성됩니다: 고유 개수는 룰의 중복 제거 기간에 따라 재설정됩니다

  4. 중복 제거구성 요구사항

고유 값 임계값을 사용하려면:

다음을 정의하세요:

  • 문자열을 반환하는 unique() function

  • 룰의 임계값(Threshold) 을 최소 트리거 고유 값 수로 설정하세요(기본값: 1)

  • 적절한 중복 제거 기간 중복 제거 기간(deduplication period)

을 사용 사례에 맞게 구성하세요(기본값: 1시간)

  • 성능 고려사항정확도

  • : 고유 카운팅 알고리즘은 최대 1,000개의 고유 값에 대해 약 90%의 정확도를 제공합니다메모리 효율성

  • : 고유 값 수와 상관없이 알러트당 약 16KB의 저장소를 사용합니다권장 한계

  • : 1,000개 미만의 고유 값 임계값에서 최상의 성능을 발휘합니다연결(Concatenation) unique() 값 추출 : 다중 필드 고유성의 경우, 당신의

return f"{ip}:{username}"

하위 호환성 unique() function이 없는 룰은 계속해서 표준 이벤트 수 임계값을 사용합니다. 기존 룰에 unique() function을 추가하거나 제거하면 알러팅 동작이 변경됩니다.

Python 모범 사례

Python Enhancement Proposals 는 Python 코드를 깔끔하고 효과적으로 작성하고 스타일링하는 방법에 대한 자료를 제공합니다. 예를 들어,arrow-up-right autopep8 을 사용하여 작성한 디텍션이 일관된 스타일을 따르도록 자동으로 보장할 수 있습니다.arrow-up-right 사용 가능한 Python 라이브러리

다음 Python 라이브러리들은 Panther에서 사용 가능하며,

boto3 외에도 제공됩니다. 이들은AWS Lambda 에서 제공됩니다arrow-up-right:

패키지

버전

설명

라이선스

jsonpath-ng

1.5.2

JSONPath 구현

Apache v2

policyuniverse

1.3.3.20210223

AWS ARN 및 정책 파싱

Apache v2

requests

2.23.0

간편한 HTTP 요청

Apache v2

Python 디텍션 작성 모범 사례

디텍션 테스트 작성

새 디텍션을 활성화하기 전에, 테스트를 작성하는 것이 권장됩니다 어떤 시나리오에서 알러트가 생성되어야 하는지 또는 생성되지 않아야 하는지를 정의하세요. 모범 사례는 최소 하나의 긍정 사례와 하나의 부정 사례를 포함하여 가장 높은 신뢰성을 보장하는 것입니다.

이벤트 필드 대소문자 처리

이벤트 필드에 대한 조회는 대소문자를 구분하지 않습니다. event.get("Event_Type") suricata_rules event.get("event_type") 은 동일한 결과를 반환합니다.

최상위 필드와 중첩 필드의 이해

최상위 필드는 중첩된 데이터 구조에서 부모 필드를 나타냅니다. 예를 들어, 레코드에는 user 라는 필드가 있고 그 아래에 ip_address와 같은 다른 필드들이 있을 수 있습니다. 이 경우, user 는 최상위 필드이고 ip_address 는 그 아래의 중첩 필드입니다.

중첩은 여러 레이어 깊이로 발생할 수 있으므로 스키마 구조를 이해하고 특정 필드에 어떻게 접근할지 아는 것이 중요합니다.

최상위 필드에 안전하게 접근하기

Basic Rules는 이벤트에서 필드의 값을 매치하며, 오류를 방지하기 위한 모범 사례는 Python의 내장 get() 함수를 활용하는 것입니다.

아래 예시는 모범 사례입니다. 이는 get() 함수를 활용하는 것입니다. get() 가 필드를 찾고, 필드가 없으면 오류 대신 None 를 반환하여 디텍션이 False.

return event.get('field') == 'value' False 아래 예에서, 만약 필드가 존재하면 필드의 값이 반환됩니다. 그렇지 않으면

circle-exclamation

를 발생시킬 것입니다.

return event['field'] == 'value' 글로벌 헬퍼 함수 사용하기많은 디텍션이 작성되면 패턴과 반복되는 코드가 나타납니다. 이는

글로벌 헬퍼 함수

를 사용하기에 좋은 케이스입니다. 이 함수들은 모든 디텍션에서 중앙화된 로직 위치를 제공합니다. deep_get()deep_walk() 중첩 필드에 안전하게 접근하기 글로벌 헬퍼 함수 사용하기이벤트 내 깊게 중첩된 필드에 접근하려면 이벤트 객체에서 사용 가능한

템플릿 룰

함수를 사용하세요. 이 함수들은 또한 로 제공되지만 편의상 이벤트 객체 버전을 사용하는 것이 권장됩니다. AWS CloudTrail 로그는 콘솔에 접근하는 사용자의 type을 userIdentity 아래에 중첩합니다.

"userName": "root" 로 제공되지만 편의상 이벤트 객체 버전을 사용하는 것이 권장됩니다. 두 가지 형태의 deep_get():

return deep_get(event, "userIdentity", "type") == "Root"

특정 값에 대해 필드 확인하기

특정 이벤트가 발생했는지 알고 싶을 수 있습니다. 만약 발생했다면 디텍션은 알러트를 트리거해야 합니다. Panther는 모든 것을 정규화된 JSON으로 저장하므로 지정한 기준에 대해 필드 값을 확인할 수 있습니다. 예를 들어, Box 기술 지원에 대한 액세스를 부여하는 동작을 탐지하려면 아래 Python이 사용되어 event_type :

와 같은지 매치합니다. 예를 들어, Box 기술 지원에 대한 액세스를 부여하는 동작을 탐지하려면 아래 Python이 사용되어 return event.get("event_type") == "ACCESS_GRANTED" 만약 필드가 의 SQL에서 이미 처리되어 있다면, 이고 값이

과 같다면 룰 함수는

를 반환하고 알러트가 생성됩니다.

정수 값에 대해 필드 확인하기

DedupPeriodMinutes:

box_access_granted.py

Python 연산자 범용 데이터 모델 사용 데이터 모델arrow-up-right.

은 모든 로그 유형에서 통일된 필드 세트를 구성하는 방법을 제공합니다. 기본적으로 Panther는 여러 로그 유형에 대해 내장 데이터 모델을 제공합니다. 커스텀 데이터 모델은 Panther 콘솔에서 또는 Panther Analysis Tool

템플릿 룰

import panther_event_type_helpers as event_type

여러 조건 사용하기

심각도 알러트가 생성되고—그렇지 않으면 키워드는 논리 연산자이며 조건문을 결합하는 데 사용됩니다. 이벤트의 여러 필드를 일치시키려면 종종 키워드를 사용해야 합니다. 키워드를 사용할 때 모든 문장은 참이어야 합니다: "string_a" == "this""string_b" == "that"

템플릿 룰

AWS 콘솔에 대한 루트 사용자의 성공적인 액세스를 추적하려면 여러 필드를 살펴봐야 합니다:

심각도 알러트가 생성되고—그렇지 않으면 suricata_rules 키워드는 논리 연산자이며 조건문을 결합하는 데 사용됩니다. 을 사용할 때 suricata_rules, 다음 문장들 중 하나가 참일 수 있습니다: "string_a" == "this"`` ``suricata_rules`` ``"string_b" == "that"

템플릿 룰

이 예제는 필드에 포트 80이 포함되어 있는지 또는 suricata_rules 포트 22:

목록에서 값 검색하기

IP 주소나 사용자 등을 포함한 목록과 이벤트 값을 비교하는 것은 Python에서 빠릅니다. 이벤트 값이 목록에도 존재할 때 일치하지 않도록 룰 로직을 설정하는 것은 일반적인 패턴입니다. 이는 환경에서 알려진 동작으로 인한 오탐을 줄이는 데 도움이 될 수 있습니다.

이벤트 값이 어떤 컬렉션에 있는지 확인할 때는 Python 집합(set)을 사용하는 것이 권장됩니다—set은 Python에서 리스트나 튜플보다 성능(즉, 메모리 효율)이 더 좋습니다. 리스트와 튜플은 집합과 달리 포함 여부를 확인하기 위해 컬렉션의 각 항목을 반복해야 합니다.

비교 대상인 집합이 정적(static)인 경우에는 이를 전역 레벨에서 정의하는 것이 권장됩니다. 함수 내부가 아니라 전역에서 정의하세요. Runbook: 전역 변수는 Lambda 호출당 한 번만 초기화됩니다. 단일 Lambda 호출이 여러 이벤트를 처리할 수 있기 때문에 전역 변수는 매번 초기화하는 것보다 일반적으로 더 효율적입니다. Runbook: 가 호출될 때마다.

템플릿 룰

아래 예제에서는 Panther 헬퍼를 사용합니다 pattern_match_list:

DedupPeriodMinutes: Teleport 사용자 계정 생성arrow-up-right

정규식으로 이벤트 일치시키기

하위 도메인, 파일 경로 또는 일반 문자열의 접두사/접미사와 일치시키려면 정규식을 사용할 수 있습니다. Python에서는 re 라이브러리를 임포트하여 정규식을 사용할 수 있습니다. re 라이브러리와 일치하는 값을 찾습니다.

아래 예제에서 정규식 패턴은 privilegeGranted 필드의 중첩된 값에 대해 Administrator 또는 administrator와 일치합니다.

아래 예제에서는 Panther 헬퍼를 사용합니다 pattern_match:

import panther_event_type_helpers as event_type

기본 Python 룰 구조

필수 필드는 굵게.

필드 이름

설명

예상 값

AnalysisType

이 분석이 rule, scheduled_rule, policy 또는 global인지 여부를 나타냅니다

룰: 예약된 룰: scheduled_rule

활성화됨

이 룰이 활성화되어 있는지 여부

불리언

파일 이름

파이썬 룰 본문의 경로(파일 확장자 포함)

title

CRITICAL

룰의 고유 식별자

문자열 다음을 포함할 수 없습니다 %

로그 유형

이 룰을 적용할 로그 목록

문자열 목록

심각도

이 룰의 심각도

다음 문자열 중 하나: 정보, 낮음, 중간, 높음필드 대상 재정의

ScheduledQueries (예약된 룰에만 있는 필드)

이 룰을 적용할 예약 쿼리 이름 목록

문자열 목록

알러트 생성

룰이 생성해야 하는지 여부 룰 매치/알러트 매치 시 (기본값 참)

불리언

설명

룰에 대한 간단한 설명

title

DedupPeriodMinutes

유사한 이벤트가 그룹화되는 시간 기간(분 단위)

15,30,60,180 (3 시간),720 (12 시간), 또는 1440 (24 시간)

HIGH

UI와 알러트에 표시할 친숙한 이름. 이 필드가 설정되지 않으면 CRITICAL 가 표시됩니다.

title

description

정적 목적지 재정의. 이는 이 룰의 알러트 라우팅을 결정하는 데 사용되며 심각도 기반 기본 라우팅보다 우선합니다.

문자열 목록

참고

이 룰이 존재하는 이유로, 종종 문서에 대한 링크

title

보고서

이 룰이 해당 프레임워크에 대해 다루는 값을 프레임워크나 보고서 이름에 매핑한 것

문자열에서 문자열 목록으로의 맵

런북

분석가 또는 Panther AI가 관련 알러트를 분류하기 위해 취할 수 있는 조치.

title

요약 속성

알러트에 요약되어야 할 필드 목록.

문자열 목록

임계값(Threshold)

알러트가 전송되기 전에 몇 개의 이벤트가 이 룰을 트리거해야 하는지.

정수

태그

이 룰을 분류하는 데 사용되는 태그

문자열 목록

테스트

이 룰에 대한 단위 테스트.

맵의 목록

작성자

이 디텍션의 작성자입니다. Panther 사용자 UUID, 이메일 주소 또는 임의의 텍스트 값으로 설정할 수 있습니다. 자세한 내용은 심각도 알러트가 생성되고—그렇지 않으면 작성자 디텍션 필드.

title

Python 정책 명세 참조

필수 필드는 굵게.

정책 명세 필드의 전체 목록:

필드 이름

설명

예상 값

AnalysisType

이 명세가 정책을 정의하는지 또는 룰을 정의하는지 여부를 나타냅니다

정책

활성화됨

이 정책이 활성화되어 있는지 여부

불리언

파일 이름

파이썬 정책 본문의 경로(파일 확장자 포함)

title

, 또는

정책의 고유 식별자

문자열 다음을 포함할 수 없습니다 %

리소스 유형

이 정책이 적용될 리소스 유형

문자열 목록

심각도

이 정책의 심각도

다음 문자열 중 하나: 정보, 낮음, 중간, 높음필드 대상 재정의

설명

정책에 대한 간단한 설명

title

HIGH

UI와 알러트에 표시할 이름. , 또는 가 표시됩니다.

title

참고

이 정책이 존재하는 이유로, 종종 문서에 대한 링크

title

보고서

이 정책이 해당 프레임워크에 대해 다루는 값을 프레임워크나 보고서 이름에 매핑한 것

문자열에서 문자열 목록으로의 맵

런북

분석가 또는 Panther AI가 관련 알러트를 분류하기 위해 취할 수 있는 조치.

title

억제

무시할 패턴, 예: aws::s3::*

문자열 목록

태그

이 정책을 분류하는 데 사용되는 태그

문자열 목록

테스트

이 정책에 대한 단위 테스트.

맵의 목록

작성자

이 디텍션의 작성자입니다. Panther 사용자 UUID, 이메일 주소 또는 임의의 텍스트 값으로 설정할 수 있습니다. 자세한 내용은 심각도 알러트가 생성되고—그렇지 않으면 작성자 디텍션 필드.

title

디텍션 문제 해결

Panther 지식 기반을 방문하여 디텍션에 관한 문서를 확인하세요arrow-up-right 자주 묻는 질문에 답하고 일반적인 오류 및 문제를 해결하는 데 도움이 되는 문서들.

마지막 업데이트

도움이 되었나요?