
maltrail v3.2
공개 블랙리스트, 정적 악성코드 흔적, 휴리스틱 분석을 사용하여 DNS, HTTP 및 IP 트래픽 전반의 위협을 식별하는 실시간 악성 트래픽 탐지 시스템

Maltrail
Maltrail은 알려진 악성 인프라와의 통신을 식별하고 선택된 트래픽 이상 징후를 보고하는 네트워크 트래픽 탐지 시스템입니다. 네트워크에서 관찰된 도메인, URL, IP 주소,
IP:port 쌍, User-Agent 값을 _trails_라고 하는 지표 집합과 대조합니다.
탐지는 출발지, 목적지, 프로토콜, 일치한 trail, 분류, trail 출처를 포함하는 단일 이벤트로 기록됩니다:```text "2026-08-07 09:14:22.117034" gw 10.13.13.2 57809 1.1.1.1 53 UDP DNS malware.bakewithdavid.com "asyncrat (malware)" (static)
Maltrail은 지표 기반 네트워크 모니터링을 위해 설계되었습니다. 휴리스틱 탐지는
트레일 매칭을 보완하지만, 엔드포인트 텔레메트리나 범용 침입
방지 시스템을 대체하지는 않습니다.
## 기능
- 3,000개 이상의 번들 정적 파일, 42개의 공개 피드 통합, 그리고 선택적으로 운영자가 제공하는 트레일을 결합한 전체 트레일 빌드.
- libpcap을 사용하는 멀티스레드 Rust 센서로, 선택적으로 Linux `PACKET_FANOUT` 캡처 워커를 지원합니다.
- 보고 인터페이스, 이벤트 수집, HTTP API를 제공하는 Python 서버.
- 검토하고 버전 관리할 수 있는 평문 사용자 정의 트레일 및 화이트리스트.
- 스캐닝, DNS 고갈, DGA 유사 조회, 의심스러운 다운로드, 프록시 프로브,
의심스러운 User-Agent 값 및 관련 네트워크 활동에 대한 휴리스틱.
- 로컬 이벤트 로깅, 원격 Maltrail 로깅, syslog를 통한 CEF, Logstash JSON 출력.
- `maltrail-sensor -T`를 통한 배포 검증 및 선택적 Prometheus 메트릭.
## 목차
- [아키텍처](#architecture)
- [보고 인터페이스](#reporting-interface)
- [성능](#performance)
- [설치](#installation)
- [설치 프로그램](#installer)
- [소스에서 빌드](#building-from-source)
- [Systemd](#systemd)
- [Docker](#docker)
- [구성](#configuration)
- [트레일](#trails)
- [이벤트 및 API](#events-and-api)
- [운영](#operations)
- [모니터링](#monitoring)
- [이벤트 보존](#event-retention)
- [문서](#documentation)
- [기여](#contributing)
- [프로젝트](#project)
- [라이선스](#license)
- [유지관리자](#maintainers)
- [후원사](#sponsors)
- [발표 및 출판물](#presentations-and-publications)
- [파생 블랙리스트](#derived-blacklist)
- [서드파티 통합](#third-party-integrations)
- [감사의 글](#acknowledgements)
## 아키텍처
Maltrail은 동일한 호스트 또는 별도의 호스트에서 실행될 수 있는 두 개의 독립적인 프로세스로 구성됩니다:```text
┌──────────┐ events (UDP or file) ┌──────────┐
│ sensor │ ───────────────────────► │ server │ ◄── browser
└──────────┘ └──────────┘
Rust Python
libpcap + PACKET_FANOUT reporting UI + API
trail matching + heuristics
센서는 트래픽을 캡처하고, 트레일 매칭과 휴리스틱 분석을 수행하며, 이벤트를 생성한다.
이벤트를 로컬에 기록하거나(LOG_DIR), 원격 Maltrail 서버로 전송하거나(LOG_SERVER), 또는
둘 다 할 수 있다. 또한 syslog를 통해 CEF를 내보내고(SYSLOG_SERVER), Logstash로 JSON을
전송할 수도 있다(LOGSTASH_SERVER).
서버는 원격 이벤트를 수신 및 저장하고, 로컬에서 사용 가능한 이벤트 로그를 제공하며, 웹 인터페이스와 API를 제공한다.
리포팅 인터페이스
Maltrail은 탐지된 트래픽을 탐색하기 위한 브라우저 기반 리포팅 인터페이스를 포함하며, 실시간 업데이트, 필드 인식 검색, 레트로 헌팅, 지리적 뷰, 트리아지, 저장된 뷰, 내보내기를 지원한다.

인터페이스는 server.py가 HTTP_ADDRESS:HTTP_PORT에서 제공한다. 순수 JavaScript로 작성되었으며
단 하나의 서드파티 런타임 의존성(CSV 파싱용 PapaParse)만 사용하고 빌드 단계가 없다. 한 번에
하루씩 조회하며, 사용 가능한 일별 로그 위에 이벤트 밀도 그리드 역할도 겸하는 날짜 선택기로
선택한다. 이벤트는 /events에서 스트리밍되어 브라우저에서 위협으로 집계된다 — 고유한
(source, trail)당 한 행 — 정렬 가능한 그리드에 상세 패널과 함께 표시된다.
| 기능 | 설명 |
|---|---|
| 라이브 모드 | 추가된 이벤트는 Server-Sent Events(/live)를 통해 푸시되어 현재 뷰에 병합된다. SSE를 사용할 수 없거나 스트림이 제공할 수 없는 세션의 경우 일별 로그의 바이트 범위 폴링으로 대체된다. 새로운 고위험 위협은 데스크톱 알림과 청각 경보를 발생시킬 수 있으며, 둘 다 음소거할 수 있다 |
| 검색 | 필드 범위 토큰(src: dst: port: proto: type: trail: info: family: tag: uid: sev: dir: status:; family:interlock은 하나의 피드 덤프가 분할되어 도착하는 샤드인 interlock-1/-2를 포함한다)과 공백을 AND로, -를 제외로, * 와일드카드, CIDR(src:10.0.0.0/8), 숫자 범위 및 비교(port:>1024, count:>=100)를 조합한다. 활성 필터는 제거 가능한 칩으로 표시된다 |
| 레트로 헌트 | 현재 뷰의 날짜뿐만 아니라 모든 보존된 일별 로그에서 하나의 지표를 검색한다(/hunt). 일수 제한, 실시간 예산, 샘플 상한으로 제한되며, 예산으로 인해 중단된 날짜는 완료된 날짜와 별도로 보고되지 완료된 합계로 계산되지 않는다. 일별 사이드카 인덱스(LOG_DIR/index/, USE_EVENT_INDEX)를 통해 스윕이 일치하지 않는 모든 줄을 건너뛸 수 있고 /counts가 정확해진다 |
| 세계 지도 | 선택한 날짜의 국가별 이벤트 밀도(/geo)로, 각 이벤트의 외부 엔드포인트를 배치한다. 외부 주소로 귀속될 수 없는 이벤트는 추측하지 않고 매핑되지 않은 것으로 보고된다. 출발지 호를 그리려면 HOME_LAT / HOME_LON을 설정한다 |
| 트리아지 | 위협별 상태(신규 / 조사 중 / 해결됨 / 오탐), 자유 텍스트 메모, 태그, 숨기기. 화이트리스트 규칙과 OSINT 피벗은 행 컨텍스트 메뉴에서 사용할 수 있다 |
| 저장된 뷰 | 이름이 지정된 필터 프리셋 |
| 내보내기 | 현재 필터링된 뷰를 CSV, JSON 또는 무력화된 지표로 내보내기 |
| 모양 | 다크 및 라이트 테마, 개별 텍스트 크기 단계 |
트리아지 상태, 저장된 뷰, 태그, 모양 설정은 서버가 아닌 브라우저(localStorage)에
저장된다: 이들은 브라우저별, 오리진별로 관리되며 분석가 간에 공유되지 않는다.
네트워크 필터로 제한된 세션은 자신의 네트워크에서 발생한 이벤트만 볼 수 있으며, 이 제한은 이벤트 목록뿐만 아니라 카운트, 지도, 블랙리스트 엔드포인트에도 적용된다.
개별 주소에 대한 국가 및 ASN 보강 정보는 서버가 stat.ripe.net에서 조회하며, 결과를
캐시하여 자체 /ripe 엔드포인트에서 인터페이스로 제공한다. 브라우저는 Maltrail 외에는
아무것과도 통신하지 않는다. DISABLE_RIPE_LOOKUPS를 설정하면 아웃바운드 조회를 완전히
끌 수 있다. 조회가 없거나 인터넷 접속이 없는 호스트에서는 대신 로컬 RIR 테이블에서 국기를
가져오며, 인터페이스의 다른 모든 기능은 오프라인에서 작동한다.
성능
성능은 프로세서, 트래픽 구성, 트레일 세트 크기, 캡처 드라이버, 네트워크 인터페이스에 따라 달라진다. 아래 수치는 센서의 패킷 처리 경로를 단독으로 측정한 것이며, 종단 간 라이브 캡처 측정값이 아니다.
휴리스틱이 활성화되고 150만 행 트레일 세트를 사용하는 AMD Ryzen 7 PRO 4750U에서의 대표적인 측정값:
| 트래픽 | 패킷당 시간 |
|---|---|
| ICMP echo, 58바이트 | 101 ns |
| TCP SYN, 70바이트 | 302 ns |
| 대량 TLS, 1,473바이트 | 402 ns |
| 캐시가 웜 상태인 DNS 쿼리, 93바이트 | 452 ns |
| 혼합 트래픽, 평균 866바이트 | 552 ns |
| HTTP 요청, 169바이트 | 602 ns |
| 고유 이름을 사용한 DNS 쿼리, 93바이트 | 1,102 ns |
동일한 생성 캡처, 구성, 트레일 세트를 사용한 오프라인 비교 실행에서는 테스트된 시스템
전반에 걸쳐 폐기된 Python 센서보다 정상 상태 패킷당 비용이 14–37배 낮게 측정되었다.
이 수치는 트레일 로딩이 짧은 리플레이를 지배하기 때문에 전체 프로세스 시간과 정상 상태를
분리한 것이다. 탐지 자체는 sensor/tests/replay.rs의 42개 케이스 코퍼스로 별도로
검증된다.
대상 시스템에서 다음과 같이 측정한다:```bash cargo bench --manifest-path sensor/Cargo.toml --bench hotpath
하나의 캡처 워커가 기본적으로 사용됩니다. 추가 워커는 캡처 용량을 늘릴 수 있지만, Linux
플로우 해싱은 소스별 상태를 워커 간에 분할하므로 일부 스캔 휴리스틱의 민감도를
감소시킵니다. 문서화된 테스트에서 단일 워커 휴리스틱 경고의 91%가 두 워커에서 유지되었고,
네 워커에서 86%, 여덟 워커에서 65%가 유지되었습니다. 정확한 트레일 매칭은 변경되지 않았습니다.
캡처 드롭 메트릭이 필요하다고 나타낼 때만 `CAPTURE_FANOUT`을 늘리십시오.
벤치마크 방법론, 하드웨어 결과, 프로파일러 출력, 메모리 측정 및 라이브 팬아웃
검사는 [`sensor/docs/REPORT.md`](https://github.com/stamparm/maltrail/blob/master/sensor/docs/REPORT.md)에 문서화되어 있습니다.
## 설치
### 설치 프로그램
설치 프로그램은 열두 개의 Linux 배포판 — Debian, Ubuntu, Fedora, Rocky, AlmaLinux,
Arch, openSUSE Leap 및 Tumbleweed, 그리고 Alpine — 과 FreeBSD 및 macOS에서 모든 릴리스마다
검증되며, 전체 결과는 [`docs/compat`](https://github.com/stamparm/maltrail/blob/master/docs/compat)에 기록됩니다. Raspberry Pi OS 및 기타 64비트 ARM 시스템은
`aarch64` 빌드를 사용합니다. 32비트 ARM은 사전 빌드된 센서가 없으며 소스에서 빌드해야 합니다.```bash
curl -fsSL https://raw.githubusercontent.com/stamparm/maltrail/master/install.sh | sudo sh
의존성을 설치하고, /opt/maltrail 아래에 관리형 체크아웃을 생성하며, 사전 빌드된 센서의 체크섬을
검증하고, 비권한 maltrail 계정을 생성하며, systemd 유닛을 설치하고, 로그 및 상태 디렉터리를 준비한 뒤,
센서와 서버를 시작합니다. 설치 프로그램을 다시 실행하면 관리형 체크아웃이 업그레이드됩니다.
높은 권한으로 실행하기 전에 스크립트를 검토하십시오. 기존 체크아웃에서 드라이 런은 시스템을 변경하지 않고 명령을 표시합니다:```bash sh install.sh --dry-run
일반적인 설치 프로그램 옵션:```bash
sh install.sh --role sensor # Install only the sensor
sh install.sh --ref 3.1.2 # Install a release tag instead of master
sh install.sh --no-service # Install without changing systemd
sh install.sh --dry-run # Print commands without applying them
sh install.sh --uninstall # Remove the managed installation; keep logs and state
대시보드는 설치 후 http://127.0.0.1:8338에서 사용할 수 있습니다. 기본 제공되는
HTTP_ADDRESS는 0.0.0.0이므로 루프백뿐만 아니라 모든 인터페이스에서 접근할 수 있으며,
기본 자격 증명은 admin / changeme!입니다. 호스트가 신뢰할 수 없는 네트워크에 연결되기 전에
USERS를 변경하고 HTTP_ADDRESS를 127.0.0.1로 설정하거나(또는 TLS가 적용된 리버스 프록시
뒤에 서버를 배치) 하십시오.
최초 트레일 빌드는 몇 분 정도 걸릴 수 있습니다. 센서는 유효한 트레일 세트를 사용할 수 있을
때까지 트레일 일치를 감지하지 않습니다. systemd 유닛은 시작 전에 센서의 -T 검증을 실행하므로
권한 누락, 쓰기 불가능한 로그 디렉터리 또는 유효하지 않은 트레일 세트로 인해 시작이 눈에 띄게
실패합니다.
설치 프로그램 테스트 하네스는 열두 개의 배포판을 대상으로 하며, "설치되었다"가 검증 항목이
아닙니다. 각 배포판에서 서버를 시작하고 /ping을 요청하며, 센서에 -T로 자체 검증을 요청하고,
유닛의 경로가 해석되는지 확인하고, 설치 프로그램을 다시 실행하여 업그레이드가 운영자 구성을
유지하는지 증명하고, --uninstall을 실행합니다. 모든 결과는 플랫폼별로
docs/compat에 기록되며, 그곳의 페이지는 수작업으로 작성된 것이 아니라 해당
행들로부터 생성됩니다.
Alpine 및 기타 musl 시스템은 -musl 센서 빌드를 받습니다. 예전에는 미리 빌드된 바이너리가
glibc에 링크되어 있다는 안내를 받고 직접 컴파일하라는 말을 들었지만, 센서는 musl에서 네이티브로
빌드되고 실행되므로 이는 플랫폼 제한이 아니라 누락된 아티팩트였습니다.
소스에서 빌드
센서는 Rust 1.74 이상, libpcap 개발 헤더, 그리고 시스템의 capability 도구가 필요합니다. 서버와 트레일 업데이터는 Python 3.6 이상이 필요합니다.
배포판 패키지를 설치하십시오:```bash
Debian / Ubuntu / Raspberry Pi OS
sudo apt-get install cargo libpcap-dev libcap2-bin python3
RHEL / Fedora
sudo dnf install cargo libpcap-devel libcap python3
openSUSE / SLES
sudo zypper install cargo rust libpcap-devel libcap-progs python311
그런 다음 센서를 빌드하고 검증합니다:```bash
git clone --depth 1 https://github.com/stamparm/maltrail.git
cd maltrail
cargo build --release --manifest-path sensor/Cargo.toml
sudo setcap cap_net_raw,cap_net_admin=eip \
sensor/target/release/maltrail-sensor
sudo install -d -o "$USER" -g "$(id -gn)" -m 750 /var/log/maltrail
sensor/target/release/maltrail-sensor -T
sensor/target/release/maltrail-sensor
다른 터미널이나 다른 호스트에서 서버를 시작하십시오:```bash python3 server.py
미리 빌드된 센서 바이너리는 SHA-256 체크섬과 함께 최신 릴리스에 첨부되어 있습니다: Linux `x86_64`
및 `aarch64`는 glibc와 musl 모두 대상으로, macOS는 Apple silicon과 Intel, FreeBSD `amd64`, 그리고
Windows `x86_64`입니다.
glibc 빌드는 libpcap을 정적으로 링크하고 glibc 2.28을 대상으로 하므로, C 라이브러리만 있으면 됩니다 — RHEL 8+, Debian 10+, Ubuntu 18.04+ 및 Leap 15.x 모두에서 설치할 것이 없습니다. musl
빌드는 완전히 정적이므로 Alpine은 아무것도 필요로 하지 않습니다. Windows 빌드는 64비트이며 Windows 10 이상과
시작하기 전에 설치된 [Npcap](https://npcap.com)이 필요합니다 — `wpcap.dll`은 로드 시점 의존성이므로,
이것이 없으면 로더가 캡처 시점에 실패하는 대신 실행 파일을 거부합니다. 아카이브에도 그렇게 나와 있습니다.
**3.1.1 및 이전** 버전의 바이너리는 그렇지 않았습니다: libpcap을 동적으로 링크했고, AlmaLinux 빌드 호스트가 사용하는 이름으로 요청했습니다. Debian과 Ubuntu는 동일한 라이브러리를 더 오래된 이름인 `libpcap.so.0.8`로 제공하므로, 해당 바이너리들은 시작하기도 전에 중단됩니다 —```
./maltrail-sensor: error while loading shared libraries: libpcap.so.1: cannot open shared object file
— libpcap이 설치된 머신에서. install.sh가 누락된 이름을 대신 링크해 줍니다. 수동으로 하려면:```bash
adjust the directory for your architecture: aarch64-linux-gnu, or /usr/lib64 on RPM distributions
sudo ln -sf /usr/lib/x86_64-linux-gnu/libpcap.so.0.8 /usr/lib/x86_64-linux-gnu/libpcap.so.1 sudo ldconfig
### Systemd
제공된 `packaging/systemd/` 유닛은 두 프로세스를 모두 권한 없는 `maltrail` 사용자로 실행합니다. Systemd는 `/var/log/maltrail`과 `/var/lib/maltrail`을 생성하고, 파일 시스템 접근을 제한하며, 센서에 `CAP_NET_RAW`와 `CAP_NET_ADMIN`을 부여합니다.
설치 프로그램은 이러한 유닛을 자동으로 구성합니다. 기존 소스 설치의 경우, [`sensor/docs/INSTALL.md`](https://github.com/stamparm/maltrail/blob/master/sensor/docs/INSTALL.md)의 수동 서비스 절차를 따르십시오.
다음 명령으로 서비스 상태와 로그를 확인하십시오:```bash
systemctl status maltrail-sensor maltrail-server
journalctl -u maltrail-sensor -f
Docker
제공된 Compose 배포를 다음 명령으로 시작하세요:```bash docker compose -f docker/docker-compose.yml up -d
컨테이너 구성, 스토리지, 권한 및 상태 확인은
[`docker/README.md`](https://github.com/stamparm/maltrail/blob/master/docker/README.md)에 문서화되어 있습니다.
## 구성
Maltrail은 `maltrail.conf`를 읽으며, 이 파일에는 별도의 `[Sensor]` 및 `[Server]` 설정이 포함되어 있습니다. 설치 프로그램은 관리되는 구성을 `/etc/maltrail.conf`에 배치합니다.
자주 사용되는 센서 옵션은 다음과 같습니다:
| 옵션 | 용도 |
| --- | --- |
| `MONITOR_INTERFACE` | 캡처 인터페이스 또는 인터페이스들; `any`는 지원되는 모든 인터페이스를 선택합니다 |
| `CAPTURE_FILTER` | BPF 캡처 필터 |
| `CAPTURE_FANOUT` | Linux 캡처 소켓 수; 기본값은 하나입니다 |
| `CAPTURE_WORKERS` | 캡처 워커, 각각 하나의 소켓; 기본값은 `CAPTURE_FANOUT`이므로 둘 중 하나가 설정되지 않는 한 하나입니다 |
| `LOG_DIR` | 로컬 이벤트 로그 디렉터리 |
| `TRAILS_FILE` | 생성된 트레일 데이터베이스 |
| `LOG_SERVER` | 원격 Maltrail 이벤트 서버 |
| `SYSLOG_SERVER` | CEF syslog 대상 또는 대상들 |
| `LOGSTASH_SERVER` | Logstash JSON 대상 또는 대상들 |
| `STATS_ADDRESS` | Prometheus 메트릭 리스너; 구성되지 않으면 비활성화됩니다 |
| `UPDATE_PERIOD` | 트레일 새로 고침 간격 |
| `STATIC_TRAILS_URL` | 조립된 정적 트레일 세트를 가져오는 위치; 새 콘텐츠가 적용되는 시점을 제어하려면 날짜가 지정된 릴리스에 고정하세요 |
| `USER_WHITELIST` | 경고하지 않아야 하는 운영자 관리 지표 |
| `CUSTOM_TRAILS_DIR` | 운영자 관리 트레일 디렉터리 |
| `STATIC_TRAILS_DIR` | 선택적 trails 저장소 체크아웃; UI에서 트레일의 출처 인용을 표시하는 데만 사용됩니다 |
`PROCESS_COUNT`는 폐기된 Python 센서와 레거시 이벤트 로그 스로틀에 적용되며, Rust 센서의 워커 수를 설정하지 **않습니다**. 대신 `CAPTURE_FANOUT` 또는 `CAPTURE_WORKERS`로 캡처 워커를 구성하세요.
구성을 변경한 후 배포 검사를 실행하세요:```bash
sensor/target/release/maltrail-sensor -T
검사는 구성, 트레일, 화이트리스트 항목, 캡처 필터, 권한, 로그 저장소, 업데이트 지원, 워커 설정을 검증합니다. 성공적인 검사는 파일이 존재하는지만 확인하는 것이 아니라 긍정적인 트레일 및 화이트리스트 개수를 포함합니다.
트레일
트레일은 하나의 지표입니다 — 도메인, URL, IP 주소, IP:port 쌍, User-Agent, JA3/JA4
지문 또는 인증서 해시 — 와 그것이 의미하는 바, 그리고 어디에서 왔는지를 함께 나타냅니다. 업데이터는
네 가지 소스를 TRAILS_FILE로 다음 순서로 병합합니다:
| 소스 | 출처 |
|---|---|
| 피드 | feeds/*.py, 각 게시자로부터 배포 환경에서 직접 가져옴 |
| 사용자 정의 | CUSTOM_TRAILS_DIR 및 CUSTOM_TRAILS_URL, 자체 지표 |
| 정적 | stamparm/trails에서 조립된 세트로, STATIC_TRAILS_URL에서 가져옴; 별도 라이선스 |
| 엔진 목록 | data/mass_scanner*.txt, 거의 변경되지 않기 때문에 여기에 포함됨 |
정적 트레일은 자체 저장소에 있습니다. 탐지 콘텐츠는 하루에도 수십 번
변경되지만 엔진은 그렇지 않으며, 이들을 함께 두면 탐지를 업데이트하려면 코드를 가져와야 하고
이 저장소의 이력을 사용할 수 없게 만들었습니다. STATIC_TRAILS_URL은 가장 최근에 게시된
세트를 가리킵니다:```text
STATIC_TRAILS_URL https://github.com/stamparm/trails/releases/latest/download/trails.csv.gz
특정 `content-YYYYMMDD-HHMM` 릴리스를 지정하여 버전을 고정하면 잘못된 게시가 즉시 전역으로 퍼지지 않습니다. 이 세트는 `TRAILS_FILE` 옆에 캐시되며, 이것이 오프라인 또는 에어갭 재빌드를 가능하게 합니다. 게시된 `sha256`은 다운로드 전에 확인되므로, 콘텐츠 변경보다 더 자주 업데이트하는 배포는 11 MB가 아닌 65 바이트를 전송하며, 다이제스트와 일치하지 않는 페이로드는 캐시 대신 거부됩니다.
`update_trails()`는 성공적인 빌드 후에만 새로운 `TRAILS_FILE`을 원자적으로 게시합니다. 아무것도 반환하지 않는 피드는 이름으로 보고되므로, 배포가 조용히 은퇴한 소스에 무의식적으로 의존하지 않습니다.
자체 지표를 `CUSTOM_TRAILS_DIR` 아래에 추가하고, 절대 이벤트를 발생시켜서는 안 되는 것은 `USER_WHITELIST`에 추가하세요. 업그레이드가 덮어쓸 수 없도록 둘 다 설치 디렉터리 외부에 유지하세요.
정적 트레일 기여는 [stamparm/trails](https://github.com/stamparm/trails)로 보내고, 새로운 피드는 여기로 보냅니다. 어느 쪽이든 지표에는 분류와 누군가 확인할 수 있는 출처가 필요합니다 — [Contributing](#contributing)을 참조하세요.
## 이벤트 및 API
Maltrail은 탐지당 하나의 공백으로 구분된 이벤트를 기록하며, 값에 공백이 포함된 경우 CSV 인용을 사용합니다:```text
"<time>" <sensor> <src_ip> <src_port> <dst_ip> <dst_port> <proto> <type> <trail> "<info>" <reference>
type 필드는 무엇이 매칭되었는지를 식별하며, DNS, IP, IPORT, URL, PATH, HTTP,
UA, PORT, CERT, JA3, JA4를 포함합니다. info 필드는 트레일 분류를 담고 있으며,
reference는 이를 생성한 정적 목록, 피드, 사용자 정의 소스 또는 휴리스틱을 식별합니다.
JA3/JA4 유형은 TLS 클라이언트 지문에서 작동합니다. 임플란트의 TLS 스택은 모든
주소와 도메인 로테이션에서도 살아남기 때문에, 다른 모든 것이 소진된 후에도 해당 hello 해시는
계속 매칭됩니다(abuse.ch SSLBL JA3 피드에서 게시).
지표 조회
/check를 사용하여 하나의 도메인, IP 주소 또는 URL을 조회합니다:```bash
curl 'http://127.0.0.1:8338/check?q=www.sub.evil.example'
## 감사의 말
이 프로젝트에 영감을 주고 기여해 주신 모든 분들께 감사드립니다.```json
{
"query": "www.sub.evil.example",
"found": true,
"trail": "evil.example",
"info": "asyncrat (malware)",
"reference": "(static)",
"confidence": 100
}
confidence 필드(0-100, 사용할 수 없을 때는 null)는 소스가 해당 리스팅을 얼마나 강하게 뒷받침하는지를 나타냅니다. 단일 피드의 경우 40, 독립적으로 일치하는 추가 피드마다 +15씩 최대 100까지 증가하며, 운영자 자신의 사용자 정의 및 정적 항목에는 만점이 부여됩니다. 이 값은 trail 업데이트 시점에 피드 일치도를 기반으로 계산되어 trails.csv 옆의 trails.confidence 사이드카에 기록됩니다. UPDATE_SERVER에서 trail을 가져오는 서버는 점수를 매길 출처 정보가 없으므로 null을 보고합니다. 이를 활용하여 트리아지를 우선순위화하세요. 40점의 단일 피드 리스팅은 방화벽 규칙으로 채택되기 전에 재검토할 가치가 있습니다.
서브도메인 조회는 리스팅된 상위 도메인과 일치할 수 있습니다. URL 조회는 호스트만 확인하기 전에 host/path를 확인합니다. 서버는 메모리 매핑된 trail 데이터베이스를 읽고 재시작 없이 trail 업데이트를 관찰합니다.
공용 정적 및 피드 trail은 원격 센서에서 사용하는 /trails 엔드포인트와 일관되게 인증 없이 사용할 수 있습니다. 사용자 정의 trail은 권한이 부여된 세션이 필요하며, 권한이 없는 사용자 정의 전용 조회는 미스로 보고됩니다. 이벤트 데이터는 인증이 유지됩니다.
운영
모니터링
maltrail-sensor -T를 배포 및 구성 게이트로 사용하세요. 제공된 systemd 유닛은 이를 ExecStartPre로 실행합니다.
탐지 자체가 작동하는지 — 단순히 프로세스가 시작되는지가 아니라 — 확인하려면 다음을 실행하세요:```bash python3 server.py --detect-test
DNS 쿼리, IP, `IP:port`, URL 경로, `Host` 헤더에 대한 트레일 적중과 SQL 인젝션, 트래버설, RCE, XSS, 프록시 프로브, 싱크홀, `Host` 누락, 포트/웹/감염 스캐닝 휴리스틱을 포함한 에뮬레이션된 악성 트래픽의 조작된 pcap을 설치된 센서를 통해 재생하고, 예상되는 모든 탐지가 발동하는지 검증합니다. 루트 권한도, 인터페이스도, 자체 트레일 세트도 필요하지 않습니다. 정상 설치에서는 `20/20 detection(s) fired`가 출력됩니다.
`STATS_ADDRESS`가 설정된 경우, 최소한 다음 Prometheus 메트릭을 모니터링하십시오:
| 메트릭 | 운영상 의미 |
| --- | --- |
| `maltrail_up == 0` | 캡처 워커가 실행되고 있지 않음 |
| `maltrail_capture_dropped_total` 증가 | 캡처 링이 패킷을 드롭하고 있음 |
| `maltrail_local_log_errors_total` 증가 | 이벤트가 생성되었지만 로컬에 기록될 수 없었음 |
| `maltrail_remote_log_errors_total` 증가 | 이벤트가 원격 싱크로 전달될 수 없었음; `DISABLE_LOCAL_LOG_STORAGE` 사용 시 이벤트가 유실됨 |
| `maltrail_trail_generation`이 증가하지 않음 | 활성 트레일 세트가 갱신되지 않고 있음 |
| `maltrail_log_dir_free_bytes` | 로컬 이벤트 저장을 위한 남은 용량 |
| `maltrail_state_saturations_total` 증가 | 휴리스틱 상태 한계에 도달했음 |
| `maltrail_throttle_evictions_total` 증가 | 이벤트 스로틀 테이블이 상한에 도달하여, 설정된 것보다 이른 시점에 이벤트가 집계됨 |
상태 포화는 해당 휴리스틱에 영향을 미치며, 정확한 트레일 매칭은 계속 활성 상태로 유지됩니다.
`SIGHUP`을 보내거나 `systemctl reload maltrail-sensor`를 사용하여 트레일 재로드를 요청하십시오. 다른 프로세스에 의해 업데이트된 트레일 파일은 자동으로 감지되어 센서를 재시작하지 않고도 워커에 게시됩니다.
압축된 관측 가능 저장소(`USE_CONDENSED_STORAGE`, `meta.sqlite`)는 서버의 신규성 및 레트로 헌트 뷰를 지원합니다. 일별 이벤트 로그 사이드카 인덱스(`USE_EVENT_INDEX`, `LOG_DIR/index/*.sqlite`, 디스크에서 대략 로그 크기의 두 배)는 `/counts`를 정확하게 하고 `/hunt`를 빠르게 만드는 요소입니다. 이 인덱스는 로그 자체로부터 증분적으로 유지 관리되며 `server.py --rebuild-index`로 재구축할 수 있습니다. 폐기된 센서와의 호환성은 [`sensor/docs/COMPATIBILITY.md`](https://github.com/stamparm/maltrail/blob/master/sensor/docs/COMPATIBILITY.md)에 문서화되어 있습니다.
### 이벤트 보존
Maltrail은 이벤트 로그를 로테이션하거나 삭제하지 않습니다. 운영자는 저장 요구 사항과 조직 정책에 따라 보존, 아카이빙, 삭제를 정의할 책임이 있습니다.
권장 사례:
- `LOG_SERVER`, `SYSLOG_SERVER`, `LOGSTASH_SERVER`를 사용하여 내구성 있는 이벤트 사본을 원격 Maltrail 서버 또는 SIEM으로 전송하십시오.
- 예상 이벤트 발생률에 충분한 여유를 두고 `maltrail_log_dir_free_bytes`에 대한 알림을 설정하십시오.
- 외부 도구를 사용하여 로컬 일별 로그를 로테이션, 아카이빙 또는 제거하십시오.
- 보고 인터페이스에 필요한 파일은 `LOG_DIR`에 압축하지 않은 상태로 유지하고, 압축 파일은 다른 곳에 아카이빙하십시오.
로그 파일 시스템이 가득 차면 센서는 이벤트를 추가할 수 없습니다. 이벤트 로그에는 일부 관할권에서 개인 데이터로 규제되는 IP 주소와 도메인이 포함될 수 있으므로, 보존 정책은 해당 요구 사항을 고려해야 합니다.
### 합성 트래픽
실제 트래픽을 기다리지 않고 탐지와 대시보드가 모두 여전히 작동하는지 확인하려면:```bash
python3 server.py --detect-test # assert every detection fires, then exit
python3 server.py --detect-test --keep DIR --serve # ...and keep the events, serving them on :8338
--keep는 또한 sensor/tests/corpus/를 동일한 로그로 재생하고, 대시보드가 다르게 렌더링하는 도형 중 이벤트가 뒤따르는 것을 출력하므로, 누락된 아이콘, 색상 또는 글리프가 추정되지 않고 가시화됩니다. 타임스탬프는 가장 최근 날짜가 오늘이 되도록 이동됩니다. 센서 바이너리가 필요합니다(cargo build --release --manifest-path sensor/Cargo.toml).
공개 데모의 데이터는 이러한 실행에서 재생성됩니다:```bash python3 sensor/tools/gen_demo_js.py --from DIR/logs # tops up html/js/demo.js
## 문서
| 문서 | 내용 |
| --- | --- |
| [`sensor/docs/INSTALL.md`](https://github.com/stamparm/maltrail/blob/master/sensor/docs/INSTALL.md) | 설치, 권한, 구성 및 문제 해결 |
| [`sensor/docs/ARCHITECTURE.md`](https://github.com/stamparm/maltrail/blob/master/sensor/docs/ARCHITECTURE.md) | 센서 내부 구조 및 데이터 흐름 |
| [`sensor/docs/COMPATIBILITY.md`](https://github.com/stamparm/maltrail/blob/master/sensor/docs/COMPATIBILITY.md) | 폐기된 Python 센서와의 의도적인 차이점 |
| [`sensor/docs/REPORT.md`](https://github.com/stamparm/maltrail/blob/master/sensor/docs/REPORT.md) | 측정값, 프로필 및 테스트 결과 |
| [`sensor/docs/ROADMAP.md`](https://github.com/stamparm/maltrail/blob/master/sensor/docs/ROADMAP.md) | 진행 중인 센서 작업 |
| [`SekuriPy Labs`](https://www.sekuripy.hr/labs/maltrail/) | 엔지니어링 노트, 벤치마크 및 분석 글 |
## 기여
트레일 추가, 피드 유지 관리, 버그 보고, 문서화 및 센서 개선을 환영합니다.
트레일 제출에는 신뢰할 수 있는 출처가 포함되어야 하며, 가능한 한 가장 좁은 범위의
적절한 분류를 사용해야 합니다.
코드를 제출하기 전에 관련 검사를 실행하십시오. 전체 센서 게이트는 다음과 같습니다:```bash
bash sensor/tools/check.sh
포맷팅, 경고를 거부하는 Clippy, 그리고 디버그 및 릴리스 테스트 스위트를 실행합니다. Python 서버 스위트는 다음으로 실행하세요:```bash bash tests/run.sh python3
Linux에서 Windows 빌드를 실행할 수 있으며, 바로 이 과정에서 버그들이 발견되었습니다:```bash
sh sensor/tools/check_windows.sh
mingw-w64로 센서를 크로스 컴파일하고, 설치 프로그램(NSIS 아카이브이므로 아무것도 설치되지 않음)에서 Npcap의 사용자 공간 라이브러리를 추출한 뒤, 결과물을 Wine에서 실행합니다 — 전체 단위 테스트 스위트, 배포된 구성에 대한 -T, 네이티브 바이너리와 바이트 단위로 비교하는 pcap 코퍼스, 그리고 Windows Python에서 /ping에 응답하는 서버까지 포함됩니다. 라이브 캡처만은 다룰 수 없는데, 이를 위해서는 Npcap의 커널 드라이버와 실제 Windows 머신이 필요합니다. 필수 조건은 gcc-mingw-w64-x86-64, wine, p7zip-full입니다.
프로젝트
라이선스
요약: Maltrail은 MIT 라이선스이지만, Maltrail Trails 데이터셋은 별도의 조건을 가집니다. 독립적인 IOC 조회/참조는 문제없지만, 상업적 제품이나 서비스에서 Trails를 인텔리전스 소스로 체계적으로 사용하려면 허가/라이선스가 필요합니다.
Maltrail은 MIT 라이선스로 배포됩니다. LICENSE를 참조하세요.
이것은 엔진입니다. 정적 trail 세트는 별도의 조건에 따른 별도 작업입니다: 내부 방어적 사용, 연구 및 교육에는 무료이지만, 상업적 제품, 서비스, MSSP 또는 MDR 제공, 또는 재배포되는 피드에는 라이선스가 필요합니다. MIT 엔진이라고 해서 콘텐츠를 자유롭게 판매할 수 있는 것은 아닙니다 — 유료로 제공하는 무언가에 포함시키기 전에 stamparm/trails의 LICENSE.md를 확인하세요.
메인테이너
- Miroslav Stampar (@stamparm)
- Mikhail Kasimov (@MikhailKasimov)
스폰서
발표 및 간행물
- 47th TF-CSIRT Meeting, Prague, 2016 (slides)
- Detect attacks on your network with Maltrail, Linux Magazine, 2022 (article)
- Best Cyber Threat Intelligence Feeds, Silent Push, 2022 (review)
- Research on Network Malicious Traffic Detection System Based on Maltrail, Nanotechnology Perceptions, 2024 (paper)
서드파티 통합
- FreeBSD Port
- OPNsense Gateway Plugin
- D4 Project
- BlackArch Linux
- Validin
- Maltrail Add-on for Splunk
- Maltrail decoder and rules for Wazuh
- GScan (trails만 해당)
- MalwareWorld (trails만 해당)
- oisd domain blocklist (trails만 해당)
- NextDNS (trails만 해당)
- NoTracking (trails만 해당)
- OWASP Mobile Audit (trails만 해당)
- Mobile Security Framework MobSF (trails만 해당)
- pfBlockerNG-devel (trails만 해당)
- Sansec eComscan (trails만 해당)
- Palo Alto Networks Cortex XSOAR (trail 커넥터)
감사의 글
- Thomas Kristner
- Eduardo Arcusa Les
- James Lay
- Ladislav Baco (@laciKE)
- John Kristoff (@jtkdpu)
- Michael Münz (@mimugmail)
- David Brush
- @Godwottery
- Chris Wild (@briskets)
- Keith Irwin (@ki9us)
- Simon Szustkowski (@simonszu)