
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를 정의하지 않으면 인증을 비활성화합니다.
각 제공자는 자체 시간 초과, 재시도, 속도 제한 및 헤더가 있는 자체 모듈입니다. 키는 환경에서 가져옵니다. 기본 제공:
제공자를 구성하고 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]
services:
- protocol: ssh
# ...
llm:
enabled: true
providers: [cheap-first] # 풀 이름, 제공자 대신 사용
- protocol: http
# ...
llm:
enabled: true
providers: [spread]
풀 이름은 providers의 유일한 항목이어야 합니다. 하나의 목록에 개별 제공자와 풀을 혼합하는 것은 허용되지 않습니다. 어떤 전략이 우선하는지 모호하기 때문입니다. 풀 이름은 제공자 이름과 동일한 네임스페이스에 있으며 충돌할 수 없습니다.
"정규식과 일치" 또는 "모델에 질문"만으로 충분하지 않을 때 훅을 사용하면 요청 및 응답 경로에 자체 TypeScript를 삽입할 수 있습니다. 훅은 모델에 도달하기 전에 프롬프트를 다시 작성하거나 공격자에게 도달하기 전에 응답을 다시 작성할 수 있습니다.
import { registerHook } from "./src/engine/hooks.ts";
registerHook({
name: "fake-latency-notice",
transformResponse(response, ctx) {
if (ctx.protocol === "ssh" && /rm -rf/.test(ctx.input)) {
return "rm: cannot remove '/': Operation not permitted\n";
}
return response;
},
});
서비스의 hooks: 목록에서 이름으로 참조합니다. 예제 구성에 내장된 redact-secrets 훅이 활성화되어 있어 모델이 실제 자격 증명을 다시 출력하지 못하게 합니다.
Prometheus 메트릭은 패널의 /metrics에서 제공됩니다(인증 불필요, 스크레이퍼가 바로 작동):
honeyprompt_events_total{protocol="ssh"} 412
honeyprompt_llm_requests_total{provider="openai",protocol="ssh"} 118
honeyprompt_auth_attempts_total{protocol="ssh"} 87
honeyprompt_engine_errors_total{protocol="http"} 0
기여하거나 네이티브 바이너리를 원한다면 Deno 2.x가 필요합니다 — 유일한 종속성입니다.
deno task check # 타입 검사
deno task lint
deno task fmt
deno task test # 단위 + 통합 테스트
deno task start -- --config honeyprompt.yaml # 로컬 실행
deno task dev -- --config honeyprompt.yaml # 파일 감시 모드로 실행
deno task compile # -> ./dist/honeyprompt (자체 포함 바이너리)
deno compile은 런타임, 패널 자산 등을 모두 하나의 실행 파일로 빌드하며 종속성이 없습니다. Linux, macOS 및 Windows용 사전 빌드된 바이너리는 모든 태그된 릴리스에 첨부됩니다.
CI는 푸시할 때마다 포맷팅, 린트, 타입 검사, 테스트, 설정 검증, 교차 플랫폼 compile 및 Docker 빌드를 실행합니다. vX.Y.Z 태깅은 릴리스 바이너리를 생성하고 출처 및 SBOM이 증명된 멀티 아키텍처 이미지를 alectrocute/honeyprompt에 게시합니다.
honeyprompt run [--config <path>] 모든 설정된 서비스 시작 (기본값)
honeyprompt validate [--config <path>] 설정을 파싱하고 검증한 후 종료 — CI에 적합
honeyprompt version
honeyprompt help
--config 기본값은 ./honeyprompt.yaml 또는 설정된 경우 $HONEYPROMPT_CONFIG입니다(컨테이너는 /etc/honeyprompt/honeyprompt.yaml로 설정).
이 도구는 귀하가 소유하거나 테스트할 권한이 있는 인프라에서 공격자를 유인하고 연구하기 위한 것입니다. 유인 서비스를 노출한다는 것은 여전히 서비스를 노출하는 것을 의미합니다. 격리된 호스트에서 실행하고 패치를 유지하며 프로빙을 감당할 수 없는 곳에 사용하지 마십시오. 속임수는 실제 보안을 대체하지 않습니다.
이 프로젝트에 기여하고 AI 에이전트를 사용하거나 생성 코드에 크게 의존하려는 경우 전적으로 괜찮습니다. 그러나 제안하는 모든 코드 줄에 대해 개인적으로 질문을 받을 것이며, 즉각적인 AI 없는 이해를 보여주지 않으면 전체 기여가 거부되고 폐기됩니다.
MIT.
| 제공자 | 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 지정 |