
Gixy-Next: ماسح أمان تهيئة NGINX ومدقق الأداء
# Gixy-Next: ماسح أمان لإعدادات NGINX لتدقيق الأمان
## نظرة عامة
<a href="https://gixy.io/"><img width="192" height="192" alt="Gixy-Next Mascot Logo" style="float: right;" align="right" src="https://assets.kitploit.com/production/public/readmes/10695/943d5c952685014f6540ef9cb02fe9d8cd895479a41a8f78786b5f2997207ec0.jpg" /></a>
Gixy-Next (Gixy) هو ماسح أمان وأداة تقوية مفتوحة المصدر لإعدادات NGINX، يقوم بتحليل ملف nginx.conf بشكل ساكن لاكتشاف سوء الإعدادات الأمنية وثغرات التقوية ومزالق الأداء الشائعة قبل وصولها إلى بيئة الإنتاج. وهو نسخة متفرعة تُصان بنشاط من أداة [Gixy](https://github.com/yandex/gixy) الخاصة بـ Yandex. الشيفرة المصدرية لـ Gixy-Next [متاحة على GitHub](https://github.com/megamansec/gixy-next).
يمكن أيضًا تشغيل Gixy-Next في المتصفح عبر [هذه الصفحة](https://gixy.io/scanner/). لا حاجة إلى أي تنزيل؛ يمكنك فحص إعداداتك على الموقع (محليًا، باستخدام WebAssembly).
### البدء السريع
يُوزَّع Gixy-Next (واجهة سطر الأوامر `gixy` أو `gixy-next`) على [PyPI](https://pypi.python.org/pypi/Gixy-Next). يمكنك تثبيته باستخدام pip أو uv:
```shell-session
# pip
pip3 install gixy-next
# uv
uv pip install gixy-next
```
يمكنك بعد ذلك تشغيله:
```shell-session
# gixy defaults to reading /etc/nginx/nginx.conf
gixy
# But you can also specify a path to the configuration
gixy /opt/nginx.conf
```
يمكنك أيضًا تصدير إعدادات NGINX الخاصة بك إلى ملف تفريغ واحد (انظر [nginx -T Live Configuration Dump](https://gixy.io/nginx-config-dump)):
```shell-session
# Dumps the full NGINX configuration into a single file (including all includes)
nginx -T > ./nginx-dump.conf
# Scan the dump elsewhere (or via stdin):
gixy ./nginx-dump.conf
# or
cat ./nginx-dump.conf | gixy -
```
### ماسح ضوئي قائم على الويب
بدلاً من تنزيل Gixy-Next وتشغيله محليًا، يمكنك استخدام [هذه الصفحة](https://gixy.io/scanner/) وفحص إعدادات من متصفح الويب الخاص بك (محليًا، باستخدام WebAssembly).
### الفحص باستخدام Docker
يتوفر Gixy-Next كصورة Docker من [Docker Hub](https://hub.docker.com/r/megamansec/gixy-next/) أو [GitHub Registry](https://github.com/MegaManSec/Gixy-Next/pkgs/container/gixy-next).
افحص ملف إعدادات محليًا عن طريق تحميله (mount) داخل الحاوية:
```shell-session
# Use Github Registry
docker run --pull=always --rm -v "$PWD/nginx.conf:/nginx.conf:ro" ghcr.io/megamansec/gixy-next /nginx.conf
# Or Docker Hub
docker run --pull=always --rm -v "$PWD/nginx.conf:/nginx.conf:ro" megamansec/gixy-next /nginx.conf
```
افحص تفريغ إعدادات NGINX الحية:
```shell-session
# Dumps the full NGINX configuration into a single file (including all includes)
nginx -T > ./nginx-dump.conf
# Use Github Registry
docker run --pull=always --rm -v "$PWD/nginx-dump.conf:/nginx-dump.conf:ro" ghcr.io/megamansec/gixy-next /nginx-dump.conf
# Or Docker Hub
docker run --pull=always --rm -v "$PWD/nginx-dump.conf:/nginx-dump.conf:ro" megamansec/gixy-next /nginx-dump.conf
```
قراءة من stdin:
```shell-session
# Use Github Registry
nginx -T | docker run --pull=always --rm -i ghcr.io/megamansec/gixy-next gixy-next -
# Or Docker Hub
nginx -T | docker run --pull=always --rm -i megamansec/gixy-next gixy-next -
```
## ما يمكنه فعله
يمكن لـ Gixy-Next اكتشاف مجموعة واسعة من حالات سوء التكوين الأمني والأداء في NGINX عبر `nginx.conf` وملفات التكوين المضمّنة. الإضافات التالية مدعومة:
- [[add_header_content_type] تعيين Content-Type عبر add_header](https://gixy.io/plugins/add_header_content_type/)
- [[add_header_multiline] رؤوس استجابة متعددة الأسطر](https://gixy.io/plugins/add_header_multiline/)
- [[add_header_redefinition] إعادة تعريف رؤوس الاستجابة بواسطة توجيه "add_header"](https://gixy.io/plugins/add_header_redefinition/)
- [[alias_traversal] اجتياز المسار عبر alias مُهيأ بشكل خاطئ](https://gixy.io/plugins/alias_traversal/)
- [[allow_without_deny] allow محددة دون deny](https://gixy.io/plugins/allow_without_deny/)
- [[default_server_flag] علامة default_server مفقودة](https://gixy.io/plugins/default_server_flag/)
- [[error_log_off] `error_log` مضبوط على `off`](https://gixy.io/plugins/error_log_off/)
- [[filesystem_root_exposure] استخدام جذر نظام الملفات كجذر مستندات](https://gixy.io/plugins/filesystem_root_exposure/)
- [[hash_without_default] default مفقود في كتل hash](https://gixy.io/plugins/hash_without_default/)
- [[host_spoofing] تزوير رأس Host في الطلب](https://gixy.io/plugins/host_spoofing/)
- [[http2_misdirected_request] حماية مفقودة ضد الطلبات الموجّهة خطأً في HTTP/2](https://gixy.io/plugins/http2_misdirected_request/)
- [[http_splitting] تقسيم استجابة HTTP](https://gixy.io/plugins/http_splitting/)
- [[if_is_evil] If is evil عند استخدامه في سياق location](https://gixy.io/plugins/if_is_evil/)
- [[invalid_regex] مجموعات التقاط regex غير صالحة](https://gixy.io/plugins/invalid_regex/)
- [[low_keepalive_requests] قيمة `keepalive_requests` منخفضة](https://gixy.io/plugins/low_keepalive_requests/)
- [[missing_worker_processes] `worker_processes` مفقود](https://gixy.io/plugins/missing_worker_processes/)
- [[mixed_case_variable] مراجع متغيرات بأحرف مختلطة الحالة](https://gixy.io/plugins/mixed_case_variable/)
- [[origins] مشكلات في التحقق من رأس referer/origin](https://gixy.io/plugins/origins/)
- [[overlapping_captures] عمليات التقاط متداخلة في سياق إعادة توجيه/وسائط rewrite](https://gixy.io/plugins/overlapping_captures/)
- [[proxy_buffering_off] تعطيل `proxy_buffering`](https://gixy.io/plugins/proxy_buffering_off/)
- [[proxy_pass_normalized] يمكن أن يرسل `proxy_pass` مسارًا غير مقصود إلى المنبع](https://gixy.io/plugins/proxy_pass_normalized/)
- [[proxy_set_header_redefinition] إعادة تعريف رؤوس الطلبات المُمرَّرة عبر الوكيل بواسطة توجيه "proxy_set_header"](https://gixy.io/plugins/proxy_set_header_redefinition/)
- [[quic_bpf_reuseport] إسقاط اتصالات QUIC بصمت بعد إعادة التحميل](https://gixy.io/plugins/quic_bpf_reuseport/)
- [[regex_redos] حجب الخدمة عبر التعبيرات النمطية (ReDoS)](https://gixy.io/plugins/regex_redos/)
- [[resolver_external] استخدام خوادم أسماء DNS خارجية](https://gixy.io/plugins/resolver_external/)
- [[return_bypasses_allow_deny] توجيه return يتجاوز قيود allow/deny](https://gixy.io/plugins/return_bypasses_allow_deny/)
- [[ssl_ecdh_curve] مجموعات ما بعد الكم تمنع NGINX من البدء على إصدارات OpenSSL الأقدم](https://gixy.io/plugins/ssl_ecdh_curve/)
- [[ssl_stapling_letsencrypt] تدبيس OCSP لا يفعل شيئًا لشهادة Let's Encrypt](https://gixy.io/plugins/ssl_stapling_letsencrypt/)
- [[ssl_stapling_without_resolver] يفشل تدبيس OCSP بصمت دون resolver](https://gixy.io/plugins/ssl_stapling_without_resolver/)
- [[ssrf] تزوير الطلبات من جانب الخادم](https://gixy.io/plugins/ssrf/)
- [[stale_dns_cache] سجلات DNS المخزنة مؤقتًا قديمة/منتهية الصلاحية مستخدمة في proxy_pass](https://gixy.io/plugins/stale_dns_cache/)
- [[status_page_exposed] يضمن عدم تعريض status_page للعالم الخارجي](https://gixy.io/plugins/status_page_exposed/)
- [[try_files_is_evil_too] توجيه `try_files` ضار بدون open_file_cache](https://gixy.io/plugins/try_files_is_evil_too/)
- [[unanchored_regex] تعبيرات نمطية غير مثبّتة](https://gixy.io/plugins/unanchored_regex/)
- [[unnamed_groups] مجموعات التقاط غير مسماة في سلسلة استعلام rewrite](https://gixy.io/plugins/unnamed_groups/)
- [[valid_referers] none/blocked في valid_referers](https://gixy.io/plugins/valid_referers/)
- [[version_disclosure] استخدام قيم غير آمنة لـ server_tokens](https://gixy.io/plugins/version_disclosure/)
- [[worker_rlimit_nofile_vs_connections] يجب أن تكون قيمة `worker_rlimit_nofile` ضعف قيمة `worker_connections` على الأقل](https://gixy.io/plugins/worker_rlimit_nofile_vs_connections/)
هل لم يتم اكتشاف شيء ما؟ يُرجى فتح [issue](https://github.com/MegaManSec/Gixy-Next/issues) على GitHub مع ذكر ما هو مفقود!
## الاستخدام (الأعلام)
يقرأ `gixy` افتراضيًا إعدادات NGINX الخاصة بالنظام من `/etc/nginx/nginx.conf`. يمكنك أيضًا تحديد الموقع بتمريره إلى `gixy`:
```shell-session
# Analyze the configuration in /opt/nginx.conf
gixy /opt/nginx.conf
```
يمكنك تشغيل مجموعة فرعية مركّزة من الفحوصات باستخدام `--tests`:
```shell-session
# Only run these checks
gixy --tests http_splitting,ssrf,version_disclosure
```
أو تخطَّ بعض الفحوصات المزعجة باستخدام `--skips`:
```shell-session
# Run everything except these checks
gixy --skips low_keepalive_requests,worker_rlimit_nofile_vs_connections
```
لإبلاغ عن المشكلات ذات مستوى خطورة معين أو أعلى فقط، استخدم العلامة التراكمية `-l`:
```shell-session
# -l for LOW severity issues and higher, -ll for MEDIUM and higher, and -lll for only HIGH severity issues
gixy -ll
```
بشكل افتراضي، يكون ناتج `gixy` ملوّنًا بترميز ANSI؛ ويُفضّل عرضه في طرفية متوافقة. يمكنك استخدام العلامة `--format` (`-f`) مع القيمة `text` للحصول على ناتج غير ملوّن:
```shell-session
$ gixy -f text
==================== Results ===================
Problem: [http_splitting] Possible HTTP-Splitting vulnerability.
Description: Using variables that can contain "\n" may lead to http injection.
Additional info: https://gixy.io/plugins/http_splitting/
Reason: At least variable "$action" can contain "\n"
Pseudo config:
include /etc/nginx/sites/default.conf;
server {
location ~ /v1/((?<action>[^.]*)\.json)?$ {
add_header X-Action $action;
}
}
==================== Summary ===================
Total issues:
Informational: 0
Low: 0
Medium: 0
High: 1
```
يمكنك أيضًا استخدام `-f json` للحصول على مخرجات JSON قابلة للقراءة آليًا وقابلة لإعادة الإنتاج:
```shell-session
$ gixy -f json
[{"config":"\nserver {\n\n\tlocation ~ /v1/((?<action>[^.]*)\\.json)?$ {\n\t\tadd_header X-Action $action;\n\t}\n}","description":"Using variables that can contain \"\\n\" or \"\\r\" may lead to http injection.","file":"/etc/nginx/nginx.conf","line":4,"path":"/etc/nginx/nginx.conf","plugin":"http_splitting","reason":"At least variable \"$action\" can contain \"\\n\"","reference":"https://gixy.io/plugins/http_splitting/","severity":"HIGH","summary":"Possible HTTP-Splitting vulnerability."}]
```
يمكنك أيضًا استخدام `-f sarif` للحصول على سجل [SARIF 2.1.0](https://sarifweb.azurewebsites.net/)، على سبيل المثال لرفعه إلى فحص شفرة GitHub:
```shell-session
# Write a SARIF report to a file, e.g. for `github/codeql-action/upload-sarif`
gixy -f sarif -o gixy-results.sarif
```
يمكن العثور على مزيد من الخيارات للاستخدام عبر تمرير `--help` إلى `gixy`. يمكنك أيضًا العثور على مزيد من المعلومات في [دليل الاستخدام](https://gixy.io/usage/).
## خيارات التكوين والإضافات
تُتيح بعض الإضافات خيارات يمكنك ضبطها عبر خيارات سطر الأوامر (CLI) أو ملف تكوين. يمكنك قراءة المزيد عنها في [دليل التكوين](https://gixy.io/configuration/).
## Gixy-Next لأمن NGINX والامتثال
على عكس تشغيل `nginx -t` الذي يتحقق من الصياغة فقط، يقوم Gixy-Next فعليًا بتحليل تكوينك ويكتشف الحالات غير المحصّنة والثغرات.
باستخدام Gixy-Next، يمكنك إجراء مراجعة أمنية آلية لتكوين NGINX يمكن تشغيلها محليًا عند كل تغيير، سواء لأغراض التدقيق أو الامتثال أو الاختبار العام، مما يساعد في إنتاج نتائج قابلة للتنفيذ تساعد على منع خوادم NGINX غير المستقرة/البطيئة، وتقليل المخاطر الناتجة عن التوجيهات غير الآمنة والإعدادات الافتراضية غير الآمنة.
## المساهمة
يُشرف [Joshua Rogers](https://joshua.hu) على صيانة Gixy-Next، لكن المساهمات مرحّب بها دائمًا! يمكنك مساعدتنا بطرق مختلفة، مثل:
- الإبلاغ عن الأخطاء.
- اقتراح إضافات جديدة للكشف.
- تحسين الوثائق.
- إصلاح الشيفرة وإعادة هيكلتها وتحسينها وكتابة شيفرة جديدة.
قبل إرسال أي تغييرات في طلبات السحب (pull requests)، يُرجى قراءة وثيقة إرشادات المساهمة، [المساهمة في Gixy-Next](https://gixy.io/contributing/).
الصفحة الرئيسية الرسمية لـ Gixy-Next هي [https://gixy.io/](https://gixy.io/). ستنعكس أي تغييرات تُجرى على الوثائق في Gixy-Next تلقائيًا على ذلك الموقع.
يمكن العثور على الشيفرة المصدرية في [https://github.com/MegaManSec/Gixy-Next](https://github.com/MegaManSec/Gixy-Next).
## ما هو Gixy؟ (خلفية)
_Gixy_ هو محلّل لتكوين NGINX تم تطويره [في الأصل](https://github.com/yandex/gixy) بواسطة Andrew Krasichkov من Yandex. صدر لأول مرة في عام 2017 ومنذ ذلك الحين أصبح بلا صيانة. لا يدعم الإصدارات الحديثة من Python، ويحتوي على العديد من الأخطاء، وهو محدود في وظائفه وقدرته على اكتشاف تكوينات NGINX المعرّضة للثغرات. سيؤدي تشغيل Gixy الأصلي اليوم على نظام حديث إلى الخطأ التالي:
```text
File "gixy/core/sre_parse/sre_parse.py", line 61, in <module>
"t": SRE_FLAG_TEMPLATE,
^^^^^^^^^^^^^^^^^
NameError: name 'SRE_FLAG_TEMPLATE' is not defined. Did you mean: 'SRE_FLAG_VERBOSE'?
```
Gixy-Next، إذن، هو fork يضيف دعمًا للأنظمة الحديثة، ويضيف فحوصات جديدة، وتحسينات في الأداء، واقتراحات تقوية، ودعمًا لإصدارات Python وNGINX الحديثة.
### لماذا لا `gixy-ng`؟
Gixy-Next هو في الواقع fork من `gixy-ng`، والذي كان بدوره fork من `gixy` الأصلي. أُنشئ Gixy-Next بعد أن بدأ مشرف `gixy-ng` في إنتاج كميات كبيرة من التغييرات المدعومة بالذكاء الاصطناعي والكود المولّد تلقائيًا، والتي كانت كبيرة بشكل يتعذر مراجعته فضلًا عن كونها معطوبة.
بعد مرور بعض الوقت، بدأ مشرف `gixy-ng` في إيداع تغييرات مولّدة بالذكاء الاصطناعي في قاعدة الكود، والتي أدخلت انحدارات واضحة، وكسرت السلوك الحرج للأداة (وهو ما كان سيلاحظه أي شخص يستخدم الأداة)، وأضافت مخلفات عشوائية من أدوات الذكاء الاصطناعي، وأدخلت كودًا ببساطة لا يفعل ما كان من المفترض أن يفعله. والأهم من ذلك، أن المشرف أيضًا **أضاف تسويقًا لعمله إلى جميع الوثائق، وجميع المخرجات، وجميع الكود المصدري** الخاص بـ `gixy-ng`.
بعبارة أخرى، أخذ مشرف `gixy-ng` نسخة `gixy` الأصلية، وطلب من الذكاء الاصطناعي إجراء تغييرات، فأدخل مجموعة من الأخطاء (وغيرها من نفايات الذكاء الاصطناعي)، ثم أضاف إعلانات إلى الكود. كما قبل المساهمات في شكل طلبات دمج، لكنه حذف معلومات المؤلف (انظر [هذا](https://joshua.hu/gixy-ng-new-version-gixy-updated-checks#quality-degradation) المنشور و[هذا](https://joshua.hu/gixy-ng-ai-slop-gixy-next-maintained) المنشور).
يركز Gixy-Next على استعادة الجودة، وقد خضع لاختبارات ميدانية على إعدادات NGINX يبلغ طولها قرابة 100,000 سطر. فهو يصلح الأخطاء وسوء الاكتشافات التي أدخلتها التغييرات في `gixy-ng`، ويزيل مخلفات/نفايات أدوات الذكاء الاصطناعي، ويحاول الحفاظ على قاعدة الكود قابلة للمراجعة والصيانة. هذا الـ fork مخصص لمن يهتم بالكود النظيف وقابلية الصيانة على المدى الطويل.