
중간 상호작용 SSH/Telnet 허니팟 - Cowrie, Loki, Promtail, Grafana로 구축, Terraform을 통해 DigitalOcean에 프로비저닝, GitLab CI 검증 파이프라인 포함
Terraform을 사용하여 DigitalOcean droplet에 배포된 SSH/Telnet 허니팟 스택입니다. 공격은 Cowrie에 의해 캡처되고, Loki에 저장되며, 공격 출처의 실시간 세계 지도와 함께 Grafana에서 시각화됩니다.
honeypot/
├── cowrie/
│ └── etc/
│ ├── cowrie.cfg # Cowrie honeypot configuration
│ └── userdb.txt # Accepted and rejected fake credentials
├── docs/
│ └── ttp-to-runtime-rules.md # Observed attacker TTPs → Falco rules (eks-gitops, platform-engineering-lab)
├── geoip/
│ └── .gitkeep # Placeholder - MMDB files are gitignored
├── grafana/
│ ├── provisioning/
│ │ ├── dashboards/
│ │ │ ├── dashboards.yml # Provisioning: dashboard provider
│ │ │ └── honeypot-dashboard.json # Pre-built Attack Monitor dashboard
│ │ └── datasources/
│ │ └── loki.yml # Auto-provisioned Loki datasource
│ └── grafana.ini # Grafana server settings
├── loki/
│ └── config.yml # Loki single-binary config and retention
├── metrics/
│ ├── runtime-metrics.schema.json # Shared schema — identical across all 4 portfolio projects
│ └── runtime-metrics.json # Generated by scripts/export-honeypot-metrics.sh; gitignored, not committed
├── promtail/
│ └── config.yml # Promtail scrape and GeoIP pipeline
├── scripts/
│ ├── geoip-update.sh # Download or refresh GeoIP database
│ ├── setup-firewall.sh # Host UFW rules for honeypot ports
│ ├── export-honeypot-metrics.sh # Queries Grafana/Loki, writes attacker_telemetry
│ └── emit-runtime-metrics.py # Wraps attacker_telemetry in the shared metrics schema
├── terraform/
│ ├── templates/
│ │ ├── cloud-init.yaml.tftpl # Droplet first-boot script (Terraform-templated)
│ │ └── env.tftpl # .env lines embedded via Terraform
│ ├── backend.tf # Terraform backend config
│ ├── main.tf # Droplet, SSH key, firewall, cloud-init
│ ├── outputs.tf # IPs and helpful post-apply values
│ ├── terraform.tfvars.example # Example variable values (copy to terraform.tfvars)
│ ├── variables.tf # Terraform input variables
│ └── versions.tf # Terraform and provider version constraints
├── .env.example # Example environment file for manual setup
├── .gitignore # Ignored paths and files
├── .gitlab-ci.yml # CI/CD pipeline: fmt, validate, Checkov, metrics schema/export
├── docker-compose.yml # Docker Compose file for the honeypot stack
├── LICENSE # GPLv2 license
├── manual-deployment.sh # Legacy VM bootstrap without Terraform
└── README.md # Project documentation
## 하드웨어 요구 사항
> 참고: 이 요구 사항은 2026년 5월 기준 DigitalOcean Basic Droplet 플랜을 기반으로 하며, 프로젝트를 실행하기 위한 최소 요구 사항입니다.
- 제공자: DigitalOcean
- 플랜: Basic Droplet - 1 Intel vCPU
- RAM: 1 GB (+2 GB 스왑)
- 스토리지: 35 GB NVMe SSD
- OS: Ubuntu 24.04 LTS
> **컨테이너 버전 업그레이드 이후의 메모리 여유 공간:** `docker-compose.yml`은 이 드롭릿 크기에 맞춰 원래 튜닝된 것보다 최신 Grafana (12.0.0), Loki, Promtail (3.6.13) 이미지를 고정합니다. 서비스별 `mem_limit`/`memswap_limit` 값은 변경되지 않았습니다 — 첫 배포 후 `docker stats`를 주시하고, 컨테이너가 지속적으로 한계에 근접한다면 드롭릿 플랜을 올리거나 (또는 Loki의 `retention_period` / Grafana의 캐시를 줄이십시오).
## 설치 및 설정
>참고: 설치 후, 원래 세션을 닫기 전에 새 터미널을 열어 `ADMIN_SSH_PORT` (기본값: 2022)로 여전히 SSH가 가능한지 확인하는 것이 권장됩니다.
### Terraform 배포 (권장)
1. 읽기/쓰기 권한이 있는 DigitalOcean API 토큰을 생성합니다:
- DigitalOcean에 로그인하고 Account > API > Tokens > Generate New Token으로 이동합니다.
- 토큰 이름을 지정하고 (예: "Cowrie Honeypot") "Full Access" 권한을 선택합니다.
- "Generate Token"을 클릭하고 토큰 값을 안전한 위치에 복사합니다 (다시 볼 수 없습니다).
2. 로컬 머신에서 SSH 키 쌍을 생성하고 공개 키 경로를 복사합니다.
3. `terraform` 디렉터리로 이동한 다음 변수 파일을 복사하고 편집합니다:
> 참고: 적용하기 전에 최소한 `terraform.tfvars`에서 `do_token`, `ssh_public_key_path`, `grafana_admin_password`가 구성되어야 합니다.```bash
cd terraform
cp terraform.tfvars.example terraform.tfvars
참고: Terraform이 로컬 머신에 설치되어 있어야 합니다. 지침은 Terraform 설치 가이드를 참조하세요.```bash terraform init # Initialize Terraform and download providers terraform apply
5. 테스트하는 경우 - 대체 항목으로 재배포:```bash
terraform apply -replace="digitalocean_droplet.honeypot"
### 수동 배포 (레거시)
1. 위의 하드웨어 요구 사항과 SSH 키를 사용하여 DigitalOcean droplet을 생성합니다.
2. droplet에 SSH로 접속하거나 DigitalOcean 웹 콘솔을 사용하여 다음 명령을 실행합니다:```bash
ssh root@<your-droplet-ip> # If using DigitalOcean web console, skip this command
git clone https://gitlab.com/Oseguera12/cowrie-honeypot-digitalocean.git /opt/honeypot
cd /opt/honeypot
cp .env.example .env
nano .env
bash manual-deployment.sh
참고: 기본적으로 Terraform은 상태를 로컬 머신의
terraform/terraform.tfstate에 기록합니다. 이 파일에는 민감한 출력 값(droplet IP, Grafana 비밀번호, SSH 키 지문)이 포함되어 있으므로 절대 커밋해서는 안 됩니다..gitignore는*.tfstate와*.tfstate.*를 포함합니다.
로컬 상태의 위험:
apply 실행이 파일을 손상시킬 수 있음개인 랩을 넘어서는 용도라면 원격 백엔드로 전환하세요. terraform/backend.tf에는 주석 처리된 DigitalOcean Spaces 구성(S3 호환)이 포함되어 있습니다.
원격 백엔드를 활성화하려면:
terraform.tfvars에 넣지 마세요): ```bash
export AWS_ACCESS_KEY_ID=
export AWS_SECRET_ACCESS_KEY=
terraform/backend.tf의 backend "s3" 블록의 주석을 해제하고 버킷 이름과 리전 엔드포인트를 입력합니다.terraform init -migrate-state를 실행하여 기존 로컬 상태를 Spaces로 이동합니다..gitlab-ci.yml은 모든 푸시마다 validate 스테이지에서 네 개의 작업을 실행하며, 추가로 metrics 스테이지에서 하나의 수동 작업을 실행합니다:
| 작업 | 도구 | 목적 |
|---|---|---|
terraform:fmt | hashicorp/terraform:1.8 | 포맷팅: terraform fmt가 필요한 파일이 있으면 실패 |
terraform:validate | hashicorp/terraform:1.8 | DigitalOcean에 접속하지 않고 구성 유효성 검사 |
checkov:scan | bridgecrew/checkov:latest | Terraform 코드의 IaC 잘못된 구성 |
validate-metrics-schema | python:3.12-slim | metrics/runtime-metrics.schema.json이 올바른 형식인지 확인하고, 커밋된 metrics/runtime-metrics.json이 있으면 이에 대해 검증 |
export-metrics (수동) | python:3.12-slim | 아래 런타임 메트릭 참조 |