전역 헬퍼 함수
개요
프로그래밍에서 반복되는 코드를 헬퍼 함수로 추출하는 것은 일반적인 패턴입니다—Panther는 이 패턴을 전역(global) 분석 유형으로 지원합니다. Panther는 여러 내장 글로벌 헬퍼를 제공하며, 또한 사용자 정의 글로벌을 추가할 수 있습니다. 특정 일반적인 헬퍼 에 대해 자세히 알아보세요.
글로벌 헬퍼는 자주 변경되는 경우에는 적합하지 않습니다. 만약 정말로 자주 변경해야 한다면 대신 사용자 정의 조회 테이블을 고려하세요. 이들은 S3와 자동 동기화 기능을 지원하며 업데이트를 위해 Panther 내에서 코드 변경이 필요하지 않습니다.
Panther에서 관리하는 글로벌
기본적으로 Panther는 다음과 같은 내장 글로벌 헬퍼 모음을 제공합니다:
panther_base_helpers: 다양한 일반 유틸리티 및 로그 소스별 헬퍼를 포함합니다. 특정 함수에 대해서는 아래의panther_base_helpers에서 더 알아보세요, 일반 헬퍼.panther_detection_helpers: 캐싱 기능을 제공합니다. 더 자세한 내용은panther_detection_helpers패키지 의 Python 규칙 캐싱 문서를 참조하세요.
Panther에서 관리하는 글로벌 커스터마이징
일부 글로벌은 허용 목록 값을 제공하는 등 구성 입력이 필요합니다. 로직을 수정하거나 사용자 정의 메서드를 추가하는 등 더 큰 변경이 필요하다면, 일반적으로 새 글로벌을 생성하는 것 을 권장합니다. 이렇게 하면 탐지 소스를 업데이트할 때 복잡한 병합 충돌을 처리해야 할 가능성을 줄일 수 있습니다.
그래도 글로벌 헬퍼를 수정하려면 Panther 지식 기반 문서를 참조하세요: Panther에서 관리하는 글로벌 헬퍼 함수를 커스터마이즈하는 가장 좋은 방법은 무엇인가요?
글로벌 사용하기
글로벌 보기
Panther Console에서 제공된 및 사용자 정의 헬퍼 파일을 보려면, Panther Console의 왼쪽 탐색 바에서 Detections, 를 클릭한 다음 Helpers 탭을 클릭하십시오.

사용자 정의 글로벌 추가하기
새 글로벌은 Panther 분석 도구 또는 Panther Console에서 생성할 수 있습니다.
Panther의 탐지 내에서 외부 API 요청을 하는 것은 강력히 권장되지 않습니다. 일반적으로 탐지는 매우 높은 규모로 처리되며 API 요청은 수신 시스템에 과부하를 일으키고 규칙이 15초 실행 시간 제한.
Panther Console에서 새 글로벌을 생성하려면:
Panther 콘솔의 왼쪽 탐색 바에서 클릭하십시오 탐지.
다음 항목을 클릭하십시오 Helpers 탭을 클릭하십시오.
오른쪽 상단에서 클릭 새로 만들기.

Python 함수를 입력한 다음 Create를 클릭하세요. 이 글로벌은 이제 규칙이나 정책에서 가져다 쓸 수 있습니다.

글로벌 함수는 규칙이나 정책 전반에서 공통 로직을 공유할 수 있게 해줍니다. 코드를 선언하려면, 규칙 및 정책과 유사한 패턴으로 CLI 워크플로우에서 Panther가 제공하는 헬퍼 파일을 보려면, 폴더에 추가하세요.
Python 파일을 생성하세요 (
global_helpers/acmecorp.py):
2. 명세 파일을 생성하세요:
3. 이 헬퍼를 정책(또는 규칙)에서 사용:
탐지에서 글로벌 가져오기
분석 파일 상단에 import 문을 사용하여 글로벌 헬퍼를 가져온 다음, 일반적인 Python 라이브러리처럼 헬퍼를 호출하세요.
를 참조하세요.
탐지에서 헬퍼 함수에 대한 참조 제거하기
탐지에서 의존성을 제거하기로 결정했다면, 우리는 변경을 단계적으로 수행할 것.
일반 헬퍼
deep_get()
deep_get()deep_get() 이 또한 이벤트 객체 자체의 함수로 사용할 수 있습니다. 편의를 위해 이 글로벌 헬퍼 함수 대신 해당 이벤트 함수를 사용하는 것이 권장됩니다.
다음 위치에 있음: panther_base_helpers.
deep_get() 는 Python 딕셔너리 내에 중첩된 키를 반환하는 데 사용할 수 있습니다. 이 함수는 중첩된 키를 안전하게 반환하고 키가 없을 때 발생하는 AttributeError 를 방지하는 데 유용합니다.
접근하려는 키가 리스트 내부에 중첩되어 있다면, deep_walk() 을(를) 사용하는 것을 고려하세요.
예제
를 사용하는 것을 고려하세요.
deep_get(event, "outcome", "result") == "FAILURE" 지리적으로 불가능한 Okta 로그인 이는
탐지에서 찾을 수 있습니다.
deep_get() default 탐지에서 찾을 수 있습니다. 는 선택적 매개변수 를 받습니다. 기대한 위치에 키가 없거나 해당 위치의 값이None
deep_walk()
deep_walk()deep_walk() 이 또한 이벤트 객체 자체의 함수로 사용할 수 있습니다. 편의를 위해 이 글로벌 헬퍼 함수 대신 해당 이벤트 함수를 사용하는 것이 권장됩니다.
다음 위치에 있음: panther_base_helpers.
deep_walk() deep_get(event, "outcome", "nonexistent_key", default="Key Not Found") == "Key Not Found" deep_walk() 와 deep_get().
는 Python 딕셔너리(여러 딕셔너리나 리스트를 포함할 수 있음) 내에 깊게 중첩된 키와 연결된 값을 반환하는 데 사용할 수 있습니다. 이 기능은 deep_get()와의 주요 차별점입니다.
예제
와 마찬가지로, 이 순회는 안전하며 예외나 오류를 피합니다. 구조에 키가 없는 경우 기본값이 반환됩니다. deep_walk() 다음 객체에서, 는:
deep_get(event, "outcome", "result") == "FAILURE" {"key": {"multiple_nested_lists_with_dict": [[[{"very_nested_key": "very_nested_value"}]]]}} 이는
탐지에서 찾을 수 있습니다.
deep_walk(event, "key", "multiple_nested_lists_with_dict", "very_nested_key", default="") == "very_nested_value" deep_get(), deep_walk() GCP 서비스 계정 접근 거부 탐지에서 찾을 수 있습니다. 와 마찬가지로 매개변수 를 받습니다. 기대한 위치에 키가 없거나 해당 위치의 값이는 선택적
매개변수를 받습니다. 제공된 이벤트에 키가 없거나 키가
위의 예를 사용하면:
deep_walk(event, "key", "multiple_nested_lists_with_dict", "very_nested_nonexistent_key", default="") == "" deep_get(), deep_walk() return_val
와는 달리는 세 가지 뚜렷한 값 분류를 반환할 수 있습니다:all
와는 달리
first deep_walk() last 와는 달리 기본적으로, 와는 달리 는 주어진 키에 대해
를 참조하세요.
{"key": {"inner_key": [{"nested_key": "nested_value"}, {"nested_key": "nested_value2"}]}} 와는 달리 deep_walk(event, "key", "inner_key", "nested_key", default="") == ['nested_value', 'nested_value2']
는 세 가지 뚜렷한 값 분류를 반환할 수 있습니다:
를 사용하고 여러 값을 반환할 때, 리스트의 요소들은 다른 Python 리스트처럼 접근할 수 있습니다. 키에 대해 처음 발견된 값만 반환하려면,.
를 참조하세요.
all
을 지정하세요. deep_walk(event, "key", "inner_key", "nested_key", default="", return_val="first") == "nested_value".
를 참조하세요.
return_val="last"
return_val="last"다음 위치에 있음: panther_base_helpers.
return_val="last" 을 지정하세요.
예시:
은 IP 주소가 IP 범위 목록 내에 있는지 확인하는 함수입니다. 이 함수는 탐지에 컨텍스트를 추가하기 위해 알려진 내부 네트워크 목록과 함께 사용할 수 있습니다. SHARED_IP_SPACE = [ 이는
if is_ip_in_network(event.get("ipaddr"), SHARED_IP_SPACE):
if is_ip_in_network(event.get("ipaddr"), SHARED_IP_SPACE):다음 위치에 있음: panther_base_helpers.
예제는 에서 찾을 수 있습니다. OneLogin 활성 로그인 활동
예시:
pattern_match()
의 래퍼입니다. 이는 정규식을 사용하지 않고도 간단한 패턴 매칭이 필요할 때 사용할 수 있습니다.
다음 JSON에서 pattern_match() 함수는 true를 반환합니다.
다음 JSON에서 pattern_match() 함수는 true를 반환합니다.다음 위치에 있음: panther_base_helpers.
{ "operation": "REST.PUT.OBJECT" } if is_ip_in_network(event.get("ipaddr"), SHARED_IP_SPACE):, 다음 JSON에서 pattern_match() 함수는 true를 반환합니다. pattern_match(event.get("operation", ""), "REST.*.OBJECT")
예시:
예제는 AWS S3 액세스 오류 탐지에서 확인할 수 있습니다.
은 IP 주소가 IP 범위 목록 내에 있는지 확인하는 함수입니다. 이 함수는 탐지에 컨텍스트를 추가하기 위해 알려진 내부 네트워크 목록과 함께 사용할 수 있습니다. "* HashiCorp/?.0 Terraform/*", 이는
# 'console.ec2.amazonaws.com',
# 'console.ec2.amazonaws.com',다음 위치에 있음: # 'cloudformation.amazonaws.com',.
# 'console.ec2.amazonaws.com', pattern_match_list(event.get("userAgent"), ALLOWED_USER_AGENTS)
예시:
AWS EC2 수동 보안 그룹 변경 # 'console.ec2.amazonaws.com', aws_strip_role_session_id() panther_aws_helpers
은 IP 주소가 IP 범위 목록 내에 있는지 확인하는 함수입니다. 이 함수는 탐지에 컨텍스트를 추가하기 위해 알려진 내부 네트워크 목록과 함께 사용할 수 있습니다. 는 다음을 반환합니다. 이는
arn:aws:sts::123456789012:assumed-role/demo
arn:aws:sts::123456789012:assumed-role/demo다음 위치에 있음: panther_base_helpers.
arn:aws:sts::123456789012:assumed-role/demo { "arn": "arn:aws:sts::123456789012:assumed-role/demo/sessionName" }
aws_strip_role_session_id(user_identity.get("arn", "")) AWS 권한 없는 API 호출 is_base64().
는 문자열이 base64로 인코딩되었는지 검사하고, 그렇다면 디코딩된 문자열을 반환합니다. 그렇지 않으면 빈 문자열을 반환합니다.
는 문자열이 base64로 인코딩되었는지 검사하고, 그렇다면 디코딩된 문자열을 반환합니다. 그렇지 않으면 빈 문자열을 반환합니다.다음 위치에 있음: panther_detection_helpers예제는 panther_detection_helpers 패키지 의 Python 규칙 캐싱 문서를 참조하세요.
Crowdstrike.Base64EncodedArgs 탐지에서 확인할 수 있습니다.
. 자세한 내용은
. 자세한 내용은다음 위치에 있음: panther_detection_helpers예제는 panther_detection_helpers 패키지 의 Python 규칙 캐싱 문서를 참조하세요.
get_string_set 는 키를 기반으로 Panther가 관리하는 캐시에서 값을 가져오는 데 사용됩니다. 이는 탐지 호출 간에 상태를 검색하는 데 유용합니다.
Last updated
Was this helpful?

