
Db أداة تقييم قاعدة البيانات
أداة تقييم قاعدة بيانات Db
يقوم DbDat بإجراء العديد من الفحوصات على قاعدة بيانات لتقييم الأمان. تشمل فئات الفحوصات التي يتم إجراؤها: التهيئة، الصلاحيات، المستخدمين، والمعلومات. يتم إجراء الفحوصات عن طريق تشغيل استعلامات أو قراءة ملفات تهيئة قاعدة البيانات. الهدف من هذه الأداة هو تسليط الضوء على المشكلات التي تحتاج إلى اهتمام فوري وتحديد إعدادات التهيئة التي ينبغي مراجعتها للتأكد من ملاءمتها. هذه الأداة ليست لتحديد ثغرات حقن SQL في تطبيق ما، فهناك أدوات جيدة متوفرة لهذا الغرض (مثل https://github.com/sqlmapproject). كما أن هذه الأداة لا تحاول تحديد الثغرات الأمنية العامة (CVEs) التي قد تؤثر على إصدار قاعدة البيانات المستهدفة (قد تفعل ذلك في المستقبل - ربما). بدلاً من ذلك، يمكن لهذه الأداة مساعدتك في فهم الأثر المحتمل لهجوم حقن SQL ناجح بسبب ضعف التهيئة أو ضوابط الوصول. غالبية الفحوصات مستمدة من معايير أمان قواعد بيانات CIS (https://cisecurity.org)، فجزيل الشكر لـ CIS! يمكن العثور على وثائق المعايير هنا: https://benchmarks.cisecurity.org/downloads/browse/index.cfm?category=benchmarks.servers.database
أوصي بشدة بتحميل وثيقة المعايير الخاصة بقاعدة بياناتك المستهدفة، حيث تحتوي على معلومات إضافية حول الفحوصات التي يتم إجراؤها.
أخيرًا، تم تصميم DbDat كإطار عمل يسهل إنشاء إضافات وفحوصات جديدة. المساهمات من مجتمع الأمن، أو حتى مسؤولي قواعد البيانات، هي ما سيجعل هذه الأداة رائعة. المجموعة الحالية من الفحوصات ليست كاملة بأي حال من الأحوال، بالتأكيد هناك حاجة للمزيد. يرجى المساهمة!
تطوير فحوصات قاعدة بيانات جديدة
طلبات السحب (Pull requests) مرحب بها جدًا! يتم تنظيم الفحوصات حسب نوع قاعدة البيانات (مثل MySQL, Oracle, MS SQL, إلخ.) في مجلد الإضافات (plugins). كل فحص هو ملف Python واحد يجب أن يبدأ اسمه بـ check_. يحتوي كل ملف على فئة (class) بطريقة do_check. هذه الطريقة هي المنطق الأساسي للفحوصات. الطريقة السريعة للبدء هي نسخ ملف فحص موجود وتعديله. ومع ذلك، راجع قسم تطوير الإضافات أدناه لمزيد من التفاصيل.
etc/dbdat.conf لكل قاعدة بيانات تريد تقييمها.python dbdat.py -p <اسم الملف التعريفي>cd ثم شغّل python -m SimpleHTTPServer 9000 (أو اختر رقم منفذ تفضله). ثم افتح متصفحك وانتقل إلى http://localhost:9000.لعرض قائمة بوسائط سطر الأوامر الإضافية، شغّل python dbdat.py -h
ينظم التقرير النتائج حسب المستويات، وهي: الأحمر، الأصفر، البرتقالي، الرمادي، والأخضر.
تم اختبار DbDat حتى الآن على Debian Linux و CentOS Linux و Windows 7 مع Python 2.7
شغّل: pip install MySQL-python
أو على Debian، شغّل: apt-get install python-mysqldb
شغّل: pip install psycopg2
شغّل: pip install cx_Oracle
ملاحظة: ستحتاج إلى تثبيت مكتبات عميل Oracle لكي يعمل هذا.
شغّل: pip install pymssql
شغّل: pip install ibm_db أو easy_install ibm_db
ملاحظة: ستحتاج إلى التأكد من أن المستخدم الذي يشغل DbDat لديه صلاحية الوصول لتنفيذ أوامر DB2 CLP (مثل db2 و db2level).
شغّل: pip install pymongo
لدعم ملفات تهيئة MongoDB بصيغة YAML، شغّل: pip install pyyaml
شغّل: pip install couchdb
داخل مجلد الإضافات يوجد مجلد لكل نوع من قواعد البيانات، وكل مجلد يحتوي على ملفات الفحص. هذا هيكل بسيط للغاية، لكن يمكنك أيضًا تصفح مجلد الإضافات للتعرف عليه https://github.com/foospidy/DbDat/tree/master/plugins
ستحتوي مجلدات قواعد البيانات على:
__init.py - يحتوي ملف التهيئة (init) على عبارة استيراد (import) لكل ملف فحص.check_ - هذه هي الملفات الفعلية التي تقوم بفحوصات قاعدة البيانات. يجب أن يكون اسم الملف والصنف (class) المعرف داخله متطابقين.helper.py - ملف يحتوي على دوال مشتركة. يمكن لملفات الفحص استيراد helper.py للاستفادة من الدوال المشتركة.عند إضافة ملف فحص جديد، يجب إضافة عبارة استيراد (import) إلى ملف __init__.py الخاص بمجلد الإضافة المناسب. نمط الكود للفحوصات ثابت إلى حد كبير. راجع الملفات الموجودة لفهم هيكلها. لاحظ الفرق بين فحوصات النوع sql و configuration_file.
هناك "أنواع" مختلفة من الفحوصات يمكن تعريفها. يتم تحديد نوع الفحص بواسطة المتغير TYPE ويمكن أن يكون: sql، configuration_file، nosql، أو clp. فيما يلي أمثلة تطبيقية لسيناريوهات أنواع الفحوصات المختلفة.
بالنسبة لفحوصات sql، يجب أن يكون توقيع الطريقة do_check كالتالي: do_check(self, *results)
https://github.com/foospidy/DbDat/blob/master/plugins/mysql/check_user_empty_password.py
في هذا المثال، نحتاج إلى المتغير appuser من الفئة الأم (parent class). يجب إضافة appuser ديناميكيًا إلى جملة SQL، لذلك يتم تعيين المتغير self.SQL في طريقة __init__. أيضًا، نظرًا لأن هذه الطريقة do_check تحتاج إلى تنفيذ SQL، فإننا نحتاج إلى مؤشر قاعدة البيانات (cursor) أيضًا، ويتم تعيينه في طريقة __init__ باستخدام self.dbcurs = parent.dbcurs.
https://github.com/foospidy/DbDat/blob/master/plugins/mysql/check_privilege_user_grants.py
بالنسبة لفحوصات configuration_file، يجب أن يكون توقيع الطريقة do_check كالتالي: do_check(self, configuration_file)
https://github.com/foospidy/DbDat/blob/master/plugins/mysql/check_configuration_general_log.py
في هذا المثال، ملف تهيئة PostgreSQL لا يحتوي على أقسام (مثل [section_name])، لذلك تحتوي الوحدة المساعدة (helper module) في مجلد PostgreSQL على دالة تتعامل مع هذا. راجع الدالة get_config_value المعرفة في helper.py.
بالنسبة لتنسيقات ملفات تهيئة أخرى، ستحتاج إلى تعريف منطق التحليل الخاص بك.
بالنسبة لفحوصات nosql، يجب أن يكون توقيع الطريقة do_check كالتالي: do_check(self)
يجب تنفيذ استعلامات NoSQL داخل الطريقة do_check، لذلك يجب أن تطبق الطريقة __init__ الصفية self.db = parent.db. يمكن بعد ذلك استخدام المتغير self.db لتنفيذ استعلامات NoSQL ضمن الطريقة do_check.
https://github.com/foospidy/DbDat/blob/master/plugins/mongodb/check_information_banner.py
بالنسبة لفحوصات clp، يجب أن يكون توقيع الطريقة do_check كالتالي: do_check(self, *results). هناك حاجة لفحوصات clp لقواعد بيانات IBM DB2 بحيث يمكن تنفيذ معالج سطر أوامر db2 للحصول على معلومات حول قاعدة البيانات. ومع ذلك، يمكن استخدام هذا النوع من الفحوصات لتنفيذ أي أمر سطر أوامر عشوائي. يمكن تحليل جميع مخرجات سطر الأوامر من المتغير results الذي يُمرر إلى الطريقة do_check. بالإضافة إلى ذلك، ستحتاج إلى تعريف طريقة الصف CMD. هذا المتغير هو قائمة بالأمر والوسائط المرتبطة به.
https://github.com/foospidy/DbDat/blob/master/plugins/db2/check_privilege_group_entitlements.py
يجب أن يحتوي كل فحص على فئة محددة باستخدام المتغير CATEGORY. الفئة هي طريقة لتنظيم الفحوصات. الفئات الممكنة هي: Information (معلومات)، Configuration (تهيئة)، Privilege (صلاحية)، و User (مستخدم). حدد الفئة الأكثر صلة بسياق الفحص.
هذا مثال تقريبي يوضح النمط الذي يجب أن يتبعه ملف الفحص:
# (اختياري): إضافة عبارات الاستيراد، تضمين أي وحدات ضرورية لدعم هذا الفحص
import helper
# (إلزامي): تعريف الصنف، يجب أن يكون اسم الصنف مطابقًا لاسم الملف.
class check_configuration_evaluate_something():
# (إلزامي): إضافة توثيق، تقديم معلومات حول هذا الفحص حيث سيتم عرضها في التقرير.
"""
check_configuration_evaluate_something:
يذهب هنا بعض الوصف!
"""
# (اختياري): إضافة مراجع، هذه مجرد تعليقات في الكود، إضافة المراجع مفيدة للآخرين.
# المراجع:
# https://www.percona.com/blog/2012/12/28/auditing-login-attempts-in-mysql/
# https://dev.mysql.com/doc/refman/5.7/en/password-security-user.html
# (إلزامي): إضافة المجموعة القياسية من المتغيرات
TITLE = 'كلمة مرور العميل'
CATEGORY = 'Configuration'
TYPE = 'configuration_file'
SQL = None
verbose = False
skip = False
result = {}
# (اختياري): إضافة أي متغيرات مخصصة خاصة بهذا الفحص
custom_var = 'custom_val'
# (إلزامي): تعريف الطريقة do_check، هذا هو منطق الفحص الفعلي ويتم استدعاؤه بواسطة البرنامج الرئيسي.
def do_check(self, *results):
# (إلزامي): يوضع هنا منطق الفحص، تأكد من تعيين قيم لـ self.result['level'] و self.result['output']
# يمكن معالجة النتائج من المتغير SQL باستخدام:
for rows in results:
for row in rows:
# (إلزامي):
# قم دائمًا بتعيين المتغيرين self.result['level'] و self.result['output'] قبل العودة.
if row[0] == 'bad':
self.result['level'] = 'RED'
self.result['output'] = 'النتيجة هي %s' % (row[0])
elif row[0] == 'needs review':
self.result['level'] = 'YELLOW'
self.result['output'] = 'النتيجة هي %s' % (row[0])
else:
self.result['level'] = 'GREEN'
self.result['output'] = 'النتيجة هي %s' % (row[0])
# قم دائمًا بإرجاع self.result
return self.result
# (إلزامي): كحد أدنى، يجب أن تطبع الطريقة __init__ الفحص الذي يتم تنفيذه.
def __init__(self, parent):
print('جارٍ تنفيذ الفحص: ' + self.TITLE)
# الحصول على القيم من الصنف الأصلي (parent)
self.verbose = parent.verbose