
Salesforce object access auditor
Выпущен как open source компанией NCC Group Plc - https://www.nccgroup.com/
Разработан Джеромом Смитом @exploresecurity (благодарности Виктору Газдагу @wucpi)
https://www.github.com/nccgroup/raccoon
Выпущен под лицензией AGPL - подробнее см. в LICENSE.
Этот инструмент определяет, какие профили и наборы разрешений (с активными пользователями) имеют некую комбинацию прав чтения/редактирования/удаления для ВСЕХ записей заданного набора объектов, исходя из их фактических настроек общего доступа и объектов. По этому результату можно исследовать ошибки конфигурации, которые потенциально допускают чрезмерный доступ к объектам, содержащим чувствительные данные. Справочные материалы см. в сопутствующей публикации в блоге: 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 (т.е. данных, которые для вас наиболее важны). Наиболее надёжный способ — использовать официальные имена API, однако, если совпадение не найдено, Raccoon попробует некоторые простые варианты сопоставления, например по отображаемой подписи. Если Raccoon по-прежнему не сможет найти совпадение, программа продолжит работу, но отметит это в выводе.
checkLimits позволяет проверить остаток лимита вызовов API для исследуемого экземпляра в рамках 24-часового скользящего периода. Raccoon выполняет относительно немного вызовов на объект (плюс фиксированное число за запуск), однако, из вежливости, этот параметр позволяет проверить лимиты перед началом работы. Значение по умолчанию — true. Общее количество возможных оставшихся запросов в контрольной точке не является точным, поскольку число вызовов зависит от того, у скольких объектов модель общего доступа 'Controlled by Parent'. Указанное число предполагает, что таких объектов все, и поэтому является максимальным.
Запуск:
git clone https://github.com/nccgroup/raccoon
pip3 install -r requirements.txt
python3 raccoon.py <config_file>
При использовании имени пользователя и пароля учтите, что также может потребоваться токен безопасности (если подключение выполняется с IP-адреса вне заданных диапазонов Network Access). Дополнительные сведения см. в этой статье.
Использование альтернативы с идентификатором сессии полезно во многих случаях:
Чтобы получить идентификатор сессии:
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 в примере выше). Кроме того, отображается, является ли профиль или набор разрешений пользовательским (для набора разрешений «пользовательский» означает «создан администратором», в противном случае он «стандартный и связан с конкретной лицензией набора разрешений» [ref]).
Как для глобального, так и для объектного общего доступа профили и наборы разрешений упорядочиваются с учётом вероятного интереса. Первый уровень упорядочения касается типа назначенного пользователя: сначала «гостевые» (неаутентифицированные), затем «внешние» (различные типы портальных пользователей) и затем «внутренние» (все остальные). Важно отметить, что «внешние» здесь связано с определением, используемым в контексте «модели внешнего общего доступа» [ref]. Идея состоит в том, чтобы выявить потенциально чрезмерный общий доступ для неаутентифицированных или портальных пользователей. Однако это несколько экспериментально, поскольку документация Salesforce не содержит исчерпывающего списка допустимых значений 'UserType' для объекта 'User' [ref]. В результате возможна ошибочная классификация — в таком случае, пожалуйста, сообщите о проблеме. Второй уровень упорядочения основан на количестве активных пользователей: сначала наибольшее (общее количество назначенных пользователей также отображается для сведения).
Основная цель Raccoon — выявлять случаи широкого доступа ко всем записям; инструмент охватывает:
Следующие факторы, влияющие только на подмножество записей, не оцениваются:
Некоторые объекты, такие как 'User' и 'File', не вписываются в стандартную модель общего доступа и/или затрагивают другие системные разрешения. Известные случаи отмечаются в выводе, если они указаны в списке objects.
Экземпляры с более чем 2000 комбинированных профилей и наборов разрешений не поддерживаются из-за ограничений платформы на использование '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'.
Если проблема связана со входом, сначала перепроверьте hostname, имя пользователя, пароль и токен безопасности (если требуется). Также учтите, не нужно ли сбросить пароль (попробуйте обычный веб-вход в Salesforce), поскольку это состояние возвращает ошибку, неотличимую от недействительного входа. Если используется идентификатор сессии, убедитесь, что он действителен для правильного домена.
Запустите инструмент с debug, установленным в 2, так как подробный вывод может помочь определить причину. Этот уровень также выводит стек вызовов (stack trace) в файл, имя которого указывается в выводе. При сообщении о проблеме, пожалуйста, приложите как вывод консоли, так и стек вызовов (при необходимости анонимизируйте).
Известен тем, что роется в объектах (rummaging around objects).