سجل التدقيق¶
يجيب سجل التدقيق في 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.