
Salesforce object access auditor
由 NCC Group Plc 以开源形式发布 - https://www.nccgroup.com/
由 Jerome Smith @exploresecurity 开发(感谢 Viktor Gazdag @wucpi)
https://www.github.com/nccgroup/raccoon
根据 AGPL 发布 - 更多信息请参阅 LICENSE。
该工具基于有效的共享和对象设置,确定哪些配置文件(Profile)和权限集(Permission Set)(具有活跃用户)对给定对象集中的所有记录具有某些读取/编辑/删除权限组合。通过此输出,可以调查那些可能允许过度访问包含敏感数据的对象的错误配置。相关背景请参阅随附的博客文章 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 允许您检查所调查实例在 24 小时滚动周期内剩余的 API 调用配额。Raccoon 对每个对象进行的调用相对较少(此外每次运行还有固定数量的调用),但出于礼貌,此参数允许您在继续之前检查您的限制。默认值为 true。检查点的可能剩余请求总数并不确定,因为调用次数将取决于有多少对象采用“Controlled by Parent”共享模型。所述数字假定所有对象都采用该模型,因此是一个最大值。
运行:
git clone https://github.com/nccgroup/raccoon
pip3 install -r requirements.txt
python3 raccoon.py <config_file>
使用用户名和密码时,请注意可能还需要安全令牌(如果来自任何已定义网络访问范围之外的 IP 地址)。更多信息请参阅这篇文章。
在许多情况下,使用会话 ID 替代方法很有用:
获取会话 ID 的方法:
sid Cookie:请确保选择其 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 仅检查具有活跃用户的配置文件(Profile)和权限集(Permission Set),以减少输出中的冗余信息。程序会显示相关信息,之后:
如果权限是通过权限集组(Permission Set Group)而非单个权限集授予的,则名称左侧会显示一个星号作为缩进标记,而不是通常的连字符(如上述示例输出中的 Accounts PS Group)。此外,还会显示该配置文件或权限集是否为自定义(对于权限集,自定义意味着“由管理员创建”,否则“是标准的,并与特定权限集许可证相关”[参考])。
对于全局共享和对象共享,配置文件与权限集的排序旨在反映可能的关注度。第一级排序依据所分配的用户类型——首先是“guest”(未认证),其次是“external”(各种类型的门户用户),然后是“internal”(其他所有用户)。需要注意的是,这里的“external”与“外部共享模型”(external sharing model)上下文中的定义相关[参考]。这样做的目的是突出未认证用户或门户用户可能存在的过度共享。然而,这在一定程度上是实验性的,因为 Salesforce 文档并未详尽列出“User”对象所有有效的“UserType”值[参考]。因此,有可能发生错误分类——如遇此类情况,请提交问题。第二级排序基于活跃用户数量——最多者优先(同时显示已分配用户总数以供参考)。
Raccoon 的主要目标是发现对所有记录进行广泛访问的情况,并涵盖:
以下因素仅影响部分记录,不进行评估:
某些对象(如“User”和“File”)不符合标准共享模型,并且/或者涉及其他系统权限。如果在 objects 列表中指定了这些已知实例,则会在输出中标记出来。
由于平台对 SOQL 语句中使用“GROUP BY”的限制,不支持超过 2,000 个配置文件与权限集组合的实例。这是一个相当宽松的限制,只应在最极端的情况下成为障碍。
该工具仅执行只读操作。因此,看到运行该工具所使用的账户需要“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 Web 登录),因为这种情况返回的错误与无效登录无法区分。如果使用会话 ID,请确保其对于正确的域有效。
将 debug 设置为 2 运行该工具,因为详细输出可能有助于确定原因。此级别还会将堆栈跟踪输出到输出中指定的文件。如果报告问题,请同时提供控制台输出和堆栈跟踪(如需要请匿名化)。
众所周知,浣熊喜欢翻找东西。