
Salesforce object access auditor
صدر كمصدر مفتوح من قبل NCC Group Plc - https://www.nccgroup.com/
طوّره جيروم سميث @exploresecurity (مع الشكر لفيكتور جازداغ @wucpi)
https://www.github.com/nccgroup/raccoon
صدر بموجب رخصة AGPL - يُرجى الرجوع إلى LICENSE لمزيد من المعلومات.
تحدّد هذه الأداة أيّ الملفات التعريفية (Profiles) ومجموعات الصلاحيات (Permission Sets) (التي لديها مستخدمون نشطون) تمتلك مجموعةً ما من صلاحيات القراءة/التحرير/الحذف على جميع السجلات لمجموعة معيّنة من الكائنات، وذلك بناءً على إعدادات المشاركة والإعدادات الفعّالة الخاصة بها. ومن هذا المخرَج، يمكن التحقيق في الأخطاء الإعدادية التي قد تسمح بوصول مفرط إلى كائنات تحتوي على بيانات حسّاسة. راجع مقالة المدوّنة المرافقة للخلفية على https://research.nccgroup.com/2021/06/28/are-you-oversharing-in-salesforce.
يُنصح بالتحقق من النتائج يدويًا بالرجوع المباشر إلى إعدادات Salesforce و/أو اختبار الملفات التعريفية ومجموعات الصلاحيات المتأثرة. إذا وُجدت أيّ تباينات، فيُرجى فتح مشكلة مع أكبر قدر ممكن من التفاصيل.
المتطلبات:
requests الخاصة ببايثون (مغطّاة في requirements.txt)username + password + (اختياري) token أو sessionId (مزيد من التفاصيل في قسم المصادقة).أنشئ ملف إعدادات بصيغة JSON (أو استخدم config.json كقالب) واملأه حسب الحاجة:
{
"hostname": "somewhere.my.salesforce.com",
"username": "",
"password": "",
"token": "<optional token>",
"sessionId": "",
"objects": ["Account", "Contact"],
"checkLimits": true,
"debug": "<optional debug level (0, 1 or 2)>"
}
objects هي قائمة بكائنات Salesforce المهمة (أي البيانات التي تهتم بها أكثر). استخدام أسماء واجهة البرمجة الرسمية هو الطريقة الأكثر موثوقية، ولكن إذا لم يتم العثور على تطابق، سيحاول Raccoon بعض التطابقات البسيطة بناءً، على سبيل المثال، على التسمية المعروضة. إذا استمر Raccoon في الفشل في العثور على تطابق، فسيُكمل البرنامج عملَه لكنه سيُشير إلى ذلك في المخرَج.
يتيح لك checkLimits التحقق من حصّة استدعاءات واجهة البرمجة المتبقية للمؤسسة قيد الفحص خلال الفترة المتدحرجة البالغة 24 ساعة. يقوم Raccoon بإجراء عدد قليل نسبيًا من الاستدعاءات لكل كائن (بالإضافة إلى عدد ثابت لكل تشغيل)، ولكن، كمجاملة، تتيح لك هذه المعلمة التحقق من حدودك قبل المتابعة. القيمة الافتراضية هي true. العدد الإجمالي للطلبات المتبقية المحتملة عند نقطة الفحص ليس مؤكدًا لأن عدد الاستدعاءات سيعتمد على عدد الكائنات التي لديها نموذج مشاركة 'Controlled by Parent'. الرقم المذكور يفترض أنها جميعًا كذلك، وهو بالتالي رقم أقصى.
قم بالتشغيل:
git clone https://github.com/nccgroup/raccoon
pip3 install -r requirements.txt
python3 raccoon.py <config_file>
عند استخدام اسم مستخدم وكلمة مرور، لاحظ أنه قد تكون هناك حاجة أيضًا إلى رمز أمان (إذا كان الاتصال من عنوان IP خارج أي نطاقات الوصول إلى الشبكة المعرّفة). راجع هذه المقالة لمزيد من المعلومات.
استخدام بديل معرف الجلسة مفيد في كثير من الحالات:
للحصول على معرف الجلسة:
sid: تأكد من أخذ ذلك الذي تتضمن سمة Domain الخاصة به my.salesforce.com أو cloudforce.comمثال على المخرَج (مختصر ومجهول المصدر):
Raccoon - Salesforce object access auditor
- version 1.0
- https://www.github.com/nccgroup/raccoon
* Refer to README for usage notes including important limitations *
Target instance: somewhere.my.salesforce.com
- Login successful
4,969,529 API requests can be sent to this instance from a 24-hour limit of 5,000,000
- Up to 33 further requests are required to complete (3 requests sent so far)
- Do you want to continue? Enter 'y' to proceed: y
Validating objects
- Found object 'Accounts' with API name 'Account'
- Found object 'Contact' with API name 'Contact'
- Found object 'Quotes' with API name 'Quote__c'
- Found object 'Quote Lines' with API name 'QuoteLine__c'
Evaluating 28 Profiles and 104 Permission Sets
- Profiles with active users: 15
- Permission Sets with active users: 67
- Ignoring 50 unused Profiles and Permission Sets
Global Sharing Overrides (ALL records for ALL objects)
------------------------------------------------------
READ/EDIT/DELETE [C]ustom Active/Total [G]uest[E]xt[I]nt
Profiles
- System Administrator 61/91 [I]
READ
Profiles
- Integration User [C] 1/1 [I]
- Analytics Cloud Integration User 1/1 [I]
Object Sharing (ALL records for EACH object)
--------------------------------------------
Account:
Organization-wide default sharing
- Internal: Public Read Only
- External: <Undefined>
READ/EDIT/DELETE [C]ustom Active/Total [G]uest[E]xt[I]nt
Profiles
- Integration User [C] 1/1 [I]
Permission Sets (* Groups)
- Mulesoft Integration [C] 2/2 [I]
READ
Profiles
- Read Only [C] 192/199 [I]
- Sales User [C] 192/248 [I]
- Finance User [C] 16/20 [I]
- Standard User 6/3075 [I]
Permission Sets (* Groups)
* Accounts PS Group [C] 36/39 [I]
- Sales Operations [C] 24/26 [I]
- SharePoint User [C] 3/4 [I]
Sharing Rules (manual check required):
- Criteria-based rules configured
- Ownership-based rules configured
Contact:
Organization-wide default sharing
- Internal: Controlled by Parent
- External: <Undefined>
Parent object: 'Account'
- Internal: Public Read Only
- External: <Undefined>
READ/EDIT/DELETE [C]ustom Active/Total [G]uest[E]xt[I]nt
Profiles
- Integration User 1/1 [I]
Permission Sets (* Groups)
- Mulesoft Integration [C] 2/2 [I]
READ
Profiles
- Read Only [C] 192/199 [I]
- Sales User [C] 192/248 [I]
- Finance User [C] 16/20 [I]
- Standard User 6/3075 [I]
Permission Sets (* Groups)
- Sales Operations [C] 24/26 [I]
Quote__c:
Organization-wide default sharing
- Internal: Public Read/Write
- External: <Undefined>
READ/EDIT [C]ustom Active/Total [G]uest[E]xt[I]nt
Profiles
- Sales User [C] 192/248 [I]
READ
Profiles
- Finance User [C] 16/20 [I]
Permission Sets (* Groups)
- Mulesoft Integration [C] 2/2 [I]
QuoteLine__c:
Organization-wide default sharing
- Internal: Controlled by Parent
- External: <Undefined>
Parent object: 'Quote__c'
- Internal: Public Read/Write
- External: <Undefined>
READ/EDIT/DELETE [C]ustom Active/Total [G]uest[E]xt[I]nt
Profiles
- Sales User [C] 192/248 [I]
READ
Profiles
- Finance User [C] 16/20 [I]
Permission Sets (* Groups)
- Mulesoft Integration [C] 2/2 [I]
Total API requests sent: 31
يدرس Raccoon فقط الملفات التعريفية ومجموعات الصلاحيات التي لديها مستخدمون نشطون لتقليل حجم مخرَجاته. يتم عرض معلومات حول ذلك، وبعدها:
إذا كان منح الصلاحيات قد تم عبر مجموعة مجموعات صلاحيات (Permission Set Group)، وليس عبر مجموعة صلاحيات واحدة، تظهر علامة النجمة كمؤشر إزاحة إلى يسار الاسم بدلًا من الشرطة المعتادة (Accounts PS Group في المخرَج النموذجي أعلاه). بالإضافة إلى ذلك، يتم أيضًا عرض ما إذا كان الملف التعريفي أو مجموعة الصلاحيات مخصصًا (custom) (بالنسبة لمجموعات الصلاحيات، يعني "مخصص" أنها "أُنشئت بواسطة مسؤول"، وإلا فهي "قياسية ومرتبطة بترخيص مجموعة صلاحيات محدد" [مرجع]).
بالنسبة لكل من المشاركة العامة ومشاركة الكائنات، يتم ترتيب الملفات التعريفية ومجموعات الصلاحيات لتعكس الاهتمام المحتمل. المستوى الأول من الترتيب يتعلق بنوع المستخدم المعيَّن - 'ضيف' (guest) (غير مصادَق) أولًا، يليه 'خارجي' (external) (أنواع مختلفة من مستخدمي البوابة) ثم 'داخلي' (internal) (أي شيء آخر). من المهم ملاحظة أن 'external' هنا مرتبط بالتعريف المستخدم في سياق 'نموذج المشاركة الخارجية' [مرجع]. الفكرة هنا هي إبراز المشاركة المفرطة المحتملة للمستخدمين غير المصادَقين أو مستخدمي البوابة. ومع ذلك، فهي تجريبية إلى حد ما لأن وثائق Salesforce ليست شاملة في قائمتها لقيم 'UserType' الصالحة لكائن 'User' [مرجع]. نتيجة لذلك، من الممكن حدوث تصنيف خاطئ - فيرجى فتح مشكلة في مثل هذه الحالة. المستوى الثاني من الترتيب يعتمد على عدد المستخدمين النشطين - الأعلى أولًا (يُعرض أيضًا العدد الإجمالي للمستخدمين المعيَّنين لأغراض المعلومات).
الهدف الأساسي لـRaccoon هو إبراز حالات الوصول الواسع النطاق إلى جميع السجلات، ويغطي:
العوامل التالية، التي تؤثر فقط على مجموعة فرعية من السجلات، لا يتم تقييمها:
كائنات معينة، مثل 'User' و'File'، لا تناسب نموذج المشاركة القياسي و/أو تدخل صلاحيات نظام أخرى. يتم الإشارة إلى الحالات المعروفة في المخرَج إذا كانت محددة في قائمة objects.
لا يتم دعم المؤسسات التي لديها أكثر من 2,000 ملف تعريفي ومجموعة صلاحيات مجتمعة بسبب قيود المنصة على استخدام 'GROUP BY' في عبارات SOQL. هذا حَدّ سخي ولا ينبغي أن يكون عائقًا إلا في الحالات القصوى.
تقوم هذه الأداة بعمليات قراءة فقط فقط. لذلك قد يكون من المفاجئ رؤية 'Modify Metadata Through Metadata API Functions' كمتطلب للحساب المستخدم لتشغيل الأداة. ومع ذلك، في وقت كتابة هذا الشرح، لا يبدو من الممكن تكوين حساب بصلاحيات قراءة فقط لواجهة برمجة تطبيقات البيانات الوصفية (Metadata API). من التوثيق:
حدد مستخدمًا لديه صلاحية API Enabled وصلاحية Modify Metadata Through Metadata API Functions أو صلاحية Modify All Data. هذه الصلاحيات مطلوبة للوصول إلى استدعاءات Metadata API. إذا كان المستخدم يحتاج إلى الوصول إلى البيانات الوصفية وليس إلى البيانات، فعِّل صلاحية Modify Metadata Through Metadata API Functions. وإلا، فعِّل صلاحية Modify All Data.
لذلك يُقترح استخدام 'Modify Metadata Through Metadata API Functions' بدلًا من 'Modify All Data'.
إذا كانت المشكلة متعلقة بتسجيل الدخول، فيُرجى أولًا التحقق مرة أخرى من اسم المضيف واسم المستخدم وكلمة المرور ورمز الأمان (إذا لزم الأمر). ضع في اعتبارك أيضًا ما إذا كانت كلمة المرور بحاجة إلى إعادة تعيين (جرّب تسجيل الدخول المعتاد عبر ويب Salesforce) لأن هذا الشرط يُرجع خطأ لا يمكن تمييزه عن تسجيل دخول غير صالح. إذا كنت تستخدم معرف جلسة، فتأكد من أنه صالح للنطاق الصحيح.
قم بتشغيل الأداة مع ضبط debug على 2، لأن المخرَج المفصّل قد يساعد في تحديد السبب. يخرج هذا المستوى أيضًا تتبّع كومة (stack trace) إلى ملف مذكور اسمه في المخرَج. إذا أبلغت عن مشكلة، فيُرجى تضمين كل من مخرَج وحدة التحكم وتتبّع الكومة (مع إخفاء البيانات الحساسة حسب الحاجة).
معروف بالبحث في الأشياء (Raccoon = راكون).