
स्व-होस्टेड थ्रेट इंटेलिजेंस प्लेटफ़ॉर्म — फ़ीड एग्रीगेशन, AI ट्राइएज, MITRE ATT&CK कवरेज, और Sentinel-एकीकृत डिटेक्शन इंजीनियरिंग। स्टैंडअलोन या पूरी तरह Azure-एकीकृत रूप में चलता है।
एक स्व-होस्टेड थ्रेट इंटेलिजेंस प्लेटफ़ॉर्म जो 60+ सुरक्षा विक्रेताओं से RSS फ़ीड्स को एकत्र करता है, AI ट्राइएज चलाता है, निष्कर्षों को आपकी RunZero एसेट इन्वेंट्री के साथ सहसंबंधित करता है, और डार्क-मोड वेब डैशबोर्ड के माध्यम से कार्रवाई योग्य अलर्ट प्रस्तुत करता है।
शून्य क्लाउड निर्भरता के साथ स्टैंडअलोन चलाने के लिए बनाया गया, या Azure/Entra/Sentinel वातावरण में पूरी तरह से एकीकृत — वह टियर चुनें जो आपके पास मौजूद है उससे मेल खाता हो।
| टियर | स्क्रिप्ट | AI ट्राइएज | प्रमाणीकरण | स्टोरेज | आपको क्या मिलता है |
|---|---|---|---|---|---|
| बेसिक | scripts/setup-basic.sh | बंद | स्थानीय API कुंजी | स्थानीय Postgres (Docker) | फ़ीड एग्रीगेशन, IOC निष्कर्षण, MITRE मैट्रिक्स, डैशबोर्ड — कोई AI नहीं, कोई क्लाउड नहीं, साइन अप करने के लिए कुछ भी नहीं |
| बेसिक + API | scripts/setup-basic-api.sh | Anthropic (प्रत्यक्ष) | स्थानीय API कुंजी | स्थानीय Postgres (Docker) | ऊपर सब कुछ, साथ ही AI गंभीरता/TTP/सारांश ट्राइएज |
| Azure + API | scripts/setup-azure.ps1 | Azure AI Foundry | Microsoft Entra ID SSO | आपका अपना Postgres (Azure DB for PostgreSQL, आदि) | Azure Container Apps में पूर्ण परिनियोजन, प्रति-उपयोगकर्ता भूमिकाओं के साथ SSO। (detections.ai पाइपलाइन एकीकरण भविष्य के रिलीज़ में आ रहा है — नीचे देखें।) |
तीनों बिल्कुल समान एप्लिकेशन कोड चलाते हैं — केवल यह बदलता है कि कौन से env वेरिएबल सेट हैं। पूर्ण संदर्भ के लिए Environment Variables देखें।```bash
./scripts/setup-basic.sh
./scripts/setup-basic-api.sh
./scripts/setup-azure.ps1
दो bash स्क्रिप्ट्स एक स्थानीय Postgres कंटेनर खड़ा करती हैं, स्कीमा लागू करती हैं, और आपके लिए `backend/.env` / `frontend/.env.local` जनरेट करती हैं — फिर ऐप को वास्तव में शुरू करने के लिए दो कमांड प्रिंट करती हैं (`pip install` + बैकएंड चलाएँ, `npm install` + फ्रंटएंड डेव सर्वर चलाएँ)। `setup-azure.ps1`, `infra/provision.ps1` के चारों ओर एक पतला रैपर है, जो असली Azure Container Apps डिप्लॉयमेंट रनबुक है।
---
## विशेषताएँ
- **फ़ीड एग्रीगेशन** — एक शेड्यूल पर 60+ Tier 1/2/3 सुरक्षा RSS फ़ीड्स को पोल करता है; प्रचारात्मक सामग्री को स्वचालित रूप से डीडुप्लिकेट और फ़िल्टर करता है
- **AI ट्राइएज** — प्रत्येक प्रविष्टि को गंभीरता (Critical/High/Medium/Low/Informational), MITRE ATT&CK TTPs, और एक सरल-अंग्रेज़ी सारांश के साथ वर्गीकृत करता है। प्रोवाइडर-मॉड्यूलर: सीधा Anthropic API या Azure AI Foundry, एक env var के माध्यम से स्विच करने योग्य, किसी भी तरह से कार्यक्षमता खोए बिना
- **IOC निष्कर्षण** — प्रत्येक प्रविष्टि से IPs, डोमेन, URLs, फ़ाइल हैश, और CVEs स्वचालित रूप से निकालता है
- **RunZero एकीकरण** — आपकी एसेट इन्वेंट्री को सिंक करता है और लाइव एसेट्स के विरुद्ध थ्रेट इंटेल को सहसंबंधित करता है; CVEs, सॉफ़्टवेयर नाम, OS संस्करण, और IP पतों पर मेल खाता है। `RUNZERO` के अंतर्गत तीन सब-टैब: **Matches** (आपकी इन्वेंट्री के विरुद्ध सहसंबंधित प्रविष्टियाँ, गंभीरता/तारीख/विश्वास/KEV द्वारा फ़िल्टर करने योग्य), **Exposure** (संगठन-स्तरीय पुष्ट/संभावित स्थिति, उपचार ट्रैकिंग के साथ), और **Metrics** (समय के साथ इनटेक बनाम उपचार रुझान)
- **Your Stack** — अपने वातावरण में सॉफ़्टवेयर/OS को परिभाषित करें; प्रासंगिकता के आधार पर सभी प्रविष्टियों को पुनः-स्कोर करता है
- **IOC लेजर** — सभी निकाले गए संकेतकों का खोजने योग्य लेजर, प्रविष्टि क्रॉस-रेफ़रेंस और STIX/CSV निर्यात के साथ
- **MITRE ATT&CK मैट्रिक्स** — आपके अंतर्ग्रहीत थ्रेट इंटेल में TTP कवरेज का हीटमैप
- **फ़ीड स्वास्थ्य डैशबोर्ड** — प्रति-फ़ीड पोल स्थिति, लगातार विफलता ट्रैकिंग, और 7-दिन का लेख वॉल्यूम
- **Detections** — एक 9-टैब समीक्षा सतह (नीचे देखें) जो डिटेक्शन के रूप में पंजीकृत सब कुछ कवर करती है, चाहे AI-जनित हो, आपकी अपनी फ़ाइलों से आयातित हो, या लाइव Sentinel वर्कस्पेस से सिंक किया गया हो
- **मॉड्यूलर प्रमाणीकरण** — Microsoft Entra ID SSO, भूमिका-आधारित पहुँच के साथ, या एकल साझा स्थानीय API कुंजी, शून्य Azure निर्भरता के साथ। फ्रंटएंड द्वारा स्वतः-पहचाना जाता है; देखें [Auth modes](#auth-modes)
### डिटेक्शन-संबंधित दो विशेषताएँ
यह रेपो वास्तव में "detections" छत्र के अंतर्गत दो संबंधित लेकिन स्वतंत्र रूप से उपयोग करने योग्य चीज़ें प्रदान करता है:
1. **`DETECTIONS` टैब** — एक स्व-निहित समीक्षा सतह, नौ सब-टैब में विभाजित:
- **All Detections** — पंजीकृत एनालिटिक्स का पूरा कैटलॉग, तकनीक/डिस्पोज़िशन/समीक्षा स्थिति द्वारा फ़िल्टर करने योग्य, प्रत्येक अपने विवरण और पूर्ण KQL तक विस्तारित करने योग्य।
- **Defender Custom Detections** — वही कैटलॉग, Sentinel एनालिटिक्स नियमों के बजाय Microsoft Defender for Endpoint के कस्टम डिटेक्शन नियमों के लिए निर्धारित डिटेक्शनों तक सीमित।
- **Alignment Reviews** — जब भी कोई डिटेक्शन एनालिटिक किसी MITRE तकनीक के विरुद्ध पंजीकृत होता है, एक AI जाँच उसके वास्तविक कवरेज की तुलना MITRE के उस तकनीक के अपने विवरण से करती है। जब यह विचलित होता है या तकनीक को केवल आंशिक रूप से कवर करता है, तो यह यहाँ एक मानव समीक्षा आइटम के रूप में आता है, AI के तर्क, एक सुझाए गए KQL फ़िक्स, और उस फ़िक्स के अपने सत्यापन परिणाम (स्टैटिक गेट + बैकटेस्ट) के साथ — कभी भी एक अंधा सुझाव नहीं।
- **Disposition Alerts** — एक रॉट-डिटेक्शन कतार: एक अनुमोदित एनालिटिक जिसका टेलीमेट्री क्षय हो जाता है या जिसका अंतर्निहित नियम त्रुटि देना शुरू कर देता है, उसे यहाँ पुनः-समीक्षा के लिए चिह्नित किया जाता है, जिसका नाम केवल साझा MITRE तकनीक के बजाय उसके अपने डिटेक्शन से होता है।
- **Generated Hunts** — डिटेक्शनों को हंट्स में समूहीकृत किया जाता है (आज प्रति आयातित फ़ाइल एक; एक बार वह एकीकरण आने पर प्रति मूल TI लेख/detections.ai प्रोजेक्ट एक), जो Microsoft Sentinel की अपनी Hunts सुविधा से मेल खाता है। एक हंट को एक वास्तविक Sentinel वर्कस्पेस में `Microsoft.SecurityInsights/hunts` ऑब्जेक्ट के रूप में सिंक किया जा सकता है, साथ ही उसके घटक saved-search क्वेरीज़ (`SENTINEL_HUNTING_SYNC_ENABLED` और एक `mode` — off/manual/auto — द्वारा नियंत्रित, Settings > API Settings में प्रति-टीम कॉन्फ़िगर करने योग्य; जब तक आप ऑप्ट इन न करें तब तक कभी भी मौन ऑटो-पुश नहीं)।
- **Sentinel Hunts** — आपके Sentinel वर्कस्पेस की Hunting सुविधा में वास्तव में क्या तैनात है, इसकी लाइव इन्वेंट्री, इस ऐप के अपने सिंक इतिहास के बजाय सीधे ARM से खींची गई; इसमें प्रति-क्वेरी टेस्ट/ट्यून सुझाव शामिल हैं जिन्हें आप यथास्थान लागू या खारिज कर सकते हैं।
- **Sentinel Analytics Rules** — Microsoft Sentinel के Analytics Rules (`Microsoft.SecurityInsights/alertRules`) के लिए वही विचार — Hunting से एक अलग Sentinel संसाधन प्रकार, क्योंकि ये वही हैं जो वास्तव में एक शेड्यूल पर घटनाएँ/अलर्ट उत्पन्न करते हैं — उसी ट्यून-सुझाव लागू/खारिज वर्कफ़्लो के साथ।
- **Local Detections** — नीचे [Running without Sentinel or an AI provider](#running-without-sentinel-or-an-ai-provider-local-detections-import) देखें।
- **Audit Log** (केवल-एडमिन) — इस ऐप द्वारा वास्तव में चलाए गए प्रत्येक चेक का क्रॉस-पाइपलाइन रिकॉर्ड: AI-जनित डिटेक्शन गेट/कंट्रोल-प्रोब परिणाम, Sentinel हंट सिंक प्रयास, और Sentinel हंट-क्वेरी/एनालिटिक्स-नियम टेस्ट रन, एक पेजिनेटेड, फ़िल्टर करने योग्य सूची में संयुक्त — जानबूझकर वह कवर करते हुए जो कोई भी एकल समीक्षा टैब अपने आप नहीं करता।
पूरी तरह से मुख्य बैकएंड के अंदर चलता है, समीक्षा सतह के लिए स्वयं किसी अतिरिक्त डिप्लॉयमेंट की आवश्यकता नहीं। इसका अपना API डिज़ाइन जानबूझकर नीचे detections.ai के सम्मेलनों का पालन करता है, भले ही यह पूरी तरह से स्व-निहित हो।
2. **detections.ai पाइपलाइन ऑर्केस्ट्रेटर — जल्द आ रहा है।** detections.ai का AI-सहायता प्राप्त डिटेक्शन जनरेशन के लिए एक सार्वजनिक API विकास में है, और इस रेपो में इसके लिए एक वास्तविक एकीकरण बनाया गया है (`backend/detection_pipeline/orchestrator.py`) जो ट्राइएज किए गए थ्रेट इंटेल को लेता है, इसे मौजूदा डिटेक्शन कवरेज के विरुद्ध जाँचता है, और एक शेड्यूल किए गए जॉब के रूप में आपके Sentinel वर्कस्पेस के लिए ड्राफ्ट KQL जनरेट करता है। यह एकीकरण उस API का समर्थन करेगा जब यह उपलब्ध होगा, और अभी इस सार्वजनिक रिलीज़ का हिस्सा नहीं है। इस बीच, **Detections टैब का उपयोग करने के लिए आपको इसकी बिल्कुल भी आवश्यकता नहीं है** — नीचे [Local Detections Import](#running-without-sentinel-or-an-ai-provider-local-detections-import) आज AI-जनरेशन-मुक्त और Sentinel-मुक्त सेटअप के लिए वही "इस ऐप में वास्तविक डिटेक्शन प्राप्त करें" लक्ष्य कवर करता है।
### Sentinel या AI प्रोवाइडर के बिना चलाना: Local Detections Import
ऐप के नाम और प्राथमिक पिच को देखते हुए, **Basic** टियर पर एक स्व-होस्टर से सबसे आम प्रश्न शायद यह होगा *"मेरे पास Sentinel या AI प्रोवाइडर कॉन्फ़िगर नहीं है — क्या मैं अभी भी Detections/Hunts टैब से कुछ प्राप्त कर सकता हूँ?"* उत्तर है हाँ: ऐप को अपनी स्वयं की डिटेक्शन नियम फ़ाइलों के फ़ोल्डर की ओर इंगित करें (हस्त-लिखित, एक वास्तविक Sentinel/Defender टेनेंट से निर्यात, या एक सार्वजनिक Sigma/Sentinel नियम रेपो से खींची गई) और यह उन्हें कैटलॉग, MITRE-टैग, और स्टैटिक रूप से मान्य करेगा — इस सबके लिए किसी Sentinel कनेक्शन और किसी `DETECTIONS_AI_API_KEY`/Anthropic कुंजी की आवश्यकता नहीं।
- **समर्थित प्रारूप, पहले दिन से:** कच्ची `.kql`/`.txt`/`.yar`/`.spl`-या-कोई-भी-एक्सटेंशन फ़ाइलें, प्रत्येक वैकल्पिक रूप से एक `.json`/`.yaml` साइडकार के साथ (`{"file": "myrule.kql", "title": "...", "description": "...", "technique_id": "T1059.001"}`) मेटाडेटा के लिए जिसे Microsoft के अपने निर्यात को अलग से घोषित करने की आवश्यकता नहीं होती; YARA; Suricata; Sigma YAML (एकल- या बहु-दस्तावेज़); Splunk SPL; और Microsoft के अपने मूल निर्यातित Analytics Rule/Hunting Query JSON (केवल `Scheduled`-प्रकार के नियम एक कच्ची KQL क्वेरी रखते हैं जिसे यह ऐप मूल्यांकन कर सकता है — हर अन्य प्रकार को पहचाना और रिपोर्ट किया जाता है, मौन रूप से छोड़ा नहीं जाता)।
- **आयातित फ़ाइल पर वास्तव में क्या चलता है:** KQL सामग्री के लिए स्टैटिक सत्यापन (वही टिकाऊपन/निष्कर्ष इंजन जो AI-जनरेशन पथ उपयोग करता है); एक MITRE संरेखण जाँच भी, यदि आपके पास *वास्तव में* एक AI प्रोवाइडर कॉन्फ़िगर है (Sentinel से एक स्वतंत्र अक्ष — आपके पास एक, दोनों, या कोई भी नहीं हो सकता); Sentinel-निर्भर सब कुछ (बैकटेस्टिंग, टेलीमेट्री प्रोब, डिस्पोज़िशन ट्रैकिंग) दायरे से बाहर रहता है और भ्रामक खाली सेल के बजाय "no Sentinel connection configured" के रूप में प्रस्तुत होता है।
- **यह कहाँ दिखाई देता है:** आयातित सामग्री एक सामान्य हंट/डिटेक्शन पंक्ति बन जाती है — वही टेबल, वही समीक्षा वर्कफ़्लो, वही MITRE तकनीक प्रदर्शन जो AI पाइपलाइन जनरेट करती है — इसलिए यह नियमित `ALL DETECTIONS`/`GENERATED HUNTS` दृश्यों में भी दिखाई देती है, न कि केवल अपने स्वयं के टैब में। समर्पित **Local Detections** सब-टैब (`DETECTIONS` के अंतर्गत, आयात ट्रिगर करने के लिए केवल-एडमिन) वह जगह है जहाँ आप इसे एक फ़ोल्डर की ओर इंगित करते हैं और प्रति-फ़ाइल प्रगति/परिणाम देखते हैं।
- **सेटअप:** `LOCAL_IMPORT_DIR` को बैकएंड के फ़ाइलसिस्टम पर एक पूर्ण पथ पर सेट करें (एक कंटेनर डिप्लॉयमेंट में, एक माउंटेड वॉल्यूम) — आयातित सब कुछ उस रूट के अंतर्गत रहना चाहिए; UI आपको इसके नीचे एक सब-पथ चुनने देता है, कभी भी एक मनमाना फ़ाइलसिस्टम स्थान नहीं। देखें [Environment Variables](#environment-variables)।
- **इसे तुरंत आज़माएँ:** `examples/local-detections-samples/` एक छोटा तैयार-से-आयात फ़ोल्डर प्रदान करता है — दो वैध KQL नियम (एक `.json` साइडकार के साथ जोड़ा गया उस तंत्र को दिखाने के लिए), एक जानबूझकर अमान्य नियम (चिह्नित-अमान्य बैनर देखने के लिए), और एक अपरिचित फ़ाइल (विफल-आयात बैनर देखने के लिए)। तीनों परिणाम स्थितियों को अपने पहले ही आयात पर देखने के लिए `LOCAL_IMPORT_DIR` को उस पर इंगित करें, किसी नियम-लेखन की आवश्यकता नहीं।
**Local Detections** — एक पूर्ण आयात रन: सारांश बैनर उन फ़ाइलों को उजागर करता है जो कैटलॉग की गईं लेकिन स्टैटिक विश्लेषण द्वारा अमान्य चिह्नित की गईं (यहाँ, एक नियम जो एकल हार्डकोडेड हैश पर अलर्ट करता है) ठीक उन फ़ाइलों के साथ जो सफलतापूर्वक आयात हुईं, और प्रत्येक फ़ाइल नीचे एक सामान्य हंट/डिटेक्शन पंक्ति बन जाती है

---
## स्क्रीनशॉट
नीचे दिए गए सभी स्क्रीनशॉट सिंथेटिक डेटा (नकली संगठन नाम, RFC 5737 उदाहरण IPs, `.example` डोमेन) का उपयोग करते हैं जो दस्तावेज़ीकरण के लिए जनरेट किया गया है — कोई वास्तविक थ्रेट इंटेल या ग्राहक डेटा नहीं।
**Feed** — गंभीरता, टैग, IOCs, और TTPs के साथ ट्राइएज किए गए थ्रेट इंटेल प्रविष्टियों को ब्राउज़ और फ़िल्टर करें

<br>
**Dashboard** — एक नज़र में गंभीरता विभाजन और शीर्ष MITRE ATT&CK तकनीकें

<br>
**MITRE ATT&CK** — अंतर्ग्रहीत इंटेल में तकनीक कवरेज का पूर्ण मैट्रिक्स हीटमैप

<br>
**Your Stack** — अपना वातावरण परिभाषित करें; फ़ीड प्रविष्टियाँ प्रासंगिकता के आधार पर पुनः-स्कोर की जाती हैं

<br>
**IOCs** — STIX/CSV निर्यात के साथ सभी निकाले गए संकेतकों का खोजने योग्य लेजर

<br>
**Integrations** — Sentinel, Defender, और RunZero के लिए कनेक्टर अवलोकन: कॉन्फ़िगर/सक्षम स्थिति और प्रत्येक के अपने टैब में शॉर्टकट

<br>
**RunZero** — एसेट सहसंबंध, संगठन-स्तरीय एक्सपोज़र ट्रैकिंग, और उपचार मेट्रिक्स, सभी आपकी RunZero इन्वेंट्री से प्राप्त

<br>
**Exposure** — थ्रेट मैच गणना द्वारा रैंक किए गए संगठन; मेल खाती प्रविष्टियाँ देखने के लिए किसी भी कार्ड पर क्लिक करें

<br>
**Detections** — पंजीकृत एनालिटिक्स का पूरा कैटलॉग (AI-जनित और स्थानीय-आयातित दोनों), प्रत्येक अपनी स्टैटिक-गेट/बैकटेस्ट/समीक्षा स्थिति और MITRE तकनीक के साथ

<br>
**Settings** — AI ट्राइएज नियंत्रण, फ़ीड स्वास्थ्य निगरानी, स्रोत विश्वास स्कोर, और उपयोगकर्ता प्रबंधन

---
## आर्किटेक्चर```
┌─────────────────────────────────────────┐
│ Next.js 16 frontend (port 3000) │
│ Tailwind CSS · dark theme │
└──────────────┬──────────────────────────┘
│ REST API (Bearer token)
┌──────────────▼──────────────────────────┐
│ FastAPI backend (port 8000) │
│ APScheduler · slowapi rate limiting │
└──┬──────────┬──────────┬────────────┬───┘
│ │ │ │
Postgres AI provider RunZero API detections.ai
(modular: (asset sync) (coming soon --
Anthropic or see Features below)
Azure AI Foundry)
बैकएंड (backend/) — Python 3.12 + FastAPI। सभी स्टोरेज के लिए Postgres (SQLite और Azure Blob Storage को पूरी तरह से हटा दिया गया है)। AI प्रोवाइडर और ऑथ विधि दोनों env-var-चयनित हैं, हार्डकोडेड नहीं — नीचे देखें।
फ्रंटएंड (frontend/) — Next.js 16, सादा JavaScript, Tailwind CSS। लोड होने के समय बैकएंड से ऑथ मोड स्वतः पहचानता है।
इन्फ्रा (infra/) — Container Apps, Key Vault, और Container Registry के लिए Azure Bicep टेम्पलेट्स (apps.bicep + platform.bicep + app-stack.bicep, provision.ps1 के माध्यम से तैनात)। केवल Azure + API टियर के लिए प्रासंगिक।
AZURE_AD_TENANT_ID सेट → Entra मोड: Microsoft Entra ID SSO, प्रति-उपयोगकर्ता भूमिकाएँ (पहला लॉगिन एडमिन बनता है, बाकी सभी डिफ़ॉल्ट रूप से व्यूअर होते हैं)।
AZURE_AD_TENANT_ID अनसेट → लोकल मोड: एक साझा LOCAL_API_KEY जिसके पास यह है उसे एडमिन एक्सेस देता है। कोई उपयोगकर्ता प्रबंधन नहीं, कोई Azure निर्भरता नहीं। फ्रंटएंड लोड होने पर GET /api/auth/mode कॉल करता है और स्वचालित रूप से मेल खाती लॉगिन स्क्रीन रेंडर करता है — फ्रंटएंड की ओर से कॉन्फ़िगर करने के लिए कुछ नहीं।
दोनों मोड बाद में एक ही प्रकार का ऐप-हस्ताक्षरित JWT जारी करते हैं, इसलिए हर अन्य रूट (require_auth/require_admin) समान रूप से काम करता है, चाहे टोकन किसी भी मोड ने जारी किया हो।
scripts/setup-basic.sh या scripts/setup-basic-api.sh चलाएँ (Deployment tiers देखें) — वे आपके लिए Postgres और .env जनरेशन संभालते हैं। फिर:```bash
cd backend && pip install -r requirements.txt && uvicorn main:app --reload --port 8000
cd frontend && npm install && npm run dev
### मैनुअल सेटअप```bash
cd backend
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
cp env.example .env # fill in required values — see Environment Variables below
uvicorn main:app --reload --port 8000
| -s | --server | Server URL (default: http://localhost:8080) |
| -t | --token | Authentication token |
| -o | --output | Output file path |
| -f | --format | Output format: json, yaml, csv |
| -v | --verbose | Enable verbose logging |
| -q | --quiet | Suppress non-error output |
| -h | --help | Show help message |
# Scan a single target
scanner -t example.com -o results.json
# Scan multiple targets with authentication
scanner -t example.com,test.com --token abc123 -f yaml
# Verbose mode with custom server
scanner -t example.com -s https://api.example.com -v
The tool supports a configuration file located at ~/.scanner/config.yaml:
server: http://localhost:8080
token: your-token-here
output_format: json
verbose: false
timeout: 30
All API requests require a valid token passed in the Authorization header:
Authorization: Bearer <token>
| Method | Endpoint | Description |
|---|---|---|
GET | /api/v1/scan | List all scans |
POST | /api/v1/scan | Create a new scan |
GET | /api/v1/scan/{id} | Get scan details |
DELETE | /api/v1/scan/{id} | Delete a scan |
GET | /api/v1/results/{id} | Get scan results |
curl -X POST http://localhost:8080/api/v1/scan \
-H "Authorization: Bearer abc123" \
-H "Content-Type: application/json" \
-d '{"target": "example.com", "options": {"depth": 3}}'
{
"id": "scan-12345",
"status": "completed",
"target": "example.com",
"started_at": "2024-01-15T10:30:00Z",
"completed_at": "2024-01-15T10:32:45Z",
"findings": [
{
"type": "vulnerability",
"severity": "high",
"description": "SQL injection detected"
}
]
}
``````bash
cd frontend
npm install
cp env.local.example .env.local # set NEXT_PUBLIC_API_URL=http://localhost:8000
npm run dev
cp backend/env.example backend/.env # fill in required values docker compose up --build
Frontend → http://localhost:3000
Backend API docs → http://localhost:8000/docs
---
## Environment Variables
`backend/env.example` को `backend/.env` में कॉपी करें और भरें। किस tier को कौन से चाहिए, इसके अनुसार समूहित:
**हमेशा आवश्यक:**
| Variable | Description |
|----------|-------------|
| `PG_DSN` | Postgres connection string |
| `JWT_SECRET_KEY` | App session tokens पर हस्ताक्षर करने के लिए secret (`python -c "import secrets; print(secrets.token_hex(32))"`) |
**Auth — एक mode चुनें:**
| Variable | Description |
|----------|-------------|
| `LOCAL_API_KEY` | Local mode: साझा key जो admin access देती है। इस mode को सक्रिय करने के लिए `AZURE_AD_TENANT_ID` unset छोड़ें |
| `AZURE_AD_TENANT_ID` | Entra mode: SSO के लिए tenant ID। इसे सेट करने पर Entra mode सक्रिय हो जाता है |
| `AZURE_AD_CLIENT_ID` | Entra mode: app registration client ID |
| `AZURE_AD_CLIENT_SECRET` | Entra mode: app registration secret (केवल frontend) |
| `NEXTAUTH_SECRET` | Entra mode: NextAuth session encryption secret (केवल frontend) |
**AI triage — वैकल्पिक, एक provider चुनें (triage बंद करके चलाने के लिए दोनों छोड़ दें):**
| Variable | Description |
|----------|-------------|
| `AI_PROVIDER` | `anthropic` (default) या `azure` |
| `ANTHROPIC_API_KEY` | सीधा Anthropic API key |
| `AZURE_FOUNDRY_ENDPOINT` | Azure AI Foundry endpoint, जैसे `https://<resource>.services.ai.azure.com/anthropic` |
| `AZURE_FOUNDRY_API_KEY` | Azure AI Foundry API key |
| `AZURE_FOUNDRY_DEPLOYMENT` | Foundry deployment name (default `claude-haiku-4-5`) |
| `AZURE_FOUNDRY_API_VERSION` | Foundry API version (default `2025-05-01`) |
**वैकल्पिक:**
| Variable | Description |
|----------|-------------|
| `RUNZERO_API_TOKEN` | RunZero asset sync और correlation सक्षम करता है |
| `ALLOWED_ORIGINS` | कॉमा से अलग CORS allowlist (default `http://localhost:3000`) |
| `ENABLE_SCHEDULER` | background feed poller को बंद करने के लिए `false` सेट करें (default `true`) |
| `ARCHIVE_AFTER_DAYS` | दिनों में auto-archive threshold (default `90`) |
| `PG_POOL_MIN` / `PG_POOL_MAX` / `PG_POOL_TIMEOUT` | Postgres connection pool tuning (defaults `1` / `10` / `30`) |
| `LOCAL_IMPORT_DIR` | [Local Detections Import](#running-without-sentinel-or-an-ai-provider-local-detections-import) सक्षम करता है — backend के filesystem पर absolute path जिस तक हर import सीमित रहता है। Unset करने पर यह feature पूरी तरह बंद हो जाता है (इसका tab "not configured" संदेश दिखाता है) |
**Frontend** (`frontend/.env.local` या `frontend/env.local.example`):
| Variable | Description |
|----------|-------------|
| `NEXT_PUBLIC_API_URL` | browser को दिखने वाला Backend URL। build time पर JS bundle में baked हो जाता है। API calls को built-in same-origin proxy (`frontend/pages/api/[...proxy].js`) के माध्यम से route करने के लिए इसे **unset** छोड़ें — जब भी backend का कोई public ingress न हो (जैसे Azure + API tier का internal-only Container App) तब यह आवश्यक है |
| `BACKEND_URL` | Next.js server को दिखने वाला Backend URL। NextAuth के login exchange द्वारा उपयोग किया जाता है और, जब `NEXT_PUBLIC_API_URL` unset हो, तो उस same-origin proxy द्वारा भी जो हर `/api/*` browser request को server-side forward करता है |
**detections.ai orchestrator — जल्द आ रहा है** (अभी इस public release का हिस्सा नहीं; यहाँ इसके ship होने पर के लिए documented है। Azure + API tier, अलग deployable — देखें `backend/detection_pipeline/orchestrator.py`):
| Variable | Description |
|----------|-------------|
| `DETECTIONS_AI_API_KEY` | orchestrator को चलाने के लिए आवश्यक |
| `SENTINEL_WORKSPACE_ID` | Log Analytics workspace customer ID (GUID), backtesting के लिए। वैकल्पिक |
| `PIPELINE_BATCH_SIZE` | प्रति run entries (default `5`) |
| `PIPELINE_DRY_RUN` | API को call किए बिना claim और log करने के लिए `true` |
| `PIPELINE_LANGUAGE` | Detection query language (default `kql`) |
**Sentinel Hunts sync** (वैकल्पिक, default रूप से बंद — on/off/manual/auto mode के लिए Settings > API Settings देखें):
| Variable | Description |
|----------|-------------|
| `SENTINEL_HUNTING_SYNC_ENABLED` | किसी भी hunt sync प्रयास की अनुमति देने के लिए `true`। Unset/false पूरी तरह no-op है — शून्य ARM calls |
| `AZURE_SUBSCRIPTION_ID` | Sentinel workspace वाली Subscription |
| `AZURE_RESOURCE_GROUP` | Sentinel workspace वाला Resource group |
| `SENTINEL_WORKSPACE_NAME` | workspace का **name**, इसका customer ID नहीं — ऊपर दिए `SENTINEL_WORKSPACE_ID` से अलग मान, जिसका उपयोग backtesting data-plane client करता है |
---
## Azure Deployment
वास्तविक, वर्तमान IaC `infra/apps.bicep` + `infra/platform.bicep` + `infra/app-stack.bicep` है, जिसे `infra/provision.ps1` (या पतले wrapper `scripts/setup-azure.ps1`) के माध्यम से deploy किया जाता है। यह Container Apps, Key Vault-backed secrets, और managed identities provision करता है — Postgres स्वयं इस repo द्वारा provision नहीं किया जाता; `PG_DSN` (जो `pg-dsn` Key Vault secret के रूप में संग्रहीत है) को किसी भी reachable Postgres server पर point करें।```powershell
./scripts/setup-azure.ps1
# or directly:
cd infra
cp migration.psd1.example migration.psd1 # fill in your resource group, apps, etc.
./provision.ps1
provision.ps1 idempotent है — manifest को संपादित करने के बाद इसे दोबारा चलाना सुरक्षित है। पूर्ण चरण-दर-चरण (platform → app stack → secrets → Easy Auth → image import → apps → post-checks) के लिए इसकी स्वयं की header comment देखें।
detections.ai orchestrator (migration.psd1 में एक Orchestrator block द्वारा संचालित एक scheduled Container Apps Job — आकार के लिए migration.psd1.example देखें, और अपनी key को DETECTIONSAIAPIKEY Key Vault secret के रूप में संग्रहीत करें) अभी इस सार्वजनिक रिलीज़ का हिस्सा नहीं है — ऊपर Two detections-related features देखें।
├── backend/ │ ├── main.py # FastAPI app, all endpoints │ ├── db.py # Postgres queries │ ├── pgcompat.py # connection pool + SQLite-style placeholder translation │ ├── feed_manager.py # RSS polling, AI triage (provider-modular), scheduler │ ├── enrichment.py # IOC extraction, KEV cache, stack rematch │ ├── runzero_sync.py # RunZero asset sync and correlation engine │ ├── dedup.py # CVE deduplication logic │ ├── auth.py # Entra ID SSO + local API-key auth, app JWT sign/verify │ ├── ioc_export.py # STIX 2.1 and CSV export │ ├── stack_presets.py # Pre-built tech stack templates │ ├── detection_pipeline/ # detections.ai orchestrator, MITRE alignment-check, │ │ # Sentinel hunts/analytics-rules sync + tuning, │ │ # audit log, local_import.py (Local Detections Import) │ └── tests/ # pytest test suite, incl. fixtures/local_import/ ├── frontend/ │ ├── pages/ │ │ ├── index.js # Main app shell + tab routing │ │ └── login.js # Entra ID or local API-key login, auto-detected │ ├── lib/ │ │ ├── authMode.js # GET /api/auth/mode, cached per page load │ │ ├── authFetch.js # Bearer auth + 401-retry wrapper │ │ └── authSession.js # token storage, JWT decode/expiry helpers │ └── components/ │ ├── layout/ # TopBar, Sidebar, TabBar, TopFilterBar, TimeRangeToggle │ ├── feed/ # FeedList, FeedCard │ ├── integrations/ # IntegrationsPanel, ExposurePanel, RunZeroPanel, │ │ # RunZeroMatchesPanel, RunZeroMetricsPanel │ ├── detections/ # DetectionsPanel (tab shell) + one component per │ │ # sub-tab: DetectionsCatalogPanel, AlignmentReviewPanel, │ │ # DispositionAlertsPanel, HuntsPanel, SentinelHuntsPanel, │ │ # SentinelAnalyticsRulesPanel, LocalDetectionsPanel, │ │ # AuditPanel, plus shared TuningSuggestionBadge │ ├── settings/ # SettingsPanel, CadencePicker, SeverityCards │ └── mitre/ # MitreMatrix ├── infra/ # Azure Bicep templates + provision.ps1 ├── scripts/ # Tiered setup scripts (see Deployment tiers) └── docker-compose.yml
---
## फ़ीड स्रोत
तीन स्तरों में 63 फ़ीड:
- **स्तर 1** — CISA, Cisco Talos, Fortinet Threat Signal, ESET WeLiveSecurity, Microsoft Security Blog, SentinelOne Labs, Google Project Zero, Zero Day Initiative, Check Point Research, Talos Intelligence Blog, The DFIR Report, Oracle
- **स्तर 2** — Recorded Future, Malpedia, SANS ISC, Securelist, Unit42, Proofpoint TI, Malwarebytes TI, Wiz Blog, Datadog Security Labs, ReversingLabs, Sekoia, Cyble, ANY.RUN Blog, और अन्य
- **स्तर 3** — BleepingComputer, Krebs on Security, Schneier on Security, The Hacker News, Dark Reading, CrowdStrike Blog, Snyk, Semgrep, और अन्य
---
## सुरक्षा
- सभी API एंडपॉइंट के लिए `Authorization: Bearer <token>` आवश्यक है
- स्थानीय प्रमाणीकरण कुंजी के लिए टाइमिंग-सेफ़ टोकन तुलना (`secrets.compare_digest`)
- पूरे कोड में पैरामीटरयुक्त SQL — क्वेरीज़ में कोई स्ट्रिंग इंटरपोलेशन नहीं
- CORS स्पष्ट ओरिजिन अनुमति-सूची तक सीमित
- AI प्रदाता कॉल से पहले LLM इनपुट सैनिटाइज़ किए जाते हैं; भंडारण से पहले आउटपुट सत्यापित किए जाते हैं
- कंटेनर गैर-रूट के रूप में चलते हैं और सभी Linux क्षमताएँ हटा दी गई हैं
- इमेज में कोई सीक्रेट शामिल नहीं — रनटाइम पर `.env` / Azure Key Vault से लोड किए जाते हैं
---
## लाइसेंस
MIT — देखें [LICENSE](https://github.com/ethan-andrews/threatintel-aggregator/blob/main/LICENSE)।