사용자 지정 Sandfly 옵션
커스텀 sandfly의 옵션 영역은 스캔 매개변수가 관련 에이전트리스 포렌식 엔진에 전달되는 곳입니다.
완전한 Options JSON 구조는 Option Data를 참조하세요. 모든 sandfly에 반드시 존재해야 하는 옵션들은 다음과 같습니다:
- engines - 이 sandfly가 사용할 스캔 엔진을 명명하는 단일 문자열 항목을 포함해야 하는 배열입니다.
- explanation - sandfly가 경고할 때 발견된 내용을 설명하기 위해 이 문자열이 사용자에게 표시됩니다. 중괄호 안에 expr 표현식을 넣어서 결과 데이터 구조의 값을 포함할 수 있습니다 (
{ ...}). 예를 들어, file 엔진을 사용하는 경우 설명에{file.name}을 포함하여 발견된 파일 이름을 보고할 수 있습니다. - rule_op - 이는
and또는or문자열일 수 있습니다. rules 배열에 여러 규칙이 있는 경우,and또는or논리로 결합됩니다. - rules - 이 문자열 배열은 규칙이 경고할지 여부를 결정하는 expr 규칙을 포함합니다. 최소 하나의 규칙이 필요하므로, 엔진이 고려하는 모든 후보 결과에서 sandfly가 트리거되어야 하는 경우 항상 경고하기 위해 간단한
"true"규칙을 포함할 수 있습니다. 이러한 규칙 작성에 대한 자세한 내용은 Rule Construction을 참조하세요.
선택적 옵션은 다음과 같습니다:
- always_pass - 이 불린 값이 true일 때 규칙이 항상 "pass" 상태를 가지지만 엔진에서 수집한 상세한 포렌식 데이터를 포함합니다. 예를 들어, 경고를 트리거하지 않고 데이터를 수집하려는 recon sandflies에서 사용됩니다.
- inverse_result - 이는 sandfly가 규칙과 일치하는 것을 찾지 못할 때 Sandfly가 이를 경고로 간주해야 함을 의미합니다. 대상 시스템에서 예상되는 데이터의 부재에 대해 경고하는 데 사용될 수 있습니다.
- explanation_not_found - inverse_result 규칙에서 이 설명이 경고 설명으로 사용됩니다. 결과 데이터가 없기 때문에 (아무것도 발견되지 않았으므로) 일반 explanation 필드처럼
{}보간 변수를 사용할 수 없습니다. - os_exclude - 이 규칙이 true인 경우 대상 시스템에서 sandfly가 건너뛰어집니다. "os" 데이터는 규칙에서 사용할 수 있습니다.
- response 구조체의 JSON 예제:
-
"os_exclude": { "rule_op": "or", "rules": [ "os.info.os_release.id == 'alpine'", "os.info.os_release.id == 'gentoo'" ] }
- response - "process" 결과에만 해당하며, sandfly는 발견된 프로세스를 일시 중지하거나 종료시킬 수 있는 옵션을 가집니다.
- 이 섹션은 내부에 아무것도 포함할 필요가 없다는 의미에서 선택적이지만, 모든 "process" sandflies에 대해 최상위 키 자체는 반드시 존재해야 합니다.
- response 구조체의 JSON 예제:
-
"response": { "process": { "kill": false, "suspend": false } }
위의 범용 sandfly 옵션 외에도, 일부 엔진에는 스캔 동작을 제어하는 옵션이 있습니다.
atjob:
- follow_links - 심볼릭 링크를 따라가는 검색을 적용합니다.
- search_paths - 디렉토리에 대한 검색 경로입니다.
- search_paths_patterns - 디렉토리 내부의 검색 패턴입니다.
- search_paths_patterns_ignore - 무시할 검색 패턴입니다.
cron:
- follow_links - 심볼릭 링크를 따라가는 검색을 적용합니다.
- search_paths - 디렉토리에 대한 검색 경로입니다.
- search_paths_patterns - 디렉토리 내부의 검색 패턴입니다.
- search_paths_patterns_ignore - 무시할 검색 패턴입니다.
- search_paths_individual - 개별 파일명 검색입니다.
directory:
- follow_links - 심볼릭 링크를 따라가는 검색을 적용합니다.
- home_dir_scan - 모든 사용자 홈 디렉터리에 검색 경로를 적용합니다.
- search_paths - 디렉토리에 대한 검색 경로입니다.
- search_paths_recurse - 하위 디렉터리를 재귀적으로 탐색합니다.
- search_paths_patterns - 디렉토리 내부의 검색 패턴입니다.
- search_paths_patterns_ignore - 무시할 검색 패턴입니다.
- search_paths_individual - 개별 디렉터리 검색입니다.
file:
- executables_only - 실행 가능한 파일에만 검색을 적용합니다.
- follow_links - 심볼릭 링크를 따라가는 검색을 적용합니다.
- home_dir_scan - 모든 사용자 홈 디렉터리에 검색 경로를 적용합니다.
- search_paths - 디렉토리에 대한 검색 경로입니다.
- search_paths_recurse - 하위 디렉터리를 재귀적으로 탐색합니다.
- search_paths_patterns - 디렉토리 내부의 검색 패턴입니다.
- search_paths_full_patterns - Search pattern which leverages the entire path.
- search_paths_patterns_ignore - 무시할 검색 패턴입니다.
- search_paths_individual - 개별 디렉터리 검색입니다.
- search_pattern_text - 파일 내용 검색입니다.
- search_pattern_depth_bytes - 검색_패턴_텍스트를 검색할 파일의 바이트 수를 제한합니다. 예를 들어, 100MB 파일이 있지만 각 파일의 처음 1MB로 검색을 제한하려면 1048576 값을 설정합니다. 대용량 파일이 포함될 수 있는 디렉터리 트리에서 파일 내용을 검색할 때 발생할 수 있는 성능 문제로부터 보호합니다.
- match_paths - 동일한 해시를 가진 파일을 찾을 경로입니다.
- match_paths_recurse - 하위 디렉터리를 탐색하여 match_paths에 대한 파일을 재귀적으로 인덱싱합니다.
- match_paths_individual - 동일한 해시를 가진 파일을 찾을 개별 경로입니다.
- max_size - 0보다 크면, 다른 규칙과 기준에 관계없이 이 크기를 초과하는 파일은 매치 대상으로 고려되지 않습니다. 이는 매우 큰 파일이 있는 디렉터리에서 해시/엔트로피 등의 검사를 수행할 수 있는 sandfly에 대해 파일 크기를 기반으로 한 조기 회피 밸브로 사용할 수 있습니다.
- read_compressed_files - 값이 설정되면
true로 설정하면 스캔이 gzip 또는 bzip2로 압축된 파일을 검사할 수 있습니다.
kernel_module :
- taint_inconsistency - 현재 로드된 모듈과 우리가 찾을 수 있는 커널의 오염 상태가 일치하지 않는 경우 매치합니다.
process:
- redact_environment - sandfly 에이전트 프로세스의 스캔을 허용합니다.
- scan_self - 결과에 프로세스 환경 변수를 포함하지 않습니다.
- masquerade_binary_check - 이 프로세스와 비교할 바이너리 목록입니다.
user:
- username - 확인할 사용자명에 대한 검색 패턴입니다.
- username_ignore - 무시할 사용자명에 대한 검색 패턴입니다.
- password_auditor (비밀번호 감사자):
- password_is_username - 사용자의 비밀번호가 사용자명과 동일한지 확인합니다.
- password_list - 각 사용자에 대해 시도할 비밀번호 목록입니다.
- max_random_users_to_attempt - 0보다 크면, 이번 실행에서 크래킹을 시도할 최대 사용자 수입니다.
- password_auditor (비밀번호 감사자):
문자 이스케이핑
sandfly JSON을 작성할 때 모든 수준에서 적절한 문자 이스케이프(특히 따옴표와 백슬래시와 같은 것들)를 고려해야 합니다. 예를 들어, "a"로 시작하고 ".b"로 끝나며 중간에 하나 이상의 숫자가 있는 프로세스 이름을 찾으려면 expr의 "matches" 연산자와 함께 정규표현식을 사용할 수 있습니다.
정규표현식은 다음과 같습니다:
^a[0-9]+\.b$정규표현식에서 마침표(.)는 일반적으로 모든 문자와 일치하므로, 이를 리터럴 마침표로 만들기 위해 백슬래시로 이스케이프해야 합니다.
해당 정규표현식과 프로세스 이름을 일치시키는 완전한 expr 규칙은 다음과 같습니다:
process.name matches '^a[0-9]+\\.b$'정규표현식을 문자열 내부에 넣고 있기 때문에, 문자열 내부에서 단일 백슬래시가 이스케이프 문자이므로 원래 정규표현식의 백슬래시를 이스케이프해야 합니다.
마지막으로, 해당 expr 규칙을 sandfly JSON의 rules 배열에 넣습니다:
"rules": [
"process.name matches '^a[0-9]+\\\\.b$'"
]expr 규칙이 JSON의 문자열 내부에 배치되기 때문에 문자열 내용을 필요에 따라 이스케이프해야 합니다. 이 경우 "당신의" expr 규칙에서 각 백슬래시는 이스케이프되어야 하므로, 각 "\\"가 "\\\\"로 변해 최종적으로 정규표현식에서 단일 리터럴 백슬래시를 얻기 위해 총 4개의 백슬래시가 됩니다.
리터럴 문자열 구문
Expr은 이제 Go와 동일한 리터럴 문자열 구문을 지원합니다. 즉, 백틱 안에 문자열을 넣으면 문자열에서 아무것도 이스케이프할 필요가 없습니다. 이 대체 방법은 expr 규칙의 문자열에서 고려해야 하는 한 레벨의 이스케이프를 제거할 수 있습니다. 즉, JSON + expr가 아닌 JSON에 대해서만 이스케이프하면 됩니다.
예를 들어, 다음과 같은 규칙 대신:
"process.cmdline matches '(toptal\\\\.com/developers/hastebin|tor2web|zerobin\\\\.i2p)'"다음과 같이 작성할 수도 있습니다:
"process.cmdline matches `(toptal\\.com/developers/hastebin|tor2web|zerobin\\.i2p)`"이 버전에서는 단일 따옴표가 백틱으로 변경되고 백슬래시의 내부 레벨 이스케이프가 제거되었습니다.
>업데이트됨 7일 전