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

سجل التدقيق

يجيب سجل التدقيق في 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، وتصدير مساحة العمل والترحيل) في هذا السجل نفسه في الإصدار القادم.

الأعمدة

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

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

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

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

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

تفاصيل الإدخال

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

تُدرَج المعلومات التي تضع التغيير في سياقه دون أن تكون جزءًا منه — العنوان الحالي للبوابة وما إذا كانت منشورة، وما إذا استُبدلت بيانات اعتماد الاتصال، والأنواع التي يشملها تعيين الترحيل — تحت السياق أسفل الجدول.

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

تصدير 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 يعود المسؤول إلى دوره
access.audit_log.exported يصدّر أحدهم سجل الأمان إلى CSV

رموز السبب في 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.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.* الموجودة

ما لا يُسجَّل

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

مدة الاحتفاظ

تُحفَظ الإدخالات لمدة 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 رموز السبب والقيم القديمة/الجديدة، مع إخفاء الأسرار مسبقًا

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

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

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

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