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