انتقل إلى المحتوى

سجل التدقيق

يجيب سجل التدقيق في Admin → Settings → Audit log (/admin/settings?tab=audit-log) عن السؤالين اللذين تطرحهما مراجعة الأمان على مثيلٍ يحتفظ بخريطة مشهد تقنية المعلومات بأكمله: ما الذي تغيّر فيه، ومن سجّل الدخول وكيف. وهو مقسّم إلى تبويبين فرعيين:

التبويب الفرعي URL ما الذي يسجّله
التغييرات /admin/settings?tab=audit-log كل كتابة في المشهد — البطاقات والعلاقات والمخاطر والوسوم وأدوار أصحاب المصلحة ومسودات القرارات — مجمّعةً في دفعات تغييرات، مع فروقات لكل حدث وزر تراجع (Rollback)
الأمان والإدارة /admin/settings?tab=audit-log&view=security عمليات تسجيل الدخول والخروج، والمحاولات الفاشلة، وعمليات القفل، وجلسات SSO والوكيل، وأحداث كلمات المرور، والعرض بصفة دور، وكل إجراء إداري

الفصل بينهما مقصود. التغييرات أداة عمل — وُجدت لتتمكّن من رؤية كتابة خاطئة والتراجع عنها — وتحتفظ بتاريخ قصير. أما الأمان والإدارة فسجلّ أدلة: لا يمكن تعديل إدخالاته ولا حذفها، ويُحتفَظ به لمدة سنة افتراضيًا.

من يمكنه الاطلاع عليه

يتطلب التبويبان الفرعيان صلاحية admin.events ("عرض مسار التدقيق وتدفق الأحداث")، ولا يملكها افتراضيًا سوى دور Admin. لمنح مسؤول أمان أو امتثال صلاحية القراءة دون جعله مسؤولًا، أنشئ دورًا يحمل admin.events ضمن المستخدمون والأدوار وأسنده إليه.

التغييرات

التبويب الفرعي التغييرات هو سجلّ دفعات التغييرات. تصل كل كتابة تُغيّر البيانات إلى هنا على هيئة دفعة، مع من قام بها ومن أين جاءت:

المصدر المعنى
Web واجهة الويب في Turbo EA
API استدعاء مباشر لواجهة REST (نص برمجي، تكامل)
أداة ذكاء اصطناعي مساعد ذكاء اصطناعي متصل عبر خادم MCP
إضافة إضافة مثبّتة، تُسجَّل بوصفها دفعة ext:<key>

انقر على دفعة لفتح لوحتها: تعرض الفروقات لكل حدث القيمة القديمة والجديدة لكل حقل، ويُعيد التراجع الكتابات التي أجرتها على البطاقات والعلاقات والمخاطر وأدوار أصحاب المصلحة والوسوم ومسودات القرارات.

تُحفَظ الدفعات لمدة MUTATION_BATCH_RETENTION_DAYS يومًا (متغير بيئة، القيمة الافتراضية 15) ثم تُطهَّر تلقائيًا. تبقى الأحداث نفسها في تبويب السجل الخاص بكل بطاقة بعد اختفاء الدفعة.

الأمان والإدارة

سجل الأمان والإدارة

يعرض التبويب الفرعي الأمان والإدارة إدخالًا واحدًا لكل إجراء متعلّق بالأمان، الأحدث أولًا:

  • عمليات تسجيل الدخول والخروج، بكلمة المرور أو SSO أو عبر وكيل عكسي موثوق؛
  • محاولات تسجيل الدخول الفاشلة، ولكل منها رمز سبب يوضّح سبب فشلها؛
  • قفل الحسابات بعد إخفاقات متكررة؛
  • عمليات التسجيل، وتعيين كلمات المرور وإعادة تعيينها وتغييرها؛
  • انتحال الأدوار — مسؤول يبدأ View as role… ثم يُنهيه؛
  • الإجراءات الإدارية — التغييرات على المستخدمين والأدوار والإعدادات والنموذج الوصفي والوسوم والحسابات والإضافات وعمليات الاستيراد والتكاملات والبوابات العامة والمخططات المنشورة والاستبيانات ووصول المشغّل (راجع الإجراءات الإدارية)؛
  • عمليات تصدير البيانات — تصدير البطاقات بصيغتي CSV وJSON وتصدير مساحة العمل والتصدير إلى منصة EA أخرى (راجع عمليات تصدير البيانات) — وعمليات تصدير هذا السجل نفسه.

الأعمدة

العمود الوصف
متى تاريخ الإجراء ووقته
الفئة auth (المصادقة)، أو admin (الإجراءات الإدارية)، أو access (التصدير وغيره من الوصول إلى البيانات)
الإجراء ما حدث، مثل auth.login.failed — راجع فهرس الإجراءات
النتيجة نجاح أو فشل
المنفِّذ المستخدم المسجَّل دخوله الذي نفّذ الإجراء. يكون فارغًا حين لا يكون أحد مسجَّل الدخول — عند فشل تسجيل الدخول مثلًا
الحساب المعني الحساب الذي تعلّق به الإجراء — عنوان البريد الإلكتروني المكتوب في محاولة دخول فاشلة، أو المستخدم الذي أُعيد تعيين كلمة مروره
الهدف الكائن الذي وقع عليه الإجراء إن وُجد — مثل الدور المختار عند بدء انتحال دور
IP عنوان IP الخاص بالعميل (راجع عنوان IP الخاص بالعميل)
المصدر مصدر الطلب: الويب، أو API، أو أداة ذكاء اصطناعي، أو إضافة، أو ops، أو النظام
الدور المنتحَل حين كان المسؤول يعرض التطبيق بدور آخر، يظهر ذلك الدور. ويبقى المنفِّذ هو المسؤول الحقيقي

يمكن إظهار الأعمدة وإخفاؤها وإعادة ترتيبها وتثبيتها كما في أي جدول بيانات آخر؛ ويظهر العمودان متى والإجراء دائمًا.

عوامل التصفية

يضيّق شريط التصفية الجانبي القائمة حسب الفئة والنتيجة والإجراء والمنفِّذ وعنوان IP ونطاق زمني. يعرض عنوان كل قسم عدد القيم المحددة، ويعرض الشريط المطوي عدد عوامل التصفية النشطة. ويُظهر تبويب الأعمدة في الشريط نفسه الأعمدة ويخفيها ويثبّتها. تُحفَظ عوامل التصفية وتخطيط الأعمدة في هذا المتصفح.

يطابق البحث عن عنوان بريد إلكتروني المنفِّذ والحساب المعني والهدف معًا، فيكفي عنوان واحد لإيجاد ما فعله ذلك الشخص وما جرت محاولته ضد حسابه.

قراءة إدخال

انقر على صف لفتح لوحة الإدخال. تعرض اللوحة كل حقل من حقول الإدخال — متى، ومن، ومن أي عنوان IP وأي متصفح — وتعرض تحت التفاصيل ما سجّله الإدخال، مكتوبًا بلغة واضحة بدلًا من المفاتيح المخزّنة:

  • التغييرات — جملة واحدة لكل تغيير. فتعديل نوع بطاقة يُقرأ مثلًا تمت إضافة الحقل «أهمية الأعمال» (اختيار واحد) إلى القسم «الحوكمة» أو تمت إعادة تسمية الخيار «مرتفع» في الحقل «أهمية الأعمال» إلى «حرج». تُسمّى الحقول والأقسام والخيارات والأدوار والبوابات بتسمياتها، والأذونات بوصفها، واللغات بأسمائها.
  • قبل / بعد — جدول بالقيم التي تغيّرت، صف لكل حقل، ويُسمّى كل حقل بتسميته. تُنسَّق القيم: نعم أو لا، والتواريخ بتنسيق التاريخ الخاص بمساحة العمل، والألوان كعيّنة لونية، وأحجام الملفات بالكيلوبايت أو الميغابايت. لا تُخزَّن الأسرار أبدًا: تُستبدل كلمة المرور أو الرمز أو سر العميل قبل كتابة الإدخال وتظهر بصفة قيمة سرية.
  • السياق — معلومات تؤطّر التغيير دون أن تكون جزءًا منه: العنوان الحالي للبوابة وما إذا كانت منشورة، وما إذا استُبدلت بيانات اعتماد اتصال، وعدد الصفوف التي شملها الاستيراد.

يعرض تسجيل الدخول الفاشل السبب فوق التفاصيل — كلمة مرور خاطئة، أو حساب غير معروف، أو حساب مقفل مؤقتًا.

تعرض الإدخالات المكتوبة قبل الإصدار 2.161.0 تفاصيلها كما سُجّلت: تظل القيم القديمة والجديدة ظاهرة في الجدول، وما لا تستطيع اللوحة قراءته يُعرض بصيغة JSON خام.

لا تتضمن اللوحة أي إجراءات. لا يمكن تعديل الإدخالات أو حذفها.

تصدير CSV

يُنزّل زر Export CSV في شريط الأدوات الإدخالات المطابقة لعوامل التصفية الحالية في ملف CSV، بحدّ أقصى 50,000 صف. ويُسجَّل التصدير نفسه بوصفه access.audit_log.exported، فيترك تصدير سجل الأمان أثرًا فيه دائمًا.

فهرس الإجراءات

الإجراء يُسجَّل عندما
auth.login.succeeded يسجّل مستخدم الدخول بالبريد الإلكتروني وكلمة المرور
auth.login.failed يُرفض تسجيل دخول بكلمة مرور. يوضّح رمز السبب السبب (انظر أدناه)
auth.login.locked تقفل المحاولة الفاشلة الخامسة على التوالي الحساب لمدة 15 دقيقة. تتضمن التفاصيل موعد انتهاء القفل
auth.logout يسجّل مستخدم مسجَّل الدخول خروجه. لا يُسجَّل شيء عند الخروج دون جلسة صالحة
auth.sso.succeeded يسجّل مستخدم الدخول عبر مزوّد SSO. تتضمن التفاصيل المزوّد، ومعرّف الحساب لدى مزوّد الهوية (subject)، وما إذا كان الحساب قد أُنشئ بهذا الدخول
auth.sso.failed يُرفض دخول عبر SSO — نطاق غير مسموح به، أو عنوان بريد إلكتروني مفقود، أو حساب محلي بالبريد نفسه، أو حساب غير نشط. تتضمن التفاصيل المزوّد والسبب
auth.proxy_session.succeeded يسجّل مستخدم الدخول عبر وكيل عكسي موثوق
auth.proxy_session.failed يُرفض دخول عبر الوكيل العكسي
auth.register ينشئ مستخدم حسابًا عبر التسجيل الذاتي
auth.password.set يعيّن مستخدم مدعو كلمة مروره الأولى
auth.password.reset_requested يطلب شخص ما بريدًا لإعادة تعيين كلمة المرور. يُسجَّل دائمًا كنجاح مع العنوان المُدخل حتى لا تكشف الاستجابة أي شيء؛ وتوضح التفاصيل ما إذا كان حساب قد تطابق وما إذا كان قد أُرسل بريد
auth.password.reset تُغيَّر كلمة مرور عبر رابط إعادة التعيين
auth.password.changed يغيّر مستخدم مسجَّل الدخول كلمة مروره بنفسه
auth.impersonation.started يبدأ مسؤول View as role…. الهدف هو الدور المختار
auth.impersonation.stopped يعود المسؤول إلى دوره

رموز السبب في auth.login.failed:

السبب المعنى
unknown_user لا يوجد حساب بهذا العنوان
sso_account يسجّل الحساب الدخول عبر SSO وليست له كلمة مرور
no_password لم تُعيَّن للحساب كلمة مرور بعد — دعوة لم تُقبَل قط
locked الحساب مقفل بعد إخفاقات متكررة
bad_password كلمة المرور خاطئة
inactive الحساب معطَّل

رموز السبب في auth.sso.failed, auth.proxy_session.failed, auth.password.set و auth.password.reset:

السبب المعنى
expired انتهى وصول الحساب المحدود زمنيًا
hd_mismatch ينتمي حساب Google إلى نطاق غير مسموح به
no_email لم يُرجع مزوّد الهوية أي عنوان بريد إلكتروني
no_subject لم يُرجع مزوّد الهوية أي معرّف للموضوع
local_account يستخدم حساب محلي بكلمة مرور هذا البريد بالفعل
no_account لا يوجد حساب، ولا تُنشأ الحسابات تلقائيًا
exchange_failed لم يُكمل مزوّد الهوية تسجيل الدخول
unauthenticated لم يُصادق الوكيل العكسي على الطلب
identity_rejected رُفضت الهوية المُمرَّرة (النطاق أو بريد غير مُتحقق منه)
invalid_token رابط الدعوة أو إعادة التعيين غير صالح أو انتهت صلاحيته

موجة من إخفاقات unknown_user من عنوان IP واحد هي شكل هجوم رشّ كلمات المرور (password spraying)؛ وسلسلة من bad_password ضد حساب واحد يتبعها auth.login.locked هي محاولة لتخمين كلمة مرور ذلك الحساب.

الإجراءات الإدارية

يُسجَّل كل تغيير يجريه المسؤول على إعداد المثيل ضمن الفئة admin. المنفِّذ هو المسؤول، والهدف هو الكائن الذي تغيّر — مستخدم أو دور أو إعداد أو نوع بطاقة — باسمه كما كان في تلك اللحظة، وتسرد التفاصيل ما تغيّر في صورة قيم قديمة وجديدة، مقتصرة على الحقول التي تغيّرت فعلًا. تنطبق قاعدتان على كل إدخال:

  • تُخفى الأسرار. تُكتب كلمة مرور SMTP وسر عميل SSO ومفتاح مزوّد الذكاء الاصطناعي وبيانات اعتماد ServiceNow وأي قيمة سرية أخرى على هيئة ***: يُظهر الإدخال أن القيمة تغيّرت، ولا يُظهر أبدًا ما كانت عليه أو ما أصبحت عليه.
  • لا يُخزَّن أبدًا نص ترخيص ولا بيانات اعتماد. يُعرَّف ترخيص الإضافات ولا يُنسخ، وتُسجَّل كلمة المرور التي يعيّنها المسؤول لمستخدم على أنها تغيّرت، ولا تُسجَّل قيمتها أبدًا.

لا يُسجَّل الحفظ الذي لا يغيّر شيئًا، ولا يُسجَّل كذلك تعديل المستخدم لاسمه أو لغته في ملفه الشخصي. يُلخَّص الإعداد الكبير — حقول نوع البطاقة أو ترجماته أو تخطيطه، ومرشحات البوابة — بحجمه بدلًا من نسخه؛ وإذا لم يتغيّر الحجم تُضاف بصمة قصيرة للمحتوى، فيظل الإدخال يبيّن أن شيئًا ما تغيّر. وتُستثنى من ذلك تجاوزات الأذونات لكل دور في نوع البطاقة: تُدرَج كل خلية تغيّرت بقيمتها القديمة والجديدة، وتعني القيمة الفارغة أن إذن الدور نفسه هو الساري.

المجال الإجراءات ما يُسجَّل
المستخدمون والأدوار admin.user.created, .updated, .deleted, .bulk_updated, .bulk_deleted, .unlocked; admin.user.invitation.resent, .deleted; admin.role.created, .updated, .archived, .restored; admin.stakeholder_role.created, .updated, .deleted, .archived, .restored الحسابات التي تُنشأ أو تُحرَّر أو تُفعَّل أو تُعطَّل أو تُحذف (فرديًا أو جماعيًا) أو يُلغى قفلها، مع الحقول التي تغيّرت — الدور والبريد الإلكتروني والاسم وحالة التفعيل؛ والدعوات المعاد إرسالها أو الملغاة؛ وأدوار التطبيق وأدوار أصحاب المصلحة لكل نوع، مع الأذونات الممنوحة أو المسحوبة
الإعدادات admin.settings.updated إدخال واحد لكل إعداد يُحفظ — البريد الإلكتروني، والمصادقة وSSO، والتسجيل، والذكاء الاصطناعي، وMCP، واللغات، ومفاتيح تشغيل الوحدات، والهوية البصرية، والشعار والأيقونة المفضلة، وفترات الاحتفاظ. الهدف هو الإعداد؛ والتفاصيل هي قيمته القديمة والجديدة مع إخفاء الأسرار
النموذج الوصفي admin.metamodel.type.* (including .references_generated), admin.metamodel.relation_type.*, admin.metamodel.resource_type.*, admin.metamodel.category.* (including .reordered), admin.principle.* (including .imported), admin.regulation.* أنواع البطاقات وأنواع العلاقات وأنواع الموارد التي تُنشأ أو تُغيَّر أو تُحذف أو تُستعاد، مع الخصائص التي تغيّرت؛ ومراجع البطاقات المُنشأة لنوع ما؛ ومبادئ هندسة المؤسسة، بما فيها المستوردة من الكتالوج؛ ولوائح الامتثال؛ وفئات أنواع البطاقات (الطبقات الهندسية) التي تُنشأ أو يُعاد تسميتها أو يُغيَّر لونها أو ترتيبها أو تُحذف
الوسوم والحسابات admin.tag_group.*, admin.tag.*, admin.calculation.* مجموعات الوسوم والوسوم؛ والحقول المحسوبة التي تُنشأ أو تُغيَّر أو تُحذف أو تُفعَّل أو تُعطَّل، مع الصيغة القديمة والجديدة، وتشغيل حساب على جميع البطاقات (.recalculated)
الإضافات admin.extension.install.uploaded, .applied, .discarded; admin.extension.store.claimed, .refreshed, .installed; admin.extension.enabled, .disabled, .uninstalled; admin.extension.license.updated, .removed الحزم التي تُرفع أو تُثبَّت أو يُتجاهل رفعها؛ والتراخيص والتنزيلات من متجر الإضافات؛ والإضافات التي تُفعَّل أو تُعطَّل أو يُلغى تثبيتها؛ والترخيص المستبدَل أو المُزال — مع الإضافة وإصدارها، ولا يُسجَّل نص الترخيص أبدًا
نقل مساحة العمل والترحيل admin.workspace.import.uploaded, .applied, .completed, .discarded; admin.migration.uploaded, .field_mappings.updated, .applied, .deleted حزمة مساحة عمل مرفوعة، وبدء استيرادها أو اكتماله أو تجاهله؛ وترحيل منصة مرفوع، وتحرير تعيينات حقوله أو تطبيقه أو حذفه
التكاملات admin.servicenow.connection.*, admin.servicenow.mapping.*, admin.servicenow.sync.pulled, .pushed, .applied اتصالات ServiceNow مع إخفاء بيانات الاعتماد، والتعيينات؛ وكل عملية سحب ودفع وتطبيق للسجلات المرحلية
الإتاحة العامة admin.web_portal.created, .updated, .deleted; admin.diagram.published, .unpublished البوابات الإلكترونية والمخططات المنشورة — كل ما يجعل البيانات متاحة دون حساب
الاستبيانات admin.survey.sent, admin.survey.closed استبيان أُرسل إلى مستلميه أو أُغلق
وصول المشغّل admin.ops.rescue_access.granted, .revoked وصول الإنقاذ الممنوح أو الملغى عبر واجهة برمجة العمليات، ويُسجَّل إلى جانب أحداث ops.* الموجودة

عمليات تصدير البيانات

في كل مرة تغادر فيها البيانات المثيل بكميات كبيرة، يسجّل إدخال من فئة access من أخذها وكم أخذ وبأي شكل. يُكتب الإدخال قبل إرسال الملف، لذا يبقى التصدير مسجَّلًا حتى لو لم يكتمل تنزيله قط.

الإجراء يُسجَّل عندما التفاصيل
access.export.cards تُصدَّر البطاقات عبر تصدير CSV أو JSON في واجهة برمجة التطبيقات (/cards/export/csv و/cards/export/json)، كما تفعل البرامج النصية والتكاملات ومساعدو الذكاء الاصطناعي format (csv أو json) وtype (نوع البطاقة أو أنواعها) وrows (عدد البطاقات). يكون الهدف نوع البطاقة عندما يشمل التصدير نوعًا واحدًا بالضبط
access.export.workspace تُنزَّل حزمة مساحة عمل كاملة — من نقل مساحة العمل، أو بواسطة مستوى تحكّم عبر واجهة برمجة العمليات، التي لا تسجّل أي فاعل وتسجّل requested_by: ops include_archived وsize_bytes
access.export.migration تُصدَّر مساحة العمل إلى منصة EA أخرى من Admin → Settings → Migration (راجع ترحيل المنصة) المنصة الهدف وinclude_archived وsize_bytes
access.audit_log.exported يصدّر أحدهم سجل الأمان إلى CSV rows

ما لا يُسجَّل

  • تجديد الرمز المميز. يجدّد تطبيق الويب جلسته وفق مؤقّت، فكل تبويب مفتوح كان سيضيف إدخالات لا يعني أيّ منها شيئًا.
  • الطلبات المرفوضة بسبب رمز جلسة منتهي الصلاحية أو غير صالح. تحدث كلما انتهت جلسة بشكل طبيعي.
  • قراءات موجزات OData. يستعلم Excel وPower BI موجز OData الخاص بعرض محفوظ وفق جدول زمني، فكل تحديث كان سيضيف إدخالًا.
  • جداول البيانات والعروض التقديمية المُنشأة في المتصفح. تُبنى تنزيلات Excel وPowerPoint من المخزون والتقارير من بيانات حمّلتها الصفحة مسبقًا، فهي قراءات وليست عمليات تصدير من الخادم.
  • الوصول للقراءة فقط — فتح بطاقة، أو تشغيل تقرير، أو البحث في المخزون.

مدة الاحتفاظ

تُحفَظ الإدخالات لمدة 365 يومًا افتراضيًا. غيّر ذلك من Admin → Settings → General → Data management → Security log retention: أي عدد من الأيام حتى 3650، أو 0 للاحتفاظ بالإدخالات إلى الأبد. تحذف مهمة مرة كل ليلة الإدخالات الأقدم من هذه المدة وتعيد قراءة الإعداد في كل تشغيل، فيسري التغيير دون إعادة تشغيل.

مهمة الاحتفاظ هذه هي الشيء الوحيد الذي يحذف إدخالًا. لا يوجد أي إجراء تعديل أو حذف في الواجهة أو في واجهة البرمجة، لأي دور.

السجل عمدًا ليس جزءًا من نقل مساحة العمل: فهو تاريخ الأمان لهذا المثيل وليس محتوى مساحة العمل، ولا يُنسَخ عند استنساخ مثيل.

تدفق التدقيق بصيغة JSON

يكتب الخادم الخلفي كل إدخال أيضًا بوصفه سطر JSON واحدًا على المُسجِّل turbo_ea.audit، في اللحظة نفسها التي يُخزَّن فيها. يكتب الخادم الخلفي سجلاته إلى المخرج القياسي، فيصل التدفق إلى كل ما يجمع سجلات حاوياتك أصلًا — docker compose logs backend، أو جمع السجلات في Kubernetes، أو أي وكيل شحن إلى SIEM — دون أي تهيئة في Turbo EA:

docker compose logs -f backend | grep turbo_ea.audit

يُكتب السطر في اللحظة التي يُسجَّل فيها الإدخال. إذا فشلت معاملة الطلب بعد ذلك، يبقى السطر دون صف في الجدول: الجدول هو السجل الرسمي، والتدفق هو البث المباشر.

يحمل كل سطر الحقول نفسها التي يحملها الإدخال:

الحقل المحتوى
audit_id، created_at معرّف الإدخال ووقت كتابته
category، action، outcome ما حدث وهل نجح
actor_user_id، actor_email من قام به
subject_email الحساب المعني
target_type، target_id، target_label ما وقع عليه الإجراء
ip، user_agent العميل
origin web أو api أو mcp أو ext أو ops أو system
impersonator_user_id، impersonated_role يُملآن حين يعرض مسؤول التطبيق بدور آخر
details حتى أربعة مفاتيح، مع إخفاء الأسرار مسبقًا: reason (رمز الإخفاق)، وchanges ({field: {old, new}})، وitems (تغييرات دلالية، {kind, …} — مثل field.added)، وcontext (معلومات بسيطة)

يحفظ شحن التدفق إلى مخزن سجلات مركزي نسخة خارج المثيل، بعيدًا عن متناول أي شخص يستطيع إدارته — وهذا ما تحتاجه مراجعة التهديدات الداخلية. راجع السجلات وتدفق التدقيق لمعرفة طريقة جمعه.

عنوان IP الخاص بالعميل

يسجّل العمود IP عنوان العميل، لا عنوان الوكيل الواقع أمام الخادم الخلفي. يضبط خادم nginx الطرفي المرفق الترويسة X-Real-IP على العنوان الذي استقبل منه الاتصال، ويقرأ الخادم الخلفي هذه الترويسة لأن صورة الخادم الخلفي المنشورة تضبط TRUST_PROXY_HEADERS=true. وتُهمَل القيمة التي ليست عنوان IP صالحًا بدلًا من تسجيلها.

  • أبقِ TRUST_PROXY_HEADERS مفعّلًا ما دام كل طلب يصل إلى الخادم الخلفي عبر nginx المرفق — وهكذا تعمل الحزمة الافتراضية ومخطط Helm وقوالب الحاويات المُدارة.
  • عطّله (TRUST_PROXY_HEADERS=false) إذا كنت تكشف حاوية الخادم الخلفي مباشرةً دون nginx المرفق أمامها: إذ يمكن للعميل حينها إرسال X-Real-IP الخاص به واختيار العنوان الذي يُسجَّل.
  • خلف موازن حِمل أو وحدة تحكّم ingress أو شبكة CDN يستقبل nginx المرفق كل اتصال من هذه الحلقة الوسيطة، لذا يسجّل من تلقاء نفسه عنوان موازن الحِمل لكل مستخدم. اضبط NGINX_TRUSTED_PROXIES على حاوية nginx كما هو موضّح أدناه.

خلف موازن حِمل

يسرد NGINX_TRUSTED_PROXIES عناوين الحلقات الوسيطة الموجودة أمام nginx المرفق، في صورة عناوين IP أو نطاقات CIDR مفصولة بفواصل أو مسافات. عندئذٍ يقرأ nginx عنوان العميل من الترويسة X-Forwarded-For التي تضيفها تلك الحلقات — ولكن فقط على اتصال قادم من أحد العناوين المدرجة — ويتخطّى كل عنوان مدرج في تلك الترويسة، فتنتهي سلسلة الوكلاء إلى أول عنوان لا يخصّك. يحلّ هذا العنوان محل عنوان الاتصال، وتنقله الترويسة X-Real-IP التي يقرؤها الخادم الخلفي دون تغيير. القيمة الفارغة، وهي الافتراضية، لا تثق بأحد.

لمعرفة القيمة، اقرأ سجل الوصول الخاص بـ nginx الطرفي (docker compose logs nginx أو kubectl logs deployment/turbo-ea-nginx أو عارض السجلات في المنصة): العنوان في بداية كل سطر هو الحلقة التي يجب الوثوق بها، والحقل الأخير بين علامتي اقتباس هو الترويسة X-Forwarded-For التي أرسلتها.

النشر مكان الضبط القيمة المعتادة
Docker Compose، والمتصفحات تصل إلى nginx مباشرةً — اتركها فارغة
Docker Compose خلف وكيل عكسي خاص بك NGINX_TRUSTED_PROXIES في .env عنوان الوكيل العكسي كما يراه nginx
Kubernetes خلف وحدة تحكّم ingress قيمة المخطط nginx.trustedProxies نطاق CIDR للـ pods في العنقود، مثل 10.244.0.0/16
AWS ECS Fargate NginxTrustedProxies / Terraform nginx_trusted_proxies نطاقات CIDR للشبكات الفرعية لموازن الحِمل
Azure Container Apps nginxTrustedProxies / Terraform nginx_trusted_proxies الشبكة الفرعية للبنية التحتية في البيئة
Google Cloud Run NGINX_TRUSTED_PROXIES في البيان / Terraform nginx_trusted_proxies العناوين التي يُظهرها سجل الوصول

اجعل القائمة ضيقة بقدر الحلقات الوسيطة نفسها. يُصدَّق كل عنوان مدرج حين يحدّد العميل، لذا فإن إدراج نطاق يتصل منه مستخدموك — كامل 10.0.0.0/8 في نشر داخلي مثلًا — سيتيح لأي منهم كتابة عنوان مختلف في السجل. ومن دون ضبط يُظهر العمود موازن الحِمل: غير مفيد، لكنه لا يُزوَّر أبدًا.

يعدّ حدّ معدل تسجيل الدخول المحاولات لكل عنوان عميل من الترويسة نفسها، لذا فهذا الإعداد خلف موازن الحِمل هو أيضًا ما يمنع محاولات شخص واحد الفاشلة من إبطاء الجميع. ينطبق ذلك على عمليات تسجيل الدخول التي تصل إلى الواجهة الخلفية عبر nginx الطرفي؛ أما خادم MCP فيسجّل الدخول إلى الواجهة الخلفية مباشرةً، لذا تظل استدعاءات تسجيل الدخول الخاصة به تتشارك عنوان حاوية MCP. يثق المفتاح الخاص بكل عميل بهذه الترويسة كما يفعل سجل التدقيق: فهو يفترض أن عمليات تسجيل الدخول لا تصل إلى الخلفية إلا عبر nginx الطرفي، وهو ما يضمنه ملف compose المرفق ومخطط Helm بعدم كشف الخلفية. يمكن لمن يستطيع الوصول إلى الخلفية مباشرة أن يختار حصته بنفسه بتعيين الترويسة؛ فأبقِ الخلفية غير مكشوفة أو عطّل TRUST_PROXY_HEADERS.