
LLM 우선의 속임수 프레임워크: "대답하는 허니팟!™"

honeyprompt 소개: LLM 우선의 속임수 프레임워크로, 웹 개발자를 위해/에 의해 만들어졌습니다. @alectrocute의 개인 열정 프로젝트입니다.
모든 주요 클라우드 및 로컬 LLM 제공자를 지원합니다. SSH, HTTP, TLS, TCP, 텔넷 등. 작은 컨테이너(단일 정적 바이너리)로 제공되며 모든 설정은 하나의 honeyprompt.yaml에 있습니다.
컴파일할 플러그인도, 실행할 데이터베이스도 필요 없으며, 쉽게 확장 가능하고 저사양 하드웨어에 배포할 수 있습니다.
데모 인스턴스는 172.233.151.216에서 사용할 수 있으며, 인증되지 않은 웹 패널은 여기: http://172.233.151.216:9090입니다. 저렴한 Linode VPS에서 실행되는 honeyprompt의 공개 인스턴스로, 유일한 LLM 제공자/모델로 openrouter/free를 사용합니다.
2026년에 가장 쉬운 설정을 위해 Docker와 OpenRouter/openrouter/free를 LLM 제공자로 권장합니다. 모든 주요 클라우드 및 로컬 LLM 제공자가 지원됩니다. 세 개의 파일과 하나의 명령어로 전체 기본 배포(7개의 LLM 기반 유인책, 지속적인 이벤트 저장 및 운영자 패널)를 실행합니다.
1. 기본 설정, 컴포즈 파일 및 환경 템플릿을 가져옵니다:
# Docker가 없다면:
# curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh
mkdir honeypot && cd honeypot
wget https://raw.githubusercontent.com/alectrocute/honeyprompt/main/honeyprompt.yaml
wget https://raw.githubusercontent.com/alectrocute/honeyprompt/main/compose.yaml
wget -O .env https://raw.githubusercontent.com/alectrocute/honeyprompt/main/.env.example
(또는 저장소를 클론하고 cd로 들어가면 동일한 세 파일입니다.)
2. .env를 채웁니다. 두 값이 필요합니다:
OPENROUTER_API_KEY=sk-or-... # 지출 한도가 있는 전용 키 사용
HONEYPROMPT_PANEL_PASSWORD=changeme # 패널의 기본 인증 비밀번호
3. 시작합니다:
docker compose up -d
4. 테스트합니다:
ssh -p 2222 root@localhost # 비밀번호: root — 그런 다음 아무거나 입력
curl http://localhost:2375/v1.54/containers/json # "노출된" Docker API
5. 읽기 전용 패널에서 확인합니다 http://127.0.0.1:9090 (패널 비밀번호로 admin으로 로그인). 모든 연결, 자격 증명 및 명령이 실시간으로 스트리밍됩니다. 원격 호스트에 배포한 경우 compose.yaml에서 :9090 포트를 노출해야 합니다. 프로덕션 배포에는 권장되지 않습니다.
프로덕션 배포에서는
latest대신 번호가 지정된 릴리스를 고정하세요..env에서HONEYPROMPT_IMAGE를 설정하십시오.
방금 다운로드한 honeyprompt.yaml은 완전히 주석이 달린 쇼케이스입니다. 다음과 같은 프로필을 제공합니다:
/는 기본 nginx 환영 페이지를 즉시 제공하고, 더 깊은 경로는 LLM으로 넘어가 공격자가 계속 클릭하도록 유도하는 전체 HTML/CSS 인트라넷 페이지, 로그인 양식 및 관리자 패널을 생성합니다.[!IMPORTANT] LLM을 사용하더라도 가장 자주 사용되는 경로를 파악하고 정적 규칙을 추가하세요. 이렇게 하면 LLM 토큰을 대량으로 절약하고 LLM 호출 비용이 들지 않는 요청에 대한 응답 속도를 높일 수 있습니다. 무작위 예시:
whoami, 헬스 체크, 파비콘, 버전 프로브 등.
다음 최소 honeyprompt.yaml은 두 개의 정적 규칙과 LLM 없이 SSH 상자를 가짜로 만듭니다:
panel:
enabled: true
address: "0.0.0.0:8080"
events:
buffer: 2000
file: /data/events.jsonl # 지속적인 공격자 활동
services:
- protocol: ssh
address: "0.0.0.0:2222"
description: "Ubuntu 26.04 LTS build runner"
serverName: "gpu-runner-07"
passwordRegex: "^(root|admin|123456)$" # "작동하는" 비밀번호
commands:
- regex: "^whoami$"
handler: "root"
- regex: "^(.+)$"
handler: "bash: command not found"
docker run --rm \
-p 2222:2222 -p 8080:8080 \
-v "$(pwd)/honeyprompt.yaml:/etc/honeyprompt/honeyprompt.yaml:ro" \
-v honeyprompt-data:/data \
alectrocute/honeyprompt:latest
지속적인 배포를 위해 포함된 compose.yaml을 사용하세요. 배포 가이드에서는 Docker Hub 릴리스, 필요한 GitHub 시크릿, 포트 및 방화벽 설정, SSH를 통한 패널 접근, 업그레이드, 롤백, 이벤트 저장 및 격리 등을 다룹니다.
허니팟이 잘해야 하는 것은 단 한 가지입니다: 공격자가 계속 입력할 만큼 오랫동안 설득력 있게 유지되는 것입니다. 공격자가 실행하는 모든 명령은 정보입니다 — 그들이 사용하는 도구, 재사용하는 자격 증명, 패치되지 않았다고 가정하는 CVE. 정적 허니팟은 작성자가 예상하지 못한 명령이 실행되는 순간 그 역할을 깨뜨립니다. honeyprompt는 그 순간을 LLM에 넘겨서 셸이 dmesg | tail이나 cat /etc/shadow에 실제 시스템처럼 응답하고 세션이 계속 유지되도록 합니다.
이 프로젝트에 영감을 준 Galah(최초 LLM 허니팟?)에 대한 Adel Karimi의 훌륭한 DEF CON 32 발표를 확인하세요: https://www.youtube.com/watch?v=XGsm4Qcc_Ag
이 부분을 먼저 이해하는 것이 중요합니다. 두 스트림은 의도적으로 분리되어 있습니다:
별도로 구성합니다:
# 꿀: 공격자 활동.
events:
buffer: 2000 # 패널용 최근 이벤트를 메모리에 유지
file: /data/events.jsonl # 모든 이벤트를 JSON Lines로 지속
# 런타임 자체 진단.
logging:
level: info # debug | info | warn | error
format: text # 콘솔에 표시 방식: text (사람 읽기) 또는 json
file: /data/honeyprompt.log # 선택 사항; 디스크에는 항상 JSON
events.jsonl은 각 줄에 하나의 독립적인 JSON 객체입니다 — tail -f, SIEM으로 전송, 또는 jq로 재생할 준비가 되어 있습니다. 위의 Docker 명령은 honeyprompt-data라는 이름의 볼륨을 /data에 마운트하므로 이벤트는 컨테이너 교체 후에도 유지됩니다. 두 파일 모두 추가되며 정상 종료 시 플러시됩니다.
format은 운영 로그가 콘솔에 렌더링되는 방식에만 영향을 줍니다. 운영 로그 _파일_은 활성화되면 항상 구조화된 JSON이므로 구문 분석하기 쉽습니다.

선택적이며 읽기 전용 대시보드가 속임수 이벤트를 실시간으로 스트리밍하고, 프로토콜별로 분류하며, 한 번의 클릭으로 모든 것을 JSON으로 내보냅니다:
panel:
enabled: true
address: "0.0.0.0:8080"
auth: # 선택적 기본 인증
username: admin
password: "${HONEYPROMPT_PANEL_PASSWORD}"
대시보드는 바이너리에 포함된 일반 HTML, CSS 및 JavaScript(src/panel/assets)입니다. auth를 정의하지 않으면 인증을 비활성화합니다.
각 제공자는 자체 시간 초과, 재시도, 속도 제한 및 헤더가 있는 자체 모듈입니다. 키는 환경에서 가져옵니다. 기본 제공:
| 제공자 | type | 참고 사항 |
|---|---|---|
| Ollama | ollama | 로컬 모델; 기본값 localhost:11434 |
| llama.cpp | llamacpp | 로컬 server OpenAI 엔드포인트 |
| OpenAI | openai | OPENAI_API_KEY |
| Azure OpenAI | azure | azure.deployment + azure.apiVersion 필요 |
| OpenRouter | openrouter | OPENROUTER_API_KEY |
| Anthropic | anthropic | ANTHROPIC_API_KEY |
| Google Gemini | google | GEMINI_API_KEY |
| 모든 OpenAI 형태 | openai-compatible | 게이트웨이에 baseUrl 지정 |
제공자를 구성하고 pool.strategy(round-robin, weighted, random 또는 failover)를 선택하면 honeyprompt가 트래픽을 분산시킵니다. 선택한 제공자가 시간 초과되거나 재시도 가능한 오류를 반환하면 honeyprompt가 투명하게 다음 제공자로 장애 조치합니다 — 죽은 백엔드가 허니팟을 오프라인으로 만들지 않습니다. 재시도 불가능한 오류(예: 잘못된 API 키)는 계단식 전파를 중단하여 조용히 할당량을 소모하는 대신 오류를 발견할 수 있도록 합니다.
서비스는 자체 제공자 하위 집합을 지정하지 않으면 글로벌 풀을 사용합니다:
llm:
enabled: true
providers: [local-ollama] # 하나의 이름: 이 서비스를 이 제공자로 강제
여러 이름을 나열하면 로드 밸런싱 및 장애 조치를 유지하지만 해당 하위 집합 내에서만 가능합니다:
llm:
enabled: true
providers: [openai-primary, openrouter-backup]
여러 서비스가 동일한 제공자 그룹을 공유해야 하거나 하위 집합이 글로벌 풀 대신 자체 전략이 필요한 경우 명명된 풀을 정의합니다. 풀에는 이름, 전략 및 정렬된 제공자 목록이 있으며 서비스는 제공자를 지정하는 모든 곳에서 이름으로 참조할 수 있습니다:
pools:
- name: cheap-first
strategy: failover # 먼저 로컬 모델 시도, 실패 시 유료 API로 전환
order: [local-ollama, openrouter]
- name: spread
strategy: round-robin
order: [openrouter, openai]