
중간 상호작용 SSH/Telnet 허니팟 - Cowrie, Loki, Promtail, Grafana로 구축, Terraform을 통해 DigitalOcean에 프로비저닝, GitLab CI 검증 파이프라인 포함
Terraform을 사용하여 DigitalOcean 드롭렛에 배포된 SSH/Telnet 허니팟 스택입니다. 공격은 Cowrie에 의해 수집되고, Loki에 저장되며, Grafana에서 공격 출처의 실시간 세계 지도로 시각화됩니다.
honeypot/
├── cowrie/
│ └── etc/
│ ├── cowrie.cfg # Cowrie honeypot configuration
│ └── userdb.txt # Accepted and rejected fake credentials
├── 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
├── 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
├── 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
├── 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
## 설치 및 설정
>참고: 설치 후, 새 터미널을 열고 `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. 위의 하드웨어 요구 사항을 충족하는 DigitalOcean 드롭렛을 생성하고 SSH 키를 추가합니다.
2. 드롭렛에 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에는 (S3 호환) DigitalOcean Spaces 설정이 주석 처리되어 있습니다.
원격 백엔드를 활성화하려면:
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 단계에서 세 가지 작업을 실행합니다.
| 작업 | 도구 | 목적 |
|---|---|---|
terraform:fmt | hashicorp/terraform:1.8 | 포맷팅: terraform fmt이 필요한 파일이 있으면 실패 |
terraform:validate | hashicorp/terraform:1.8 | DigitalOcean에 접촉하지 않고 구성 유효성 검사 |
checkov:scan | bridgecrew/checkov:latest | Terraform 코드에서 IaC 설정 오류 검사 |
참고:
terraform:fmt및terraform:validate는 실패 시 파이프라인을 차단합니다.checkov:scan은 일부 결과가 의도적인 절충안이므로allow_failure: true로 설정되어 있습니다. 작업 자체를 비활성화하기보다는 인라인# checkov:skip=CKXXX주석을 사용하여 특정 수용 가능한 결과를 억제하세요.
CKV_DIO_4("방화벽 인그레스가 완전히 열려 있지 않은지 확인")는 전체 digitalocean_firewall 리소스에 대해 한 번 발생합니다. terraform/main.tf의 리소스 블록 내부에 # checkov:skip=CKV_DIO_4: 주석 하나를 넣어 억제했습니다. 아래 표는 각 열린 포트가 의도적인 이유를 설명합니다.