
pgaudit v19beta3
إضافة تدقيق PostgreSQL
pgAudit
تسجيل تدقيق مفتوح المصدر لـ PostgreSQL
مقدمة
توفر إضافة تدقيق PostgreSQL (pgAudit) تسجيل تدقيق تفصيلي للجلسات و/أو الكائنات عبر مرفق تسجيل PostgreSQL القياسي.
الهدف من pgAudit هو تزويد مستخدمي PostgreSQL بالقدرة على إنتاج سجلات تدقيق غالبًا ما تكون مطلوبة للامتثال للشهادات الحكومية أو المالية أو ISO.
التدقيق هو فحص رسمي لحسابات فرد أو منظمة، عادةً بواسطة هيئة مستقلة. تُسمى المعلومات التي يجمعها pgAudit بشكل صحيح مسار تدقيق أو سجل تدقيق. يُستخدم مصطلح سجل التدقيق في هذه الوثائق.
لماذا pgAudit؟
يمكن توفير تسجيل البيانات الأساسية بواسطة مرفق التسجيل القياسي مع log_statement = all. هذا مقبول للمراقبة والاستخدامات الأخرى ولكنه لا يوفر مستوى التفاصيل المطلوب عمومًا للتدقيق. لا يكفي وجود قائمة بجميع العمليات التي تم إجراؤها على قاعدة البيانات. يجب أيضًا أن يكون من الممكن العثور على عبارات معينة تهم المدقق. يظهر مرفق التسجيل القياسي ما طلبه المستخدم، بينما يركز pgAudit على تفاصيل ما حدث أثناء تلبية قاعدة البيانات للطلب.
على سبيل المثال، قد يرغب المدقق في التحقق من إنشاء جدول معين ضمن نافذة صيانة موثقة. قد يبدو هذا مهمة بسيطة لـ grep، ولكن ماذا لو تم تقديم شيء كهذا (تم إخفاؤه عمدًا):
DO $$
BEGIN
EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)';
END $$;
سيعطيك التسجيل القياسي هذا:
LOG: statement: DO $$
BEGIN
EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)';
END $$;
يبدو أن العثور على الجدول المطلوب قد يتطلب بعض المعرفة بالكود في الحالات التي يتم فيها إنشاء الجداول ديناميكيًا. هذا ليس مثاليًا حيث سيكون من الأفضل البحث فقط عن اسم الجدول. هذا هو المكان الذي يأتي فيه pgAudit. لنفس الإدخال، سينتج هذا المخرج في السجل:
AUDIT: SESSION,33,1,FUNCTION,DO,,,"DO $$
BEGIN
EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)';
END $$;"
AUDIT: SESSION,33,2,DDL,CREATE TABLE,TABLE,public.important_table,CREATE TABLE important_table (id INT)
ليس فقط كتلة DO يتم تسجيلها، ولكن العبارة الفرعية 2 تحتوي على النص الكامل لـ CREATE TABLE مع نوع العبارة ونوع الكائن والاسم المؤهل بالكامل لتسهيل عمليات البحث.
عند تسجيل عبارات SELECT و DML، يمكن تكوين pgAudit لتسجيل إدخال منفصل لكل علاقة مشار إليها في العبارة. لا حاجة للتحليل النحوي للعثور على جميع العبارات التي تلمس جدولًا معينًا. في الواقع، الهدف هو أن نص العبارة يتم توفيره بشكل أساسي للتحليل الجنائي العميق ولا ينبغي أن يكون مطلوبًا للتدقيق.
اعتبارات الاستخدام
اعتمادًا على الإعدادات، من الممكن أن يُنتج pgAudit حجمًا هائلاً من التسجيل. كن حذرًا في تحديد ما يحتاج بالضبط إلى تسجيل التدقيق في بيئتك لتجنب تسجيل الكثير.
على سبيل المثال، عند العمل في بيئة OLAP، ربما لن يكون من الحكمة تسجيل تدقيق لعمليات الإدراج في جدول حقائق كبير. سيكون حجم ملف السجل على الأرجح أكبر بعدة مرات من حجم البيانات الفعلية للإدراج لأن ملف السجل يتم التعبير عنه كنص. نظرًا لأن السجلات تُخزن عمومًا مع نظام التشغيل، فقد يؤدي ذلك إلى استنفاد مساحة القرص بسرعة كبيرة. في الحالات التي لا يمكن فيها تقييد تسجيل التدقيق لجداول معينة، تأكد من تقييم تأثير الأداء أثناء الاختبار وتخصيص مساحة كبيرة على وحدة تخزين السجل. قد يكون هذا صحيحًا أيضًا لبيئات OLTP. حتى لو لم يكن حجم الإدراج مرتفعًا، فإن تأثير الأداء لتسجيل التدقيق قد يؤثر بشكل ملحوظ على زمن الاستجابة.
لتحديد عدد العلاقات التي يتم تسجيل تدقيقها لعبارات SELECT و DML، فكر في استخدام تسجيل تدقيق الكائنات (انظر تدقيق الكائنات). يسمح تسجيل تدقيق الكائنات باختيار العلاقات التي سيتم تسجيلها مما يسمح بتقليل الحجم الإجمالي للسجل. ومع ذلك، عند إضافة علاقات جديدة، يجب إضافتها صراحةً إلى تسجيل تدقيق الكائنات. قد يكون الحل البرمجي حيث يتم استبعاد جداول معينة من التسجيل ويتم تضمين جميع الجداول الأخرى خيارًا جيدًا في هذه الحالة.
توافق إصدار PostgreSQL
يدعم pgAudit PostgreSQL 14 أو أحدث.
لدعم الوظائف الجديدة المقدمة في كل إصدار من PostgreSQL، يحتفظ pgAudit بفرع منفصل لكل إصدار رئيسي من PostgreSQL (حاليًا PostgreSQL 14 - 19) والذي سيتم صيانته بطريقة مماثلة لمشروع PostgreSQL.
بصرف النظر عن إصلاحات الأخطاء، لا يُسمح بمزيد من التطوير للفروع المستقرة. سيكون التطوير الجديد، إن وجد، بدقة للإصدار الرئيسي التالي غير المنشور من PostgreSQL.
إصدارات pgAudit تتعلق بإصدارات PostgreSQL الرئيسية على النحو التالي:
-
pgAudit v19.X يهدف إلى دعم PostgreSQL 19.
-
pgAudit v18.X يهدف إلى دعم PostgreSQL 18.
-
pgAudit v17.X يهدف إلى دعم PostgreSQL 17.
-
pgAudit v16.X يهدف إلى دعم PostgreSQL 16.
-
pgAudit v1.7.X يهدف إلى دعم PostgreSQL 15.
-
pgAudit v1.6.X يهدف إلى دعم PostgreSQL 14.
التجميع والتثبيت
يمكن تجميع pgAudit مقابل نسخة مثبتة من PostgreSQL مع حزم التطوير باستخدام PGXS. يجب أن تعمل التعليمات التالية على معظم أنظمة التشغيل الشبيهة بـ Unix.
استنساخ إضافة pgAudit:
git clone https://github.com/pgaudit/pgaudit.git
الانتقال إلى دليل pgAudit:
cd pgaudit
التحقق من فرع REL_19_STABLE (لاحظ أن الفرع المستقر قد لا يكون موجودًا للإصدارات غير المنشورة من PostgreSQL):
git checkout REL_19_STABLE
بناء وتثبيت pgAudit:
make install USE_PGXS=1 PG_CONFIG=/usr/pgsql-19/bin/pg_config
يمكن العثور على تعليمات الاختبار والتطوير في test.
الإعدادات
يمكن تعديل الإعدادات فقط بواسطة مستخدم خارق (superuser). السماح للمستخدمين العاديين بتغيير إعداداتهم سيهزم الغرض من سجل التدقيق.
يمكن تحديد الإعدادات عالميًا (في postgresql.conf أو باستخدام ALTER SYSTEM ... SET)، على مستوى قاعدة البيانات (باستخدام ALTER DATABASE ... SET)، أو على مستوى الدور (باستخدام ALTER ROLE ... SET). لاحظ أن الإعدادات لا تُورث من خلال التوريث العادي للأدوار وأن SET ROLE لن يغير إعدادات pgAudit الخاصة بالمستخدم. هذا قيد من نظام الأدوار وليس متأصلًا في pgAudit.
يجب تحميل إضافة pgAudit في shared_preload_libraries. وإلا، سيتم رفع خطأ عند وقت التحميل ولن يحدث أي تسجيل تدقيق.
بالإضافة إلى ذلك، يجب استدعاء CREATE EXTENSION pgaudit قبل تعيين pgaudit.log لضمان وظائف pgAudit الصحيحة. تقوم الإضافة بتثبيت مشغلات الأحداث (event triggers) التي تضيف تدقيقًا إضافيًا لـ DDL. سيعمل pgAudit بدون تثبيت الإضافة ولكن عبارات DDL لن تحتوي على معلومات حول نوع الكائن واسمه.
إذا تم إسقاط إضافة pgaudit وتحتاج إلى إعادة إنشائها، فيجب إلغاء تعيين pgaudit.log أولاً وإلا سيتم رفع خطأ.
pgaudit.log
يحدد أي فئات من العبارات سيتم تسجيلها بواسطة تسجيل تدقيق الجلسة. القيم الممكنة هي:
-
READ:
SELECTوCOPYعندما يكون المصدر علاقة أو استعلامًا. -
WRITE:
INSERT،UPDATE،DELETE،TRUNCATE، وCOPYعندما يكون الوجهة علاقة. -
FUNCTION: استدعاءات الدوال وكتل
DO. -
ROLE: العبارات المتعلقة بالأدوار والصلاحيات:
GRANT،REVOKE،CREATE/ALTER/DROP ROLE. -
DDL: جميع
DDLغير المضمنة في فئةROLE. -
MISC: أوامر متنوعة، مثل
DISCARD،FETCH،CHECKPOINT،VACUUM،SET. -
MISC_SET: أوامر
SETالمتنوعة، مثلSET ROLE. -
ALL: تضمين كل ما سبق.
يمكن توفير فئات متعددة باستخدام قائمة مفصولة بفواصل ويمكن طرح الفئات عن طريق وضع علامة - قبل الفئة (انظر تسجيل تدقيق الجلسة).
القيمة الافتراضية هي none.
pgaudit.log_catalog
يحدد أن تسجيل الجلسة يجب أن يتم تمكينه في حالة أن جميع العلاقات في العبارة موجودة في pg_catalog. سيؤدي تعطيل هذا الإعداد إلى تقليل الضوضاء في السجل من أدوات مثل psql و PgAdmin التي تستعلم عن الكتالوج بشكل كبير.
القيمة الافتراضية هي on.
pgaudit.log_client
يحدد ما إذا كانت رسائل السجل ستكون مرئية لعملية العميل مثل psql. يجب ترك هذا الإعداد معطلاً بشكل عام ولكنه قد يكون مفيدًا لتصحيح الأخطاء أو لأغراض أخرى.
لاحظ أن pgaudit.log_level يتم تمكينه فقط عندما يكون pgaudit.log_client هو on.
القيمة الافتراضية هي off.
pgaudit.log_level
يحدد مستوى السجل الذي سيتم استخدامه لإدخالات السجل (راجع مستويات خطورة الرسالة للمستويات الصالحة) ولكن لاحظ أن ERROR و FATAL و PANIC غير مسموح بها). يتم استخدام هذا الإعداد لاختبار الانحدار وقد يكون مفيدًا أيضًا للمستخدمين النهائيين للاختبار أو لأغراض أخرى.
لاحظ أن pgaudit.log_level يتم تمكينه فقط عندما يكون pgaudit.log_client هو on؛ وإلا سيتم استخدام الافتراضي.
القيمة الافتراضية هي log.