
प्रायोगिक डिकॉय ब्रोकर
एक कंटेनरीकृत नेटवर्क डिकॉय (हनीपॉट) जो SSH, RDP, और SMB का विज्ञापन करता है, eBPF के साथ प्रत्येक इनबाउंड कनेक्शन का निरीक्षण करता है, और प्रत्येक सत्र को एक पृथक डिकॉय कंटेनर में रिवर्स-प्रॉक्सी करता है।
डिज़ाइन दो चिंताओं को अलग करता है:
यह आपके स्वामित्व वाले या जिनकी निगरानी करने के लिए आप अधिकृत हैं, उन नेटवर्कों पर अनधिकृत गतिविधि का पता लगाने और उसका अध्ययन करने के लिए एक रक्षात्मक उपकरण है। इसे केवल वहीं तैनात करें जहाँ आपके पास वह अधिकार हो।
flowchart TB
A["Attacker / Scanner"]
subgraph host["Decoy Host"]
direction TB
NIC["broker eth0<br/>published: 22, 3389, 445"]
subgraph brk["broker container"]
direction TB
E["eBPF TC classifier<br/>logs every SYN<br/>sees true source IP"]
P["reverse proxy<br/>CONNECT to backend"]
L["structured JSON logs"]
end
subgraph dec["decoynet (internal, no host route)"]
direction LR
S["ssh-decoy<br/>OpenCanary ssh<br/>port 2222"]
D["rdp-decoy<br/>OpenCanary rdp<br/>port 3389"]
M["smb-decoy<br/>Impacket SMB server<br/>port 445"]
end
end
A --> NIC
NIC --> E
NIC --> P
E --> L
P --> S
P --> D
P --> M
कुल चार कंटेनर:
| कंटेनर | भूमिका | नेटवर्क |
|---|---|---|
broker | सार्वजनिक फ्रंट डोर: eBPF अवलोकन और रिवर्स प्रॉक्सी | edge + decoynet |
ssh-decoy | OpenCanary ssh मॉड्यूल (वास्तविक हैंडशेक, क्रेडेंशियल कैप्चर करता है) | केवल decoynet |
rdp-decoy | OpenCanary rdp मॉड्यूल (NLA नकल, उपयोगकर्ता नाम कैप्चर करता है) | केवल decoynet |
smb-decoy | Impacket SimpleSMBServer (वास्तविक SMB2/3, प्रमाणीकरण कैप्चर करता है) | केवल decoynet |
डिकॉय एक internal Docker नेटवर्क (decoynet) पर रहते हैं जिसमें होस्ट या बाहरी दुनिया के लिए कोई रूट नहीं है। केवल ब्रोकर उन तक पहुँच सकता है। एक डिकॉय के अंदर हमलावर जो कुछ भी करता है, वह सीधे होस्ट नेटवर्क तक नहीं पहुँच सकता।
ब्रोकर पोर्ट 22, 3389 और 445 को होस्ट पर प्रकाशित करता है, इसलिए इनबाउंड पैकेट ब्रोकर के eth0 पर आते हैं। फिर प्रत्येक पैकेट के साथ दो चीजें होती हैं:
broker/bpf/decoy.bpf.c) ईथरनेट, IP और TCP हेडर को पार्स करता है, और प्रत्येक नए कनेक्शन प्रयास (SYN सेट, ACK क्लियर) के लिए एक conn_event रिंग बफर में लिखता है: स्रोत IP और पोर्ट, गंतव्य पोर्ट, TCP फ़्लैग्स, और क्या पोर्ट एक विज्ञापित सेवा है। पैकेट बिना बदलाव के गुज़रता है (TC_ACT_OK)।CONNECT के समतुल्य कार्य करता है, फिर दोनों दिशाओं में बाइट रिले करता है।advertised_ports eBPF मैप स्टार्टअप पर config.yaml से भरा जाता है, ताकि क्लासिफायर टैग कर सके कि क्या प्रोब एक सेवा किए गए पोर्ट पर लगा या एक अनचाहे पर। यह क्षैतिज पोर्ट स्कैन को दृश्यमान बनाता है भले ही केवल तीन पोर्ट प्रॉक्सी किए गए हों।
यदि आप "सब कुछ खुला है" का विज्ञापन करना चाहते हैं और मनमानी गंतव्य पोर्ट को ब्रोकर में फ़नल करना चाहते हैं, तो क्लासिफायर को गंतव्य पोर्ट को फिर से लिखने या TPROXY / bpf_sk_assign रीडायरेक्ट का उपयोग करने के लिए विस्तारित करें। वर्तमान संस्करण पैकेट पथ को अछूता रखता है और खुद को अवलोकन तक सीमित रखता है, जो अधिक सुरक्षित डिफ़ॉल्ट है।
cyber-decoy/
├── README.md
├── docker-compose.yml # 4-container stack
├── docker-compose.override.yml # स्थानीय macOS विकास: कोई eBPF कैप, पोर्ट 22 रीमैप
├── Makefile # build / up / down / bpf सहायक
├── LICENSE
├── scripts/
│ └── setup.sh # होस्ट प्रीफ़्लाइट जाँच
├── broker/
│ ├── Dockerfile # eBPF ऑब्जेक्ट + Go बाइनरी संकलित करता है
│ ├── config.yaml # विज्ञापित सेवाएँ (कॉन्फ़िगरेबल)
│ ├── go.mod
│ ├── main.go # प्रवेश बिंदु
│ ├── bpf/
│ │ └── decoy.bpf.c # eBPF TC क्लासिफायर
│ └── internal/
│ ├── config/config.go # कॉन्फ़िग लोडर
│ ├── proxy/proxy.go # TCP रिवर्स प्रॉक्सी
│ └── bpf/loader.go # eBPF लोड और अटैच करता है, इवेंट स्ट्रीम करता है
└── decoys/ # तीनों OpenCanary चलाते हैं
├── ssh/
│ ├── Dockerfile
│ └── opencanary.conf # ssh मॉड्यूल, पोर्ट 2222
├── rdp/
│ ├── Dockerfile
│ └── opencanary.conf # rdp मॉड्यूल, पोर्ट 3389
└── smb/
├── Dockerfile # एकल Python प्रक्रिया, गैर-रूट
├── smb_decoy.py # Impacket SimpleSMBServer + JSON लॉगिंग
└── requirements.txt # impacket (पिन किया हुआ)
docker-compose.override.yml का उपयोग करते हैं, जो !reset / !override टैग पर निर्भर करता है)।sudo mount -t bpf bpf /sys/fs/bpf।ब्रोकर छवि अपने बिल्ड आर्किटेक्चर का पता लगाती है और मिलान करने वाले __TARGET_ARCH_* मैक्रो को clang को पास करती है, इसलिए यह x86_64 और aarch64 (Apple Silicon, Graviton) दोनों पर बनती है। ध्यान दें कि gcc-multilib जानबूझकर नहीं स्थापित किया गया है: यह केवल x86 पैकेज है जिसका कोई arm64 उम्मीदवार नहीं है, और इसे शामिल करने से arm64 पर apt एग्ज़िट कोड 100 के साथ बिल्ड टूट जाता है। eBPF ऑब्जेक्ट को संकलित करने के लिए केवल clang और libbpf-dev की आवश्यकता है।
macOS पर Docker Desktop कंटेनरों को आपके होस्ट कर्नेल के बजाय LinuxKit VM के अंदर चलाता है, इसलिए TC/TCX eBPF अटैच आमतौर पर वहाँ काम नहीं करेगा। यह घातक नहीं है: eBPF डिज़ाइन द्वारा सर्वोत्तम प्रयास है, इसलिए ब्रोकर ebpf disabled: attach failed लॉग करता है और रिवर्स प्रॉक्सी और तीनों डिकॉय सामान्य रूप से चलते और लॉग होते हैं। आप स्थानीय रूप से पूरे प्रॉक्सी पथ को विकसित और परीक्षण कर सकते हैं, फिर जब आप लिनक्स होस्ट पर तैनात करते हैं तो वास्तविक eBPF अवलोकन प्राप्त कर सकते हैं।
docker-compose.override.yml स्वचालित रूप से लोड होता है और इसे सुखद बनाता है: यह eBPF क्षमताओं को हटा देता है (VM में बेकार) और होस्ट पोर्ट 22 को 2022 पर रीमैप करता है, क्योंकि Mac का अपना sshd 22 का मालिक है।
docker compose up --build # स्थानीय विकास, ओवरराइड लागू
docker compose -f docker-compose.yml up -d # वास्तविक तैनाती, ओवरराइड को बायपास
पहले प्रीफ़्लाइट जाँच चलाएँ:
./scripts/setup.sh
# 1. सभी चार छवियाँ बनाएँ (ब्रोकर छवि के अंदर eBPF ऑब्जेक्ट संकलित करता है)
make build
# 2. स्टैक शुरू करें
make up
# 3. देखें क्या होता है
make logs
फिर इसे किसी अन्य मशीन (या स्मोक टेस्ट के लिए लोकलहोस्ट) से प्रोब करें:
ssh -p 22 user@DECOY_HOST # SSH डिकॉय को हिट करता है
nc DECOY_HOST 3389 # RDP डिकॉय को हिट करता है
nc DECOY_HOST 445 # SMB डिकॉय को हिट करता है
nc DECOY_HOST 8080 # अविज्ञापित: eBPF द्वारा देखा गया, कोई प्रॉक्सी नहीं
ब्रोकर eBPF प्रोब इवेंट और प्रॉक्सी किए गए सत्रों के लिए JSON उत्सर्जित करता है; प्रत्येक डिकॉय OpenCanary JSON इवेंट उत्सर्जित करता है। क्रेडेंशियल आने को देखने के लिए:
docker compose logs -f ssh-decoy | grep 4002