Python 규칙 캐싱
개요
캐싱은 이전 탐지 실행이 이후 실행에 직접 영향을 미치도록 허용합니다. Panther의 실시간 분석 엔진은 이벤트를 하나씩 검사하며, 때때로 호출 간 상태를 유지하는 것이 유용합니다. 규칙은 내장 헬퍼 함수를 사용하여 값을 캐시할 수 있습니다. 이러한 헬퍼 함수는 Panther가 호스팅하는 DynamoDB 테이블과 인터페이스합니다. 이 기능은 때때로 "panther-kv-store"라고 불립니다.
탐지는 임의의 키-값 쌍을 저장하고 검색할 수 있어 탐지 실행 간에 상태를 보존할 수 있습니다. 대신 예약 검색 및 예약 규칙을 사용하는 것 대신, 탐지는 실시간으로 이벤트 메타데이터를 수집하고 분석할 수 있습니다.
Panther에서 관리하는 DynamoDB 테이블을 읽고 싶다면 Panther 지원팀에 문의하세요. DynamoDB에 대한 읽기 전용 권한을 가진 AWS 역할이 제공될 것입니다.
캐시를 사용하면 탐지 처리에 상당한 지연이 추가되어 경고 지연과 같은 하위 영향이 발생할 수 있으므로 다음을 권장합니다:
적은 양의 데이터를 수집하는 로그 유형의 탐지에서만 캐시를 사용하세요
캐시는 절대적으로 필요한 경우에만 사용되도록 탐지를 작성하세요(자세한 내용은 함정: 필요하기 전에 캐시 사용하기)
일반적인 사용 사례
원시 이벤트, 보강(enrichment), 외부 소스 등에서 데이터 집계
캐시를 활용하면 탐지가 중복 제거(deduplicate)한 다음 이후 탐지 실행 및/또는 경고 컨텍스트에서 사용할 수 있도록 데이터를 집계할 수 있습니다.
여러 이벤트 및/또는 로그 소스의 데이터 상관관계
단일 이벤트는 단독으로는 많은 통찰을 제공하지 않을 수 있습니다. 그러나 일련의 이벤트는 매우 유용한 보다 완전한 그림을 형성할 수 있습니다.
DynamoDB 캐시는 Panther 전체의 모든 탐지 실행에서 참조될 수 있으므로 캐시를 사용하여 탐지 범위를 상당히 넓힐 수 있습니다.
위험 기반 알림, 사용자 엔터티 및 행동 분석(UEBA)
DynamoDB 캐시는 Panther로 들어온 이벤트를 기반으로 엔터티를 모니터링하고 점수를 매기는 데 사용할 수 있습니다. 이는 이질적인 이벤트에 대한 추상화 계층을 제공하여 탐지가 위험한 행동을 추적, 점수화 및 분류할 수 있게 합니다.
탐지는 명시적인 필드 기반 논리 없이도 무작위 이벤트 조합에 점수를 통합할 수 있습니다.
캐싱 은(는) 이벤트를 집계하고 일부 이벤트 임계값이 충족되면 경고를 생성하는 데 사용할 수 있지만, 대신 내장된 중복 제거 기능을 사용하는 것이 권장됩니다.
DynamoDB의 키-값 쌍
Panther의 탐지 캐시를 구동하는 DynamoDB는 빠르고 가벼운 NoSQL 키-값 데이터베이스입니다. Panther는 탐지 캐싱을 구동하는 단일 DynamoDB 테이블을 구현했습니다.
DynamoDB 내의 모든 행은 키-값 쌍입니다:
키: 행의 고유 식별자(테이블 내에서 중복될 수 없음)
값: 주어진 키와 연결된 임의의 데이터
키와 값은 모두 탐지 코드에서 생성될 수 있습니다.
키 생성하기
모든 Panther 탐지는 캐시로 동일한 DynamoDB 테이블을 공유합니다. 이는 탐지 간 교차 캐싱에 이점을 제공하지만, 다음과 같은 키를 선택해야 합니다:
탐지 실행 시 프로그래밍적으로 생성될 수 있는
키를 생성하는 데 사용되는 코드는 종종 함수에 배치됩니다.
동일한 키를 여러 탐지에 걸쳐 구현하려면 키 생성기 함수를 글로벌 헬퍼 에 저장할 것을 권장합니다.
이벤트 값을 활용하세요
예: IP 주소, 사용자 이름, 해시, ID, ARN.
의도된 범위 내에서 충분한 엔트로피와 고유성을 제공하세요
캐시는 단일 탐지 내에 구현되거나 여러 탐지 및 로그 소스에서 동시에 구현될 수 있습니다.
여러 탐지 및 로그 소스에서 동일한 캐시를 사용하려는 경우, 공통 필드 값 분류체계를 만들기 위해 데이터 모델(Data Models) 를 활용해야 할 수 있습니다.
서로 충돌하지 않도록 하세요
키-값 쌍을 잘못 덮어쓸 수 있으므로 이를 방지하도록 키를 신중하게 구성해야 합니다.
캐시 헬퍼 함수는 panther_detection_helpers
panther_detection_helpersPanther는 panther_detection_helpers라는 pip 패키지를 유지 관리하며 이를 탐지에서 사용할 수 있습니다.
감지 파일에서 panther_detection_helpers 를 참조하려면 다음 import 문을 추가하세요:
또한 다음과 같은 문으로 특정 함수를 가져올 수 있습니다:
딕셔너리
이러한 Panther 제공 헬퍼 함수는 탐지가 딕셔너리를 캐시하도록 허용합니다:
get_dictionary: 딕셔너리의 현재 값을 가져옵니다put_dictionary: 딕셔너리를 덮어씁니다
딕셔너리는 Python json 라이브러리를 사용하여 직렬화 및 역직렬화됩니다. 따라서 캐시된 딕셔너리는 다음을 포함할 수 없습니다:
셋(집합)
복소수 또는 수식
커스텀 객체
문자열이 아닌 키
예시
이벤트는 항상 딕셔너리로 탐지에 전달되므로 네이티브로 캐시할 수 있습니다:
코드에서 딕셔너리를 구성하여 캐시하는 것도 가능합니다:
문자열 집합
이러한 Panther 제공 헬퍼 함수는 탐지가 문자열 집합을 캐시하도록 허용합니다:
get_string_set: 문자열 집합의 현재 값을 가져옵니다put_string_set: 문자열 집합을 덮어씁니다add_to_string_set: 하나 이상의 문자열을 집합에 추가합니다remove_from_string_set: 하나 이상의 문자열을 집합에서 제거합니다reset_string_set: 집합을 비웁니다set_key_expiration: 문자열 집합의 수명을 설정합니다
예제
아래 규칙은 문자열 집합 캐싱의 데모를 제공합니다.
카운터
카운터 기반 규칙을 구현하려면 다음 함수 중 하나 이상을 사용하세요:
get_counter: 최신 카운터 값을 가져옵니다increment_counter: 카운터에 추가합니다(기본값 1)reset_counter: 카운터를 0으로 재설정합니다set_key_expiration: 카운터의 수명을 설정합니다
예제
아래 규칙은 카운터 사용의 데모를 제공합니다.
타임스탬프를 사용하여 상태 추적하기
DynamoDB 캐시의 일반적인 사용 사례는 주어진 기간 내의 이벤트 그룹을 추적하는 것입니다. 모든 키-값 쌍은 코드에서 생성되어야 하므로 타임스탬프 추적은 값에 제공되지 않는 한 제공되지 않습니다.
탐지 작성자는 이벤트를 집계할 때 p_event_time 를 저장하는 것을 고려해야 합니다.
수명(타임투리브)
TTL(Time to Live)은 캐시 항목에 만료 타임스탬프를 설정할 수 있게 합니다. 이 자동 삭제는 중복 제거 전략 및 효율적인 데이터 정리에 유용할 수 있습니다. 모든 캐시 항목의 기본 TTL은 90일이지만, 자체 TTL 값을 구성하는 것이 가능합니다.
TTL 설정하기
캐시의 90일 기본 TTL을 재정의하려면 다음 중 하나를 사용할 수 있습니다:
설정은
epoch_seconds캐시에 쓰는 헬퍼 함수들(예:put_string_set()와increment_counter()설정은
set_key_expiration()function
둘 다 epoch_seconds 와 set_key_expiration() 항목이 삭제되어야 하는 타임스탬프를 정의합니다. 이러한 함수는 panther_detection_helpers.
에서 사용할 수 있습니다. epoch_seconds만약 set_key_expiration() 에 대한 값을 전달하지 않는다면, 를 호출한 후에epoch_seconds epoch_seconds 를 반드시 호출하세요. set_key_expiration() 만약 epoch_seconds를 받는 함수가
다음 이후에 호출되고 에 대한 값이 제공되지 않으면, TTL은 기본값인 90일로 재설정됩니다.만료 타임스탬프를 생성하려면 이벤트 시간과 관련된 유닉스 타임스탬프를
예시
)보다 이벤트 시간( 지리적으로 불가능한 Okta 로그인 p_event_time) epoch_seconds:
dumps( set_key_expiration():
테스트(Testing)
epoch_seconds=event.event_time_epoch() + timedelta(days=7).total_seconds(),
동일한 예제를 사용하여
set_key_expiration(key, event.event_time_epoch() + timedelta(days=7).total_seconds())
캐시를 위한 DynamoDB 의존성은 탐지 코드를 테스트하고 검증할 때 특별한 고려가 필요함을 의미합니다:
Panther 콘솔에서 테스트하기단위 테스트 호출은 해당 함수들이 목(mock)으로 대체되지 않는 한 DynamoDB와 통신합니다.DynamoDB로 전송 및 수신되는 데이터는 단위 테스트 결과의 디버깅을 위해
alert_context()
에 커밋될 수 있습니다.
DynamoDB의 원시 내용을 브라우징하는 것은 불가능합니다. CLI 워크플로우로 테스트하기 Panther의 탐지는 DynamoDB와 통신하기 위해 AWS IAM 역할을 활용합니다.
로컬에서 또는 CI/CD 워크플로우의 일부로 단위 테스트를 실행하기 위해
panther_analysis_tool
을(를) 사용할 때 이 IAM 역할에 접근할 수 없습니다. Panther 콘솔의 컨텍스트 외부에서는 DynamoDB 캐시와 상호작용할 수 없으므로 테스트는 입력과 출력을 시뮬레이션해야 합니다..
CI/CD 워크플로우를 수용하기 위해, DynamoDB와 상호작용하는 모든 함수를 목(mock)으로 처리하여 예상 출력을 시뮬레이션할 것을 권장합니다.
함정: 필요하기 전에 캐시 사용하기
목에 관한 자세한 내용은 Panther의 문서를 참조하세요
# 반복되는 나쁜 행위자, 경고
reset_string_set('BadGuys')
이 탐지는 크게 개선될 수 있는 두 가지 지점이 있습니다:먼저BadGuys문자열 집합을 에 설치해야 하며 BadGuyDetected이벤트인지 확인하기 전에 가져옵니다. 만약 그것이 나쁜 행위자 이벤트라면 문자열 집합을 가져올 필요가 없습니다. 이 호출은 항상 필요하지 않음에도 모든 탐지 실행에 지연을 추가합니다.
두번째로 새bad_guy
를 반복 나쁜 행위자인지 확인하기 전에 문자열 집합에 추가합니다. 만약 반복 나쁜 행위자라면 우리는 경고를 발생시키고 집합을 재설정할 것이므로 문자열 집합에 추가할 필요가 없습니다.
Last updated
Was this helpful?

