
Salesforce object access auditor
Von NCC Group Plc als Open Source veröffentlicht - https://www.nccgroup.com/
Entwickelt von Jerome Smith @exploresecurity (mit Dank an Viktor Gazdag @wucpi)
https://www.github.com/nccgroup/raccoon
Veröffentlicht unter AGPL - weitere Informationen siehe LICENSE.
Dieses Tool ermittelt, welche Profile und Berechtigungssätze (mit aktiven Benutzern) über eine Kombination aus Lese-/Bearbeitungs-/Löschberechtigungen für ALLE Datensätze einer bestimmten Objektmenge verfügen, basierend auf ihren effektiven Freigabe- und Objekteinstellungen. Anhand dieser Ausgabe können Fehlkonfigurationen untersucht werden, die möglicherweise übermäßigen Zugriff auf Objekte mit sensiblen Daten ermöglichen. Hintergrundinformationen finden Sie im begleitenden Blogbeitrag unter https://research.nccgroup.com/2021/06/28/are-you-oversharing-in-salesforce.
Es wird empfohlen, die Ergebnisse manuell unter direkter Bezugnahme auf die Salesforce-Konfiguration und/oder durch Testen der betroffenen Profile und Berechtigungssätze zu verifizieren. Sollten Abweichungen festgestellt werden, reichen Sie bitte ein Issue mit möglichst vielen Details ein.
Voraussetzungen:
requests (durch requirements.txt abgedeckt)username + password + (optional) token ODER sessionId angeben (weitere Details im Abschnitt Authentifizierung).Erstellen Sie eine JSON-Konfigurationsdatei (oder verwenden Sie config.json als Vorlage) und füllen Sie sie wie erforderlich aus:
{
"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 ist eine Liste der Salesforce-Objekte von Interesse (d. h. der Daten, die Ihnen am wichtigsten sind). Die Verwendung der formalen API-Namen ist die zuverlässigste Methode; sollte jedoch keine Übereinstimmung gefunden werden, versucht Raccoon einige einfache Übereinstimmungen, beispielsweise basierend auf der Anzeigebezeichnung. Falls Raccoon weiterhin keine Übereinstimmung findet, läuft das Programm weiter, weist aber in der Ausgabe darauf hin.
Mit checkLimits können Sie das verbleibende Kontingent an API-Aufrufen für die untersuchte Instanz innerhalb des 24-Stunden-Zeitraums prüfen. Raccoon tätigt relativ wenige Aufrufe pro Objekt (zusätzlich zu einer festen Anzahl pro Lauf); dieser Parameter ermöglicht es Ihnen jedoch, vor dem Fortfahren Ihre Limits zu prüfen. Der Standardwert ist true. Die Gesamtzahl der möglicherweise noch verbleibenden Anfragen am Prüfpunkt ist nicht sicher, da die Anzahl der Aufrufe davon abhängt, wie viele Objekte ein Freigabemodell 'Controlled by Parent' aufweisen. Die angegebene Zahl geht davon aus, dass alle dieses Modell verwenden, und ist daher ein Maximum.
Ausführen:
git clone https://github.com/nccgroup/raccoon
pip3 install -r requirements.txt
python3 raccoon.py <config_file>
Wenn ein Benutzername und ein Passwort verwendet werden, beachten Sie, dass möglicherweise auch ein Sicherheits-Token erforderlich ist (wenn die Verbindung von einer IP-Adresse außerhalb definierter Netzwerkzugriffsbereiche hergestellt wird). Weitere Informationen finden Sie in diesem Artikel.
Die Verwendung der Session-ID-Alternative ist in vielen Fällen nützlich:
So erhalten Sie die Session-ID:
sid-Cookies: Stellen Sie sicher, dass Sie dasjenige verwenden, dessen Domain-Attribut my.salesforce.com oder cloudforce.com enthältBeispielausgabe (gekürzt und anonymisiert):
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 untersucht nur Profile und Berechtigungssätze mit aktiven Benutzern, um die Ausführlichkeit der Ausgabe zu reduzieren. Informationen hierzu werden angezeigt, danach:
Wenn die Zuweisung von Berechtigungen über eine Berechtigungssatz-Gruppe (Permission Set Group) und nicht über einen einzelnen Berechtigungssatz erfolgt ist, erscheint links neben dem Namen ein Sternchen als Einrückungsmarkierung anstelle des üblichen Bindestrichs (Accounts PS Group in der obigen Beispielausgabe). Zusätzlich wird angezeigt, ob das Profil oder der Berechtigungssatz benutzerdefiniert ist (bei Berechtigungssätzen bedeutet benutzerdefiniert „von einem Administrator erstellt"; andernfalls ist es „standardmäßig und mit einer bestimmten Berechtigungssatz-Lizenz verknüpft" [ref]).
Sowohl bei globalen als auch bei Objektfreigaben werden Profile und Berechtigungssätze so sortiert, dass sie die wahrscheinliche Relevanz widerspiegeln. Die erste Sortierebene betrifft den Typ des zugewiesenen Benutzers – zuerst 'guest' (nicht authentifiziert), gefolgt von 'external' (verschiedene Arten von Portalbenutzern), dann 'internal' (alles andere). Es ist wichtig zu beachten, dass 'external' hier mit der Definition im Zusammenhang mit dem 'externen Freigabemodell' steht [ref]. Die Idee dahinter ist, potenziell übermäßige Freigaben für nicht authentifizierte oder Portalbenutzer hervorzuheben. Dies ist jedoch etwas experimentell, da die Salesforce-Dokumentation in ihrer Liste der gültigen 'UserType'-Werte für das 'User'-Objekt nicht vollständig ist [ref]. Daher kann es zu Fehlklassifizierungen kommen – bitte reichen Sie in einem solchen Fall ein Issue ein. Die zweite Sortierebene basiert auf der Anzahl aktiver Benutzer – die höchste zuerst (die Gesamtzahl der zugewiesenen Benutzer wird ebenfalls zur Information angezeigt).
Das Hauptziel von Raccoon ist es, Fälle von weit verbreitetem Zugriff auf alle Datensätze aufzuzeigen, und es deckt Folgendes ab:
Die folgenden Faktoren, die nur eine Teilmenge der Datensätze betreffen, werden nicht bewertet:
Bestimmte Objekte wie 'User' und 'File' passen nicht in das standardmäßige Freigabemodell und/oder andere Systemberechtigungen greifen. Bekannte Fälle werden in der Ausgabe gekennzeichnet, wenn sie in der objects-Liste angegeben sind.
Instanzen mit mehr als 2.000 kombinierten Profilen und Berechtigungssätzen werden aufgrund von Plattformbeschränkungen bei der Verwendung von 'GROUP BY' in SOQL-Anweisungen nicht unterstützt. Dies ist eine großzügige Grenze und sollte nur in den extremsten Fällen ein Hindernis darstellen.
Dieses Tool führt nur Lesevorgänge aus. Es mag daher überraschend sein, 'Modify Metadata Through Metadata API Functions' als Anforderung für das Konto zu sehen, mit dem das Tool ausgeführt wird. Zum Zeitpunkt der Erstellung dieses Textes scheint es jedoch nicht möglich zu sein, ein Konto mit reinen Leseberechtigungen für die Metadata API zu konfigurieren. Aus der Dokumentation:
Identifizieren Sie einen Benutzer, der über die Berechtigung API Enabled und die Berechtigung Modify Metadata Through Metadata API Functions oder die Berechtigung Modify All Data verfügt. Diese Berechtigungen sind erforderlich, um auf Metadata-API-Aufrufe zugreifen zu können. Wenn ein Benutzer Zugriff auf Metadaten, aber nicht auf Daten benötigt, aktivieren Sie die Berechtigung Modify Metadata Through Metadata API Functions. Aktivieren Sie andernfalls die Berechtigung Modify All Data.
Daher wird empfohlen, 'Modify Metadata Through Metadata API Functions' anstelle von 'Modify All Data' zu verwenden.
Wenn das Problem die Anmeldung betrifft, überprüfen Sie bitte zuerst den Hostnamen, Benutzernamen, das Passwort und das Sicherheits-Token (falls erforderlich) noch einmal. Ziehen Sie außerdem in Betracht, ob das Passwort zurückgesetzt werden muss (versuchen Sie die übliche Salesforce-Webanmeldung), da dieser Zustand einen Fehler zurückgibt, der von einer ungültigen Anmeldung nicht zu unterscheiden ist. Wenn Sie eine Session-ID verwenden, stellen Sie sicher, dass sie für die richtige Domäne gültig ist.
Führen Sie das Tool mit debug auf 2 gesetzt aus, da die ausführliche Ausgabe bei der Ursachenermittlung helfen kann. Diese Stufe gibt auch einen Stack-Trace in eine in der Ausgabe genannte Datei aus. Wenn Sie ein Issue melden, fügen Sie bitte sowohl die Konsolenausgabe als auch den Stack-Trace bei (anonymisieren Sie bei Bedarf).
Bekannt dafür, in Objekten herumzustöbern.