
CVE/कॉन्फ़िग रेमेडिएशन ऑर्केस्ट्रेशन के लिए MCP सर्वर: SSH इन्वेंटरी, OSV/NVD लुकअप, CIS/DISA STIG-मैप्ड Ansible प्लेबुक सुझाव।
व्यवहार संबंधी परिवर्तन करने से पहले रिपॉज़िटरी के उद्देश्य, घटकों और दायरे के उच्च-स्तरीय विवरण के लिए OVERVIEW.md देखें।
एक उपचार ऑर्केस्ट्रेटर, जो MCP सर्वर के रूप में उपलब्ध है। एक MCP क्लाइंट (Claude Desktop, Claude Code, या समान) कनेक्ट करें और प्राकृतिक भाषा में अनुरोध सबमिट करें, उदाहरण के लिए:
होस्ट a.b.c में लॉग इन करें, इंस्टॉल किए गए पैकेज जांचें, CVE खोजें, और एक समाधान सुझाएं - यदि संभव हो तो Ansible, और बताएं कि यह किन अनुपालन नियंत्रणों से मैप होता है।
prescryb प्राथमिक इकाइयाँ (primitives) प्रदान करता है (SSH इन्वेंटरी, CVE मिलान, लाइव एडवाइज़री लुकअप, अनुपालन-विषय मैपिंग, Ansible प्लेबुक रेंडरिंग)। कनेक्टेड मॉडल तर्क करता है: कौन-से निष्कर्ष मायने रखते हैं, किन CVE में गहराई से जाना है, कौन-सी प्लेबुक जनरेट करनी है। prescryb लक्ष्य होस्ट पर कभी कुछ लागू नहीं करता - प्रत्येक टूल उसके विरुद्ध केवल-पठन (read-only) है, या शुद्ध टेक्स्ट/डेटा जनरेशन है।
| टूल | यह क्या करता है |
|---|---|
inventory_host(host, user="", port=22, hostname="", identity_file="", trust_unknown_host=False) | SSH से जुड़ें, डिस्ट्रो का पता लगाएं, संस्करणों के साथ इंस्टॉल किए गए पैकेज की सूची बनाएं। |
check_cves(system, packages) | पैकेज संस्करणों को OSV.dev के विरुद्ध बैच-मैच करें, इसकी इकोसिस्टम-जागरूक संस्करण तुलना का उपयोग करते हुए (केवल नाम-आधारित मिलान नहीं)। प्रत्येक मिलान को EPSS शोषण-संभाव्यता स्कोर के साथ समृद्ध किया जाता है। |
fetch_advisory(cve_id) | एक CVE के लिए वर्तमान NVD रिकॉर्ड प्राप्त करें - विवरण, CVSS, CWE, संदर्भ - लाइव, प्रशिक्षण डेटा से नहीं। |
fetch_epss(cve_ids) | उन CVE IDs के लिए EPSS शोषण-संभाव्यता स्कोर बैच-प्राप्त करें जो पहले से check_cves द्वारा कवर नहीं किए गए हैं (जैसे fetch_advisory या वेब खोज से)। |
map_compliance(area) | एक मुक्त-पाठ विषय ("ssh", "sudo", "kernel modules", ...) को CIS/DISA STIG विषय क्षेत्रों से मैप करें और, यदि konstruktoid.hardening GitHub रिपॉज़िटरी में मौजूद हो, तो मिलान करने वाली भूमिका से - साथ ही उस क्षेत्र द्वारा संबोधित MITRE ATT&CK तकनीकों और शमन उपायों से। |
lookup_cce(target, keyword, cce_id) | एक प्लेटफ़ॉर्म (जैसे "rhel8") के लिए NIST CCE (Common Configuration Enumeration) प्रविष्टियाँ खोजें, जो konstruktoid/cce-web पर सामुदायिक JSON रूपांतरण से प्राप्त हैं। |
list_cce_targets() | प्रत्येक प्लेटफ़ॉर्म की सूची बनाएं जिसे lookup_cce क्वेरी कर सकता है। |
list_local_docs() | स्थानीय, gitignored LOCAL_DOCS_DIR के अंतर्गत पाए गए दस्तावेज़ों (Markdown/text/PDF) की सूची बनाएं। |
search_local_docs(query, top_k=5) | उन स्थानीय दस्तावेज़ों पर RAG-शैली की सिमेंटिक खोज, पूरी तरह से मशीन पर एम्बेडेड। |
generate_playbook(system, cve_matches, compliance_areas, hosts_alias) | एक केवल-सुझाव Ansible प्लेबुक रेंडर करें: CVE समाधान पैकेज-अपग्रेड कार्य बन जाते हैं, अनुपालन क्षेत्र roles: संदर्भ बन जाते हैं। |
सामान्य प्रवाह: inventory_host, फिर लौटाए गए पैकेजों पर check_cves, फिर वैकल्पिक रूप से रोचक CVE पर fetch_advisory, फिर किसी भी असुरक्षित-कॉन्फ़िग क्षेत्र के लिए map_compliance (और lookup_cce), फिर वैकल्पिक रूप से प्रासंगिक आंतरिक रनबुक/नीति संदर्भ के लिए search_local_docs, फिर समीक्षा करने के लिए कुछ उत्पन्न करने हेतु generate_playbook।
flowchart TD
U["Operator: natural-language request"] --> M["Connected model\n(Claude Desktop / Claude Code)"]
M --> A["inventory_host\nSSH in, list packages"]
A --> B["check_cves\nOSV.dev match + EPSS score"]
B --> C{"Interesting\nCVE?"}
C -->|yes| D["fetch_advisory\nNVD detail for one CVE"]
C -->|no| E
D --> E["map_compliance / lookup_cce\nCIS/DISA STIG + ATT&CK mapping"]
E --> F["search_local_docs\ninternal runbooks (optional)"]
F --> G["generate_playbook\nsuggest-only Ansible playbook"]
G --> H["Model reasons over the results\nand presents findings + playbook"]
H --> R["Operator reviews\n(ansible-playbook --check --diff)\nand applies manually"]
style R fill:#f9f,stroke:#333,stroke-width:1px
केवल टूल बॉक्स prescryb हैं: inventory_host, check_cves,
fetch_advisory, map_compliance/lookup_cce, search_local_docs, और
generate_playbook - प्रत्येक एक रीड-ओनली लुकअप या शुद्ध टेक्स्ट/डेटा जनरेशन
कॉल है। ऑपरेटर और कनेक्टेड मॉडल prescryb का हिस्सा नहीं हैं, और
इस श्रृंखला में कुछ भी inventory_host के
रीड-ओनली SSH सत्र से परे लक्ष्य होस्ट को स्पर्श नहीं करता - जनरेट किए गए प्लेबुक को लागू करना एक जानबूझकर,
अलग कदम है जो ऑपरेटर prescryb के बाहर उठाता है।
uv sync
Claude Code:
claude mcp add prescryb -- uv --directory /path/to/prescryb run prescryb
Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"prescryb": {
"command": "uv",
"args": ["--directory", "/path/to/prescryb", "run", "prescryb"]
}
}
}
inventory_host कभी भी पासवर्ड आर्ग्युमेंट स्वीकार नहीं करता। MCP टूल-कॉल आर्ग्युमेंट्स को क्लाइंट्स द्वारा लॉग किया जा सकता है और वे कनेक्टेड मॉडल को दिखाई देते हैं, इसलिए क्रेडेंशियल्स को कभी भी उनके माध्यम से प्रवाहित नहीं होना चाहिए। प्रमाणीकरण ठीक वैसे ही काम करता है जैसे आप स्वयं ssh host चलाते हैं:
~/.ssh/config से हल की जाती हैं।inventory_host के hostname/identity_file आर्ग्युमेंट्स सीधे हल किए गए एड्रेस/कुंजी पथ को ओवरराइड करते हैं, उन होस्ट्स के लिए जिन्हें आप ~/.ssh/config में जोड़ना नहीं चाहते (केवल एक पथ पास किया जाता है, कभी भी कुंजी की सामग्री नहीं)।trust_unknown_host=True पास न करें
ssh host चलाना बेहतर है।qemu/vm.sh एक cloud-init seed और 127.0.0.1 पर SSH पोर्ट फ़ॉरवर्ड (2201, 2202, 2203) के साथ QEMU के अंतर्गत एक क्लाउड इमेज (almalinux10, trixie, resolute) बूट करता है। इसे qemu-system-x86_64, qemu-img, cloud-localds (cloud-image-utils), curl और ssh की आवश्यकता होती है; जब /dev/kvm लिखने योग्य हो तो KVM का उपयोग किया जाता है। इमेजेस चेकसम-सत्यापित होती हैं और qemu/.state/ में कैश की जाती हैं।
qemu/vm.sh up trixie
qemu/vm.sh ssh trixie true # retry until the guest answers
claude 'inventory 127.0.0.1 port 2202 user prescryb with identity file
qemu/.state/id_ed25519 (trust_unknown_host is fine, it is a throwaway VM),
check any vulnerabilities and suggest a fix, include compliance mapping if
possible, write the playbook suggestion to /tmp/ and print the file location'
qemu/vm.sh destroy trixie
उस होस्ट के लिए जो पहले से ssh के माध्यम से पहुँच योग्य है (~/.ssh/config, किसी एजेंट कुंजी, या डिफ़ॉल्ट पहचान फ़ाइल के माध्यम से हल किया गया), होस्टनाम सीधे निर्दिष्ट करें; किसी पोर्ट या पहचान-फ़ाइल कॉन्फ़िगरेशन की आवश्यकता नहीं है:
Inventory prod-web-01, check installed packages, find CVEs, and suggest a fix - Ansible if possible, and tell me what compliance controls it maps to.
यदि होस्ट अभी तक ~/.ssh/config में नहीं है, तो या तो एक Host ब्लॉक जोड़ें या एक बार के कनेक्शन के लिए सीधे inventory_host को user/port/hostname/identity_file पास करें - ठीक नीचे दिए गए molecule उदाहरण की तरह।
molecule converge -s default
उस परिदृश्य की molecule.yml प्लेटफ़ॉर्म प्रविष्टि से ssh_port/ssh_user खोजें (उदाहरण के लिए almalinux10 प्लेटफ़ॉर्म के लिए ssh_port: 22201, ssh_user: almalinux) और वह निजी कुंजी जिसका उपयोग molecule login कनेक्ट करने के लिए करता है - या तो ~/.ssh/config में एक Host ब्लॉक जोड़ें, या फ़ाइल को पूरी तरह छोड़ दें और उन्हें सीधे inventory_host को एक बार के, अस्थायी कनेक्शन के लिए पास करें: