
خادم MCP لتنسيق معالجة CVE/الإعدادات: جرد SSH، واستعلامات OSV/NVD، واقتراحات Ansible playbook المرتبطة بمعايير CIS/DISA STIG.
راجع OVERVIEW.md للحصول على وصف عام لغرض المستودع ومكوّناته ونطاقه قبل إجراء تغييرات سلوكية.
منسّق معالجة، يُعرض كخادم MCP. اتصل بعميل MCP (Claude Desktop أو Claude Code أو ما شابه) وقدّم طلبًا باللغة الطبيعية، على سبيل المثال:
سجّل الدخول إلى المضيف a.b.c، وافحص الحزم المثبّتة، وابحث عن CVEs، واقترح إصلاحًا - Ansible إن أمكن، وأخبرني بضوابط الامتثال التي يرتبط بها.
يوفّر prescryb العناصر الأساسية (جرد SSH، ومطابقة CVE، والبحث المباشر في الاستشارات، وربط موضوعات الامتثال، وتوليد ملفات Ansible playbook). النموذج المتصل هو من يقوم بالاستدلال: أي النتائج مهمة، وأي CVEs يجب التعمق فيها، وأي playbook يجب توليده. لا يطبّق prescryb أي شيء على المضيف الهدف أبدًا - فكل أداة إما للقراءة فقط تجاهه، أو لتوليد نص/بيانات خالص.
| الأداة | ما تفعله |
|---|---|
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) | جلب سجل NVD الحالي لـ CVE واحد - الوصف، وCVSS، وCWE، والمراجع - مباشرةً، وليس من بيانات التدريب. |
fetch_epss(cve_ids) | جلب دفعات من درجات احتمالية الاستغلال EPSS لمعرّفات CVE غير المشمولة بالفعل بواسطة check_cves (مثلًا من fetch_advisory أو بحث ويب). |
map_compliance(area) | ربط موضوع نصي حر ("ssh"، "sudo"، "kernel modules"، ...) بمجالات موضوعات CIS/DISA STIG، وإن وُجد في مستودع GitHub konstruktoid.hardening، الدور المطابق - إضافةً إلى تقنيات MITRE ATT&CK والتخفيفات التي يعالجها ذلك المجال. |
lookup_cce(target, keyword, cce_id) | البحث عن مدخلات NIST CCE (Common Configuration Enumeration) لمنصة ما (مثل "rhel8")، مصدرها تحويل JSON المجتمعي في konstruktoid/cce-web. |
list_cce_targets() | سرد كل منصة يمكن لـ lookup_cce الاستعلام عنها. |
list_local_docs() | سرد المستندات (Markdown/نص/PDF) الموجودة تحت LOCAL_DOCS_DIR المحلي المستبعد من git. |
search_local_docs(query, top_k=5) | بحث دلالي بنمط RAG عبر تلك المستندات المحلية، مضمّن بالكامل على الجهاز. |
generate_playbook(system, cve_matches, compliance_areas, hosts_alias) | توليد Ansible playbook للالاقتراح فقط: تتحول إصلاحات CVE إلى مهام ترقية حزم، وتتحول مجالات الامتثال إلى مراجع roles:. |
التدفق النموذجي: inventory_host، ثم check_cves على الحزم المُعادة، ثم اختياريًا fetch_advisory على CVEs المثيرة للاهتمام، ثم 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، ولا شيء في هذه السلسلة
يمس المضيف الهدف بما يتجاوز جلسة SSH للقراءة فقط الخاصة بـ inventory_host -
فتطبيق دليل التشغيل المولّد خطوة متعمّدة ومنفصلة يتخذها المشغّل خارج 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.hostname/identity_file الخاصة بـ inventory_host العنوان/مسار المفتاح المستخرجين مباشرةً، وذلك للمضيفات التي لا ترغب في إضافتها إلى ~/.ssh/config (يُمرَّر المسار فقط، وليس محتويات المفتاح أبدًا).trust_unknown_host=True
ssh host يدويًا مرة واحدة لتثبيت المفتاح بدلًا من ذلك.يشغّل qemu/vm.sh صورة سحابية (almalinux10، trixie، resolute) تحت QEMU مع بذرة cloud-init وإعادة توجيه منفذ SSH على 127.0.0.1 (2201، 2202، 2203). يحتاج إلى qemu-system-x86_64 وqemu-img وcloud-localds (cloud-image-utils) وcurl وssh؛ ويُستخدم KVM عندما يكون /dev/kvm قابلًا للكتابة. يتم التحقق من الصور عبر checksum وتخزينها مؤقتًا في 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، افحص الحزم المثبّتة، وابحث عن CVEs، واقترح إصلاحًا - Ansible إن أمكن، وأخبرني بضوابط الامتثال التي يُطابقها.
إذا لم يكن المضيف موجودًا في ~/.ssh/config بعد، فأضف كتلة Host أو مرّر
user/port/hostname/identity_file مباشرةً إلى inventory_host لاتصال
لمرة واحدة - كما في مثال molecule أدناه.
molecule converge -s default
ابحث عن ssh_port/ssh_user من إدخال المنصة molecule.yml الخاص بذلك السيناريو
(مثل ssh_port: 22201، وssh_user: almalinux لمنصة almalinux10) والمفتاح الخاص
الذي يستخدمه molecule login للاتصال - إما بإضافة كتلة Host إلى ~/.ssh/config،
أو بتخطي الملف كليًا وتمريرهما مباشرةً إلى inventory_host لاتصال مؤقت لمرة واحدة:
Inventory 127.0.0.1، المنفذ 22201، المستخدم almalinux، identity_file /path/to/molecule's/generated/key، تحقق من الحزم المثبّتة، وابحث عن CVEs، واقترح إصلاحًا - Ansible إن أمكن، وأخبرني بضوابط الامتثال التي يُعيّنها إليها.
شغّل molecule destroy -s default عند الانتهاء؛ فلن يقوم prescryb بذلك
نيابةً عنك، ولن يمسّ المثيل بأي شيء يتجاوز قراءته.
يُسمّي map_compliance مجالات الموضوعات (مثل "SSH Server Configuration")، وإن
وُجد في مستودع GitHub konstruktoid/ansible-collection-hardening،
فرابطًا إلى دور Ansible الذي ينفّذها.
افتراضيًا يستعلم من GitHub API مقابل
konstruktoid/ansible-collection-hardening.
يمكن تجاوز ذلك عبر:
export HARDENING_COLLECTION_REPO=owner/repo