
Cowrie, Loki, Promtail, और Grafana के साथ निर्मित मध्यम-अंतःक्रिया SSH/Telnet हनीपॉट - Terraform के माध्यम से DigitalOcean पर स्थापित, GitLab CI सत्यापन पाइपलाइन के साथ।
एक SSH/Telnet हनीपॉट स्टैक जिसे Terraform का उपयोग करके DigitalOcean droplet पर तैनात किया गया है। हमलों को 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 तक DigitalOcean Basic Droplet योजना पर आधारित हैं और प्रोजेक्ट चलाने के लिए न्यूनतम आवश्यकताएँ हैं।
- प्रदाता: DigitalOcean
- योजना: Basic Droplet - 1 Intel vCPU
- RAM: 1 GB (+2 GB swap)
- स्टोरेज: 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` निर्देशिका पर जाएँ फिर वेरिएबल्स फ़ाइल को कॉपी और संपादित करें:
> नोट: `do_token`, `ssh_public_key_path`, और `grafana_admin_password` को लागू करने से पहले `terraform.tfvars` में कम से कम कॉन्फ़िगर किया जाना चाहिए।```bash
cd terraform
cp terraform.tfvars.example terraform.tfvars
नोट: Terraform को आपकी स्थानीय मशीन पर स्थापित होना चाहिए। निर्देशों के लिए Terraform Installation Guide पर जाएँ।```bash terraform init # Initialize Terraform and download providers terraform apply
5. यदि परीक्षण - प्रतिस्थापन के साथ पुनः तैनाती करें:```bash
terraform apply -replace="digitalocean_droplet.honeypot"
### मैन्युअल परिनियोजन (पुराना)
1. उपरोक्त हार्डवेयर आवश्यकताओं और अपनी SSH कुंजी के साथ एक DigitalOcean ड्रॉपलेट बनाएं।
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 में एक कमेंटेड-आउट 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 चलाएँ।.gitlab-ci.yml हर पुश पर एकल validate चरण में तीन कार्य चलाता है:
नोट:
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: टिप्पणी के साथ दबाया जाता है। नीचे दी गई तालिका दस्तावेज़ित करती है कि प्रत्येक खुला पोर्ट क्यों जानबूझकर है।
flowchart TB internet((Internet))
subgraph tf["Terraform"] fw[DigitalOcean Cloud Firewall] droplet[Ubuntu 24.04 droplet] fw --> droplet end
subgraph compose["Docker Compose on droplet"] cowrie["Cowrie honeypot — SSH on port 22, Telnet on port 23"] promtail[Promtail with GeoIP labels] loki[Loki log store] grafana["Grafana — host :3000"] cowrie -->|JSON logs from ./data/cowrie-logs| promtail --> loki --> grafana end
internet -->|22/23 honeypot| fw internet -->|Admin SSH :2022| fw internet -->|Grafana :3000| fw droplet --> compose
## अवलोकन
5 दिनों के लाइव परिनियोजन (2026-05-05 से 2026-05-09) में कैप्चर किया गया डेटा:
| मीट्रिक | मान |
|---------------------------|--------|
| कुल कनेक्शन | 41,700 |
| लॉगिन प्रयास | 15,400 |
| सफल लॉगिन | 868 |
| निष्पादित कमांड | 836 |
| डाउनलोड की गई फ़ाइलें | 6 |
| अद्वितीय स्रोत देश | 106 |
### शीर्ष हमला करने वाले देश
| देश | कनेक्शन |
|-------------------|----------|
| जर्मनी | 9,768 |
| नीदरलैंड | 9,110 |
| संयुक्त राज्य | 7,706 |
| यूनाइटेड किंगडम | 3,858 |
| सिंगापुर | 1,770 |
| बेल्जियम | 1,422 |
### क्रेडेंशियल पैटर्न
सबसे सामान्य प्रयास किया गया उपयोगकर्ता नाम `root` था जिसमें 3,866 प्रयास हुए, उसके बाद `admin` (728) और `user` (494), जो डिफ़ॉल्ट क्रेडेंशियल और ज्ञात सेवा खातों को लक्षित करने वाले स्वचालित स्कैनर को दर्शाता है। सबसे सामान्य पासवर्ड `123456` (1,480 प्रयास) था, उसके बाद `123` और `12345`, जो शब्दकोश-आधारित ब्रूट-फोर्स टूलिंग के अनुरूप है।
### नकली शेल के अंदर हमलावर का व्यवहार
नकली क्रेडेंशियल सेट के खिलाफ 868 लॉगिन प्रयास सफल हुए। उन सत्रों में से, 836 कमांड निष्पादित किए गए। सबसे सामान्य कमांड `uname -s -v -n -r -m` (360 निष्पादन) था — एक मानक सिस्टम फिंगरप्रिंटिंग कमांड जो पेलोड तैनात करने से पहले लक्ष्य OS और आर्किटेक्चर की पहचान करने के लिए स्वचालित पोस्ट-एक्सप्लॉइटेशन स्क्रिप्ट द्वारा चलाया जाता है। अन्य देखे गए कमांड में शेल हिस्ट्री लॉगिंग को अक्षम करने के लिए `export HISTFILE=/dev/null` और `export HISTSAVE=/dev/null` शामिल थे, जो दर्शाता है कि हमलावर उस प्रणाली में भी अपने निशान छिपाने का प्रयास कर रहे थे जिसे वे समझौता किया हुआ मानते थे।
### मुख्य निष्कर्ष
स्वचालित स्कैनिंग ट्रैफ़िक की मात्रा — 106 देशों से 5 दिनों में 41,700 कनेक्शन — यह पुष्टि करती है कि कोई भी सार्वजनिक रूप से सुलभ SSH सेवा, एक्सपोज़र के घंटों के भीतर लगातार ब्रूट-फोर्स प्रयासों का सामना करती है। तुरंत `uname` चलाने और उसके बाद हिस्ट्री-दमन कमांड का व्यवहारिक पैटर्न, न्यूनतम मानवीय भागीदारी के साथ संचालित स्वचालित पोस्ट-एक्सप्लॉइटेशन फ्रेमवर्क के अनुरूप है।
## उपयोग
### Grafana डैशबोर्ड का उपयोग
> ध्यान दें: डैशबोर्ड क्रेडेंशियल्स terraform.tfvars या .env (मैन्युअल परिनियोजन के लिए) में सेट किए गए हैं।
डैशबोर्ड निम्नलिखित पर एक्सेस किया जा सकता है:```
http://<your-droplet-ip>:3000
admin / <GRAFANA_ADMIN_PASSWORD> से लॉगिन करें।
cowrie/etc/userdb.txt - हनीपॉट के लिए स्वीकृत क्रेडेंशियल शामिल हैं।
हनीपॉट क्रेडेंशियल को ट्यून करने के लिए इस फ़ाइल को संपादित करें
स्वीकृत लॉगिन हमलावर को एक नकली शेल में डाल देते हैं जहाँ सभी कमांड लॉग हो जाते हैं
अस्वीकृत प्रविष्टियाँ असफल प्रयासों के रूप में लॉग होती हैं
यह खंड इस परियोजना के विकास के दौरान किए गए निर्णयों और सामने आई समस्याओं का विवरण देता है। यह परियोजना की विकास प्रक्रिया और सीखे गए पाठों के प्रतिबिंब के रूप में कार्य करता है। यदि आप केवल यह जानना चाहते हैं कि परियोजना का उपयोग कैसे करें, तो सुरक्षा संबंधी विचार पर जाएँ।
क्लाउड होस्टिंग क्यों?
डिजिटलओशन क्यों?
टेराफॉर्म क्यों?
manual-deployment.sh, उन उपयोगकर्ताओं के लिए है जो टेराफॉर्म में अनुभवी नहीं हैं या इसका उपयोग नहीं करना पसंद करते हैं। उस पथ में एक ड्रॉपलेट प्रावधान करना, उससे कनेक्ट करना, रेपो को क्लोन करना और स्क्रिप्ट चलाना शामिल है। टेराफॉर्म तेजी से पुनरावृत्ति की अनुमति देता है: कोडबेस को संपादित करें और अपनी स्थानीय मशीन से प्रत्येक मैन्युअल चरण को दोहराए बिना पुनः तैनात करें। यह बुनियादी ढांचे को ध्वस्त करना और नए सिरे से शुरू करना भी आसान बनाता है। यदि परियोजना एक एकल हनीपॉट से हनीनेट में बढ़ती है, तो टेराफॉर्म मैन्युअल प्रावधान या लीगेसी स्क्रिप्ट की तुलना में अधिक साफ-सुथरा स्केल करता है।काउरी क्यों?
लोकी क्यों?
ग्राफाना क्यों?
प्रोमटेल क्यों?
जियोआईपी क्यों?
scripts/geoip-update.sh के माध्यम से DB-IP सिटी लाइट का उपयोग करती है: कोई खाता या API कुंजी नहीं, जो रेपो को क्लोन करने वाले किसी भी व्यक्ति के लिए तैनाती को सरल रखता है। प्रोमटेल का अंतर्निहित जियोआईपी चरण स्थानीय MMDB फ़ाइल को पढ़ता है और ग्राफाना जियोमैप पैनल के लिए लेबल जोड़ता है।टेराफॉर्म या मैन्युअल तैनाती स्क्रिप्ट का उपयोग करके हनीपॉट सेट करते समय होने वाली प्रक्रियाओं का चरण-दर-चरण अवलोकन।
आपकी मशीन पर:
terraform/terraform.tfvars कॉन्फ़िगर करें: API टोकन, SSH सार्वजनिक कुंजी पथ, ग्राफाना पासवर्ड, रेपो URL/ब्रांच, वैकल्पिक manage_do_firewallterraform init चलाएँ: स्थानीय रूप से डिजिटलओशन प्रदाता स्थापित करता हैterraform apply चलाएँ: टेराफॉर्म एक योजना बनाता है, फिर संसाधन बनाता या अपडेट करता हैडिजिटलओशन में:
droplet_image, droplet_size, region आदि से आते हैंuser_data रेंडर किए गए क्लाउड-इनिट पर सेट होता है: पहले बूट पर VM को व्यवस्थापक SSH पोर्ट, git repo_url / repo_branch, और जनरेट किए गए .env (ग्राफाना पासवर्ड और ADMIN_SSH_PORT env.tftpl से) की बेस64-एन्कोडेड प्रतिलिपि मिलती हैmanage_do_firewall सत्य है):
terraform/main.tf देखें)ड्रॉपलेट पर, क्लाउड-इनिट स्वचालित रूप से चलता है:
package_update / package_upgrade, फिर सूचीबद्ध पैकेज (curl, git, ufw, …) स्थापित करें। बूट के शुरुआत में, write_files /root/honeypot.env बनाता है (टेराफॉर्म-रेंडर env.tftpl बेस64 के रूप में: ग्राफाना पासवर्ड, ADMIN_SSH_PORT, आदि)runcmd बूटस्ट्रैप स्क्रिप्ट (terraform/templates/cloud-init.yaml.tftpl में ऑर्डर): iptables / ip6tables को लीगेसी बैकएंड पर सेट करें/swapfile, fstab, swappiness)डॉकर कंपोज़ के अंदर:
/ready; होस्ट पर केवल 127.0.0.1:3100)docker-compose.yml में depends_on), फिर शुरू होते हैंdata/cowrie-logs के अंतर्गत JSON लॉग लिखता हैउपयोगकर्ता VM बनाता है, SSH करता है, और क्लोन किए गए रेपो से स्क्रिप्ट चलाता है।
manual-deployment.sh निम्नलिखित करता है:
.env लोड और मान्य करेंapt update और apt upgradeufw और iptablessshd ADMIN_SSH_PORT पर और ssh.socket अक्षम करेंscripts/setup-firewall.shscripts/geoip-update.sh और मासिक क्रॉनdocker compose pull / up -d, फिर स्क्रिप्ट लोकी और ग्राफाना स्वास्थ्य जांच की प्रतीक्षा करती है और सारांश प्रिंट करती हैविचार किए गए समाधान:
समाधान:
व्यापार-बंद:
सीखे गए पाठ:
docker compose up विफल रहा क्योंकि पोर्ट 22 पहले से ही उपयोग में था और काउरी द्वारा बाइंड नहीं किया जा सका।विचार किए गए समाधान:
sshd गलत तरीके से कॉन्फ़िगर किया गया था या गलत पोर्ट पर सुन रहा थासमाधान:
sshd को ADMIN_SSH_PORT (डिफ़ॉल्ट 2022) पर ले जाया जाता है और पहले पुनरारंभ किया जाता है, फिर डॉकर के लिए काउरी को बाइंड करने के लिए पोर्ट 22 को मुक्त करने के लिए ssh.socket को रोका और अक्षम किया जाता है। दोनों चरणों के बाद नए व्यवस्थापक पोर्ट की अनुमति देने के लिए UFW नियम लागू किए जाते हैं।व्यापार-बंद:
सीखे गए पाठ:
ssh.socket एक systemd सॉकेट यूनिट है जो ऑन-डिमांड SSH सक्रियण के लिए पोर्ट 22 आरक्षित रखता है। डॉकर को काउरी के लिए होस्ट पोर्ट 22 बाइंड करने की अनुमति देने से पहले इसे रोका और अक्षम किया जाना चाहिए। यदि यह अभी भी सक्रिय है, तो docker compose up "पता पहले से उपयोग में है" के साथ विफल हो जाता है।जियोआईपी कार्यक्षमता
ग्राफाना HTTPS
प्रॉक्सी सर्वर कार्यक्षमता
GNU जनरल पब्लिक लाइसेंस संस्करण 2.0 (GPLv2) पूर्ण लाइसेंस पाठ LICENSE फ़ाइल में देखें।
| कार्य | उपकरण | उद्देश्य |
|---|
terraform:fmt | hashicorp/terraform:1.8 | फ़ॉर्मेटिंग: यदि किसी फ़ाइल को terraform fmt की आवश्यकता है तो विफल हो जाता है |
terraform:validate | hashicorp/terraform:1.8 | DigitalOcean से संपर्क किए बिना कॉन्फ़िग वैधता |
checkov:scan | bridgecrew/checkov:latest | Terraform कोड में IaC गलत कॉन्फ़िगरेशन |
| चेक आईडी | संसाधन | खोज | निर्णय |
|---|
CKV_DIO_4 | digitalocean_firewall.honeypot — एडमिन SSH इनबाउंड | एडमिन SSH पोर्ट 0.0.0.0/0 के लिए खुला | स्वीकृत — पोर्टेबल लैब के लिए एक निश्चित IP तक सीमित करना अव्यावहारिक है; उत्पादन में अनुशंसित |
CKV_DIO_4 | digitalocean_firewall.honeypot — पोर्ट 22 इनबाउंड | पोर्ट 22 0.0.0.0/0 के लिए खुला | जानबूझकर — यह SSH हनीपॉट सतह है; स्रोत को प्रतिबंधित करना उद्देश्य को विफल करता है |
CKV_DIO_4 | digitalocean_firewall.honeypot — पोर्ट 23 इनबाउंड | पोर्ट 23 0.0.0.0/0 के लिए खुला | जानबूझकर — टेलनेट हनीपॉट सतह; पोर्ट 22 के समान तर्क |
CKV_DIO_4 | digitalocean_firewall.honeypot — पोर्ट 3000 इनबाउंड | Grafana HTTP 0.0.0.0/0 के लिए उजागर | लैब पहुंच के लिए स्वीकृत — ज्ञात सीमा सुरक्षा विचार में दस्तावेज़ित; उत्पादन परिनियोजन को पोर्ट 443 पर HTTPS के माध्यम से ज्ञात IP या प्रॉक्सी तक सीमित करना चाहिए |
| पैनल | विवरण |
|---|
| अटैक वर्ल्ड मैप | जियोमैप जिसमें हीटमैप + मार्कर लेयर्स हैं, जो हर कनेक्शन की उत्पत्ति दिखाते हैं |
| कुल कनेक्शन | चयनित समय सीमा में इनबाउंड हनीपॉट सत्रों की गिनती |
| लॉगिन प्रयास | क्रेडेंशियल ब्रूट-फोर्स के कुल प्रयास |
| सफल लॉगिन | वे हमलावर जिन्होंने userdb.txt क्रेडेंशियल से मेल खाया |
| निष्पादित कमांड | नकली शेल के अंदर निष्पादित शेल कमांड |
| डाउनलोड की गई फ़ाइलें | wget/curl के माध्यम से कैप्चर किए गए मालवेयर/स्क्रिप्ट |
| कनेक्शन दर | समय श्रृंखला: कनेक्शन/सेकंड, असफल लॉगिन/सेकंड, सफलताएँ/सेकंड |
| शीर्ष उपयोगकर्ता नाम | सबसे अधिक प्रयास किए गए SSH उपयोगकर्ता नाम |
| शीर्ष पासवर्ड | सबसे अधिक प्रयास किए गए पासवर्ड |
| शीर्ष कमांड | सबसे अधिक निष्पादित शेल कमांड |
| देशों द्वारा हमले | देश-स्तरीय कनेक्शन तालिका |
| हाल की घटनाएं | नवीनतम घटनाओं की लाइव लॉग स्ट्रीम |
| फ़ाइल डाउनलोड | हर उस फ़ाइल की तालिका जिसे हमलावर खींचने का प्रयास करता है |
systemctl enable --now dockersshd ADMIN_SSH_PORT पर; ssh.socket को अक्षम करें ताकि होस्ट पोर्ट 22 काउरी के लिए खाली होgit clone repo_url / repo_branch से /opt/honeypot में (इसमें docker-compose.yml और कॉन्फ़िग शामिल होना चाहिए).env डिस्क पर: /root/honeypot.env को /opt/honeypot/.env पर ले जाएँ (मोड 600)scripts/setup-firewall.sh (UFW व्यवस्थापक SSH, 22, 23, 3000 के लिए)scripts/geoip-update.sh (DB-IP सिटी लाइट geoip/ में); उसी स्क्रिप्ट के लिए मासिक क्रॉन लाइन जोड़ेंdata/cowrie-logs और data/cowrie-dl उन अनुमतियों के साथ बनाएँ जिनकी कंपोज़ अपेक्षा करता है/opt/honeypot से, docker compose pull फिर docker compose up -d