
maltrail v2.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에는 탐지된 트래픽을 탐색하기 위한 브라우저 기반 보고 인터페이스가 포함되어 있으며, 실시간 업데이트, 필드 인식 검색, 레트로 헌팅, 지리적 뷰, 트리아지, 저장된 뷰 및 내보내기를 지원합니다.

인터페이스는 HTTP_ADDRESS:HTTP_PORT에서 server.py가 제공합니다. 순수 JavaScript로 작성되었으며 단일 타사 런타임 의존성(PapaParse, CSV 파싱용)이 있고 빌드 단계가 없습니다. 한 번에 하루씩 조회하며, 사용 가능한 일별 로그에 대한 이벤트 밀도 그리드를 겸하는 날짜 선택기로 선택합니다. 이벤트는 /events에서 스트리밍되어 브라우저에서 위협으로 집계됩니다. 각 고유 (소스, 트레일)당 한 행씩 표시되며, 정렬 가능한 그리드와 세부 패널로 표시됩니다.
| 기능 | 설명 |
|---|---|
| 실시간 모드 | 추가된 이벤트는 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 테이블에서 플래그를 가져오며 인터페이스의 다른 모든 기능은 오프라인에서 작동합니다.
성능
성능은 프로세서, 트래픽 구성, 트레일 세트 크기, 캡처 드라이버 및 네트워크 인터페이스에 따라 달라집니다. 아래 수치는 센서의 패킷 처리 경로를 단독으로 측정한 것으로, 종단 간 실시간 캡처 측정값이 아닙니다.
AMD Ryzen 7 PRO 4750U에서 휴리스틱을 활성화하고 150만 행 트레일 세트로 측정한 대표 수치:
| 트래픽 | 패킷당 시간 |
|---|---|
| ICMP 에코, 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)에 문서화되어 있습니다.
## 설치
### 설치 프로그램
설치 프로그램은 Debian, Ubuntu, Raspberry Pi OS, RHEL, Fedora 및 openSUSE를 지원합니다:```bash
curl -fsSL https://raw.githubusercontent.com/stamparm/maltrail/master/install.sh | sudo sh
의존성을 설치하고, /opt/maltrail 아래에 관리형 체크아웃을 생성하며, 사전 빌드된 센서의 체크섬을 검증하고, 권한이 없는 maltrail 계정을 만들고, systemd 유닛을 설치하며, 로그 및 상태 디렉터리를 준비한 다음 센서와 서버를 시작합니다. 설치 프로그램을 다시 실행하면 관리형 체크아웃이 업그레이드됩니다.
상승된 권한으로 실행하기 전에 스크립트를 검토하세요. 기존 체크아웃에서 드라이 런을 수행하면 시스템을 변경하지 않고 명령만 표시합니다.```bash sh install.sh --dry-run
Common installer options:```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 검증을 실행하므로, 권한 누락, 쓰기 불가능한 로그 디렉터리 또는 잘못된 트레일 세트가 있으면
시작이 명확하게 실패합니다.
설치 프로그램 테스트 하네스는 Ubuntu, Debian, Fedora, openSUSE 및 Alpine 컨테이너를 다룹니다. Alpine은 musl을 사용하며 사전 빌드된 glibc 센서 바이너리를 사용하지 않습니다. 해당 환경에서는 소스에서 센서를 빌드하십시오.
소스에서 빌드하기
센서에는 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
Prebuilt `x86_64` 및 `aarch64` 센서 바이너리는 SHA-256 체크섬과 함께 현재 릴리스에 첨부되어 있습니다. 이들은 libpcap을 정적으로 링크하고 glibc 2.28을 대상으로 하므로, RHEL 8+, Debian 10+, Ubuntu 18.04+ 및 Leap 15.x에서 C 라이브러리만 있으면 됩니다 — 설치할 것이 없습니다. Alpine Linux와 같은 musl 기반 시스템에서는 소스에서 빌드하세요.
**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은 별도의 `[Sensor]` 및 `[Server]` 설정을 포함하는 `maltrail.conf`를 읽습니다.
설치 프로그램은 관리되는 구성을 `/etc/maltrail.conf`에 배치합니다.
자주 사용되는 센서 옵션은 다음과 같습니다:
| 옵션 | 용도 |
| --- | --- |
| `MONITOR_INTERFACE` | 캡처 인터페이스 또는 인터페이스들; `any`는 지원되는 모든 인터페이스를 선택합니다 |
| `CAPTURE_FILTER` | BPF 캡처 필터 |
| `CAPTURE_FANOUT` | Linux 캡처 소켓 수; 기본값은 1입니다 |
| `CAPTURE_WORKERS` | 캡처 워커, 각각 하나의 소켓을 사용; 기본값은 `CAPTURE_FANOUT`이므로, 둘 중 하나가 설정되지 않으면 1입니다 |
| `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` | 트레일 저장소의 선택적 체크아웃; UI에서 트레일의 출처 인용을 표시하는 데만 사용됩니다 |
`PROCESS_COUNT`는 폐기된 Python 센서와 레거시 이벤트 로그 스로틀에 적용되며,
Rust 센서의 워커 수를 설정하지 **않습니다**. 캡처 워커는 `CAPTURE_FANOUT` 또는
`CAPTURE_WORKERS`로 구성하세요.
구성을 변경한 후 배포 검사를 실행하세요:```bash
sensor/target/release/maltrail-sensor -T
The check validates configuration, trails, whitelist entries, capture filter, privileges, log storage, update support, and worker settings. A successful check includes positive trail and whitelist counts rather than only confirming that files exist.
Trails
A trail is one indicator — a domain, URL, IP address, IP:port pair, User-Agent, JA3/JA4
fingerprint or certificate hash — together with what it means and where it came from. The updater
merges four sources into TRAILS_FILE, in this order:
| source | where it comes from |
|---|---|
| Feeds | feeds/*.py, fetched directly by your deployment from each publisher |
| Custom | CUSTOM_TRAILS_DIR and CUSTOM_TRAILS_URL, your own indicators |
| Static | the assembled set from stamparm/trails, fetched from STATIC_TRAILS_URL |
| Engine lists | data/mass_scanner*.txt, shipped here because they change rarely |
The static trails live in their own repository. Detection content changes tens of times a
day; the engine does not, and keeping them together meant updating detection required pulling code
and made this repository's history unusable. STATIC_TRAILS_URL points at the newest published
set:```text
STATIC_TRAILS_URL https://github.com/stamparm/trails/releases/latest/download/trails.csv.gz
`content-YYYYMMDD-HHMM` 릴리스를 지정하면 버전을 고정할 수 있으므로, 잘못된 게시가 즉시 전역에 퍼지지 않습니다. 세트는 `TRAILS_FILE` 옆에 캐시되며, 이 덕분에 오프라인 또는 에어갭 재빌드가 가능합니다. 게시된 `sha256`은 다운로드 전에 확인되므로, 콘텐츠 변경보다 더 자주 업데이트되는 배포는 11MB 대신 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'
I’m ready to translate the Kitploit tool content from English to Korean. Please provide chunk 35 of 43.```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까지, 그리고 운영자의 자체 커스텀 및 정적 항목에는 만점이 부여됩니다. 이 값은 트레일 업데이트 시점에 피드 일치도로부터 계산되어 trails.csv 옆에 trails.confidence 사이드카로 저장됩니다. UPDATE_SERVER에서 트레일을 가져오는 서버는 출처를 점수화할 근거가 없으므로 null을 보고합니다. 이를 사용하여 트리아지 우선순위를 정하세요 — 40점의 단일 피드 목록은 방화벽 규칙으로 승격되기 전에 재검토할 가치가 있습니다.
서브도메인 조회는 나열된 상위 도메인과 일치할 수 있습니다. URL 조회는 호스트 단독으로 확인하기 전에 host/path를 먼저 확인합니다. 서버는 메모리 매핑된 트레일 데이터베이스를 읽고 재시작 없이 트레일 업데이트를 관찰합니다.
공개 정적 및 피드 트레일은 원격 센서가 사용하는 /trails 엔드포인트와 일관되게 인증 없이 사용할 수 있습니다. 커스텀 트레일은 인증된 세션이 필요합니다. 인증되지 않은 커스텀 전용 조회는 미스로 보고됩니다. 이벤트 데이터는 인증된 상태로 유지됩니다.
운영
모니터링
maltrail-sensor -T를 배포 및 구성 게이트로 사용하세요. 제공된 systemd 유닛은 이를 ExecStartPre로 실행합니다.
탐지 자체가 작동하는지 — 프로세스가 시작되는 것만이 아니라 — 확인하려면 다음을 실행하세요:```bash python3 server.py --detect-test
설계된 악성 트래픽의 pcap(트레일 히트는 DNS 쿼리, IP, `IP:port`, URL 경로 및 `Host` 헤더에 대해 발생하며, SQL 인젝션, 경로 탐색, RCE, XSS, 프록시 프로브, 싱크홀, `Host` 누락 및 포트/웹/감염 스캐닝 휴리스틱도 포함)을 재생하여 설치된 센서를 통해 실행하고, 예상된 모든 탐지가 발생하는지 검증합니다. 루트 권한, 인터페이스 또는 자체 트레일 세트가 필요하지 않습니다. 정상적으로 설치된 경우 `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`, 디스크에서 로그 크기의 약 2배)는 `/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 주소와 도메인이 포함될 수 있습니다. 보존 정책은 적용 가능한 요구 사항을 고려해야 합니다.
## 문서
| 문서 | 내용 |
| --- | --- |
| [`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
It runs formatting, Clippy with warnings denied, and the debug and release test suites. Run the Python server suite with:```bash bash tests/run.sh python3
## 프로젝트
### 라이선스
Maltrail은 MIT 라이선스로 배포됩니다. [`LICENSE`](https://github.com/stamparm/maltrail/blob/master/LICENSE)를 참조하세요.
### 관리자
- Miroslav Stampar ([@stamparm](https://github.com/stamparm))
- Mikhail Kasimov ([@MikhailKasimov](https://github.com/MikhailKasimov))
### 후원자
- [Sansec](https://sansec.io/) (2024–2025)
- [Sansec](https://sansec.io/) (2020–2021)
### 발표 및 간행물
- 47th TF-CSIRT Meeting, Prague, 2016
([슬라이드](https://web.archive.org/web/20161109135211/https://www.terena.org/activities/tf-csirt/meeting47/M.Stampar-Maltrail.pdf))
- _Detect attacks on your network with Maltrail_, Linux Magazine, 2022
([기사](https://www.linux-magazine.com/Issues/2022/258/Maltrail))
- _Best Cyber Threat Intelligence Feeds_, Silent Push, 2022
([리뷰](https://www.silentpush.com/blog/best-cyber-threat-intelligence-feeds))
- _Research on Network Malicious Traffic Detection System Based on Maltrail_, Nanotechnology
Perceptions, 2024
([논문](https://nano-ntp.com/index.php/nano/article/view/1915/1497))
### 파생 블랙리스트
`malware/` 정적 트레일에서 파생된 도메인 전용 목록은
[`maltrail-malware-domains.txt`](https://raw.githubusercontent.com/stamparm/aux/master/maltrail-malware-domains.txt)에 게시되어 있습니다.
DNS 필터링 시스템의 입력으로 사용할 수 있지만, 운영자는 차단을 활성화하기 전에 이를 검토하고 테스트해야 합니다.
위협 인텔리전스 목록에는 오탐(false positive) 또는 모든 환경에 적합하지 않은 지표가 포함될 수 있습니다.
### 타사 통합
- [FreeBSD Port](https://www.freshports.org/security/maltrail)
- [OPNsense Gateway Plugin](https://github.com/opnsense/plugins/pull/1257)
- [D4 Project](https://www.d4-project.org/2019/09/25/maltrail-integration.html)
- [BlackArch Linux](https://github.com/BlackArch/blackarch/blob/master/packages/maltrail/PKGBUILD)
- [Validin](https://x.com/ValidinLLC/status/1719666086390517762)
- [Maltrail Add-on for Splunk](https://splunkbase.splunk.com/app/7211)
- [Maltrail decoder and rules for Wazuh](https://github.com/MikhailKasimov/maltrail-wazuh-decoder-and-rules)
- [GScan](https://github.com/grayddq/GScan) (트레일 전용)
- [MalwareWorld](https://www.malwareworld.com/) (트레일 전용)
- [oisd domain blocklist](https://oisd.nl/?p=inc) (트레일 전용)
- [NextDNS](https://github.com/nextdns/metadata/blob/e0c9c7e908f5d10823b517ad230df214a7251b13/security/threat-intelligence-feeds.json) (트레일 전용)
- [NoTracking](https://github.com/notracking/hosts-blocklists/blob/master/SOURCES.md) (트레일 전용)
- [OWASP Mobile Audit](https://github.com/mpast/mobileAudit#environment-variables) (트레일 전용)
- [Mobile Security Framework MobSF](https://github.com/MobSF/Mobile-Security-Framework-MobSF/commit/12b07370674238fa4281fc7989b34decc2e08876) (트레일 전용)
- [pfBlockerNG-devel](https://github.com/pfsense/FreeBSD-ports/blob/devel/net/pfSense-pkg-pfBlockerNG-devel/files/usr/local/www/pfblockerng/pfblockerng_feeds.json) (트레일 전용)
- [Sansec eComscan](https://sansec.io/kb/about-ecomscan/ecomscan-license) (트레일 전용)
- [Palo Alto Networks Cortex XSOAR](https://xsoar.pan.dev/docs/reference/integrations/github-maltrail-feed) (트레일 커넥터)
### 감사의 말
- 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)